Sah*_*and 0 python yield generator
这是一个无限循环程序,我添加了行号打印以方便跟踪程序执行。
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))
Run Code Online (Sandbox Code Playgroud)
输出是:
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
Run Code Online (Sandbox Code Playgroud)
我不明白的是"executing send 1st time"打印之前发生了什么。b程序刚刚输出,可能是通过message = yield objects[count]中的行输出infinite_looper的。但随后,即使已经执行了,message 的值也变成了10from !我唯一的理论是,yield 关键字的工作方式是在执行后执行“停留”在其行上,并且对循环器的语句可以使同一行(在本例中)再次执行。否则,我们会有:Nonemessage = yield objects[count]sendmessage = yield objects[count]
executing send 1st time
row 42
The message is **None**
Run Code Online (Sandbox Code Playgroud)
这是一个正确的理论吗?有关其工作原理的更多详细信息?
但随后,即使已经执行了,message 的值也变成了
10from !Nonemessage = yield objects[count]
否。已生成值,但在send调用之前,表达式的值yield objects[count]尚未确定或分配给message。生成器的执行在该行的执行过程中暂停。(请记住,表达式的值yield与其生成的值不同。)
该x.send(10)调用使yield表达式获取值10,并且该值就是分配给的值message。
| 归档时间: |
|
| 查看次数: |
831 次 |
| 最近记录: |