2017-08-22 8 views
0

ここでは、プログラム実行のトレースを容易にするために行番号を追加した無限ルーパを示します。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** 

これは正しい理論ですか?これの仕組みの詳細は?

答えて

2

しかし、その後、メッセージの値はmessage = yield objects[count]がすでに実行されているにもかかわらずNoneから10に変更されました!

号値が得られてきたが、sendコールまで、yield objects[count]式の値はmessageに決定または割り当てられていません。ジェネレータの実行は、ラインの実行の途中で中断されます。 (yield式の値は、それが生み出す価値と同じではないことに注意してください。)

x.send(10)呼び出しが値10を取るためにyield発現を引き起こす、その値はmessageに割り当てられているものです。

+0

鮮やかな、私が欠けていた作品です。 – Sahand

関連する問題