Return Inside Generator with Yield
Dalam Python 3.3, perubahan ketara telah diperkenalkan berkenaan penggunaan pulangan bersama hasil dalam fungsi penjana. Tidak seperti Python 2, di mana kod tersebut akan mencetuskan ralat, Python 3.3 membenarkannya. Walau bagaimanapun, tingkah laku berbeza daripada yang dijangkakan.
Pertimbangkan kod Python 3.3 berikut:
<code class="python">def f(): return 3 yield 2 x = f() print(x.__next__())</code>
Jika anda menjalankan kod ini, anda akan melihat pengecualian dilemparkan: StopIteration: 3. Pengecualian ini mempunyai dua aspek utama:
Jadi, apabila penjana fungsi mengandungi kedua-dua pulangan dan hasil, ia seperti menaikkan pengecualian StopIteration dengan nilai pulangan yang ditentukan. Ini bermakna penjana akan ditamatkan dan nilai yang dikembalikan akan tersedia melalui atribut nilai pengecualian.
Dalam erti kata lain, walaupun pemulangan dalam fungsi penjana sebelum ini adalah ralat, ia kini mempunyai tujuan khusus: untuk menamatkan penjana dan mengembalikan nilai melalui mekanisme pengendalian pengecualian.
Tingkah laku ini mempunyai implikasi untuk delegasi penjana menggunakan hasil baharu daripada sintaks dalam Python 3.3. Contohnya:
<code class="python">def f(): return 1 yield 2 def g(): x = yield from f() print(x) # Iterate over generator to run it for _ in g(): pass</code>
Dalam kod ini, penjana f mengembalikan 1 dan kemudian mewakilkan kepada penjana g, yang mencetak nilai yang dikembalikan. Walau bagaimanapun, anda hanya akan melihat 1 dicetak, menunjukkan bahawa pernyataan hasil menghentikan perwakilan sebelum pernyataan hasil dalam f boleh menghasilkan nilai 2.
Atas ialah kandungan terperinci Bagaimanakah Pulangan Mempengaruhi Gelagat Penjana dalam Python 3.3?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!