Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Pulangan Mempengaruhi Gelagat Penjana dalam Python 3.3?

Bagaimanakah Pulangan Mempengaruhi Gelagat Penjana dalam Python 3.3?

Barbara Streisand
Barbara Streisandasal
2024-10-24 17:16:02675semak imbas

How does Return Affect Generator Behavior in Python 3.3?

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:

  • StopIteration is Raised: Pernyataan pulangan di dalam fungsi generator kini bersamaan dengan menaikkan StopIteration().
  • Nilai Boleh Diakses melalui Pengecualian: Nilai yang dikembalikan (dalam kes ini, 3) boleh diakses melalui atribut nilai objek pengecualian.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn