Menggunakan Pulangan dan Hasil Bersama dalam Penjana Python
Dalam Python 2, pernyataan pulangan di dalam fungsi penjana yang turut menggunakan hasil akan menghasilkan satu kesilapan. Walau bagaimanapun, dalam Python 3.3, perubahan halus berlaku.
Demonstrasi Kod
Pertimbangkan kod Python 3.3 berikut:
<code class="python">def f(): return 3 yield 2 x = f() print(x.__next__())</code>
Penjelasan
Dalam kod ini, fungsi f merangkumi kedua-dua pernyataan pulangan dan pernyataan hasil. Apabila fungsi dipanggil, pernyataan pulangan dilaksanakan terlebih dahulu, dan nilai 3 dikembalikan. Akibatnya, pernyataan hasil tidak dilaksanakan.
Apabila penjana x diulang dengan memanggil kaedah seterusnyanya, pengecualian StopIteration dinaikkan dengan nilai 3. Ini bermakna bahawa iterator generator telah habis, dan nilai yang dikembalikan oleh pernyataan pulangan tersedia sebagai atribut nilai pengecualian.
Mekanisme Baharu dalam Python 3.3
Menurut PEP 380 , tingkah laku ini ialah ciri baharu yang diperkenalkan dalam Python 3.3. Ia bersamaan dengan menulis:
<code class="python">def f(): yield 3 raise StopIteration</code>
Contoh dengan Hasil daripada
Contoh berikut menunjukkan cara tingkah laku ini mempengaruhi penjana yang diwakilkan menggunakan hasil daripada sintaks:
<code class="python">def f(): return 1 yield 2 def g(): x = yield from f() print(x) # g is still a generator so we need to iterate to run it: for _ in g(): pass</code>
Dalam kes ini, hasil daripada penyata mewakilkan kepada penjana f. Memandangkan f mengembalikan nilai tetapi tidak mempunyai lagi pernyataan hasil, nilai 1 dicetak. Walau bagaimanapun, pernyataan hasil 2 dalam f tidak dilaksanakan.
Atas ialah kandungan terperinci Bagaimanakah Pemulangan dan Hasil Bekerja Bersama dalam Penjana Python 3.3?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!