ここでは、プログラム実行のトレースを容易にするために行番号を追加した無限ルーパを示します。Python:ジェネレータでのyield assignmentの理解
def infinite_looper(objects):
count = 0
print("row 35")
while True:
print("row 37")
if count >= len(objects):
count = 0
print("Row 40")
message = yield objects[count]
print("row 42")
print("The message is "+str(message))
print("row 44")
if message != None:
count = 0 if message < 0 else message
print("row 47, count = "+str(count))
else:
count += 1
print("row 50")
print("Row 51")
x = infinite_looper("abcdefghijkl")
print("executing next 1st time")
print(next(x))
print("executing next 2nd time")
print(next(x))
print("executing send 1st time")
print(x.send(10))
出力は次のようになります。
executing next 1st time
row 35
row 37
Row 40
a
executing next 2nd time
row 42
The message is None
row 44
row 50
Row 51
row 37
Row 40
b
executing send 1st time
row 42
The message is 10
row 44
row 47, count = 10
Row 51
row 37
Row 40
k
私は理解していない何"executing send 1st time"
が印刷される前に何が起こるかです。 b
は、おそらくmessage = yield objects[count]
行のinfinite_looper
にプログラムから出力されたばかりです。しかし、message = yield objects[count]
が既に実行されていても、メッセージの値は10
からNone
に変更されます。私の唯一の理論は、yieldキーワードが実行された後に実行がその行にとどまり、ルーパに対するsend
文が同じ行(この場合はmessage = yield objects[count]
)を再び実行できるようにすることです。それ以外の場合、次のようになります。
executing send 1st time
row 42
The message is **None**
これは正しい理論ですか?これの仕組みの詳細は?
鮮やかな、私が欠けていた作品です。 – Sahand