Python:理解生成器中的产量分配

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)

这是一个正确的理论吗?有关其工作原理的更多详细信息?

use*_*ica 5

但随后,即使已经执行了,message 的值也变成了10from !Nonemessage = yield objects[count]

否。已生成值,但在send调用之前,表达式的值yield objects[count]尚未确定或分配给message。生成器的执行在该行的执行过程中暂停。(请记住,表达式的值yield与其生成的值不同。)

x.send(10)调用使yield表达式获取值10,并且该值就是分配给的值message

  • 太棒了,这正是我所缺少的。 (2认同)