Python:了解生成器中的yield赋值

时间:2017-08-22 16:48:04

标签: python generator yield

这是一个无限的循环器,我添加了行号打印,以方便跟踪程序执行。

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行。但是,即使10已经执行,消息的值也会从None更改为message = yield objects[count]!我唯一的理论是yield关键字的工作方式是执行后执行“停留”在它的行上,而looper的send语句可以生成相同的行(在这种情况下{{1再次执行。否则,我们会:

message = yield objects[count]

这是正确的理论吗?关于它如何工作的更多细节?

1 个答案:

答案 0 :(得分:3)

  

但是,即使10已经执行,消息的值也会从None更改为message = yield objects[count]

没有。已生成一个值,但在send调用之前,yield objects[count]表达式的值尚未确定或已分配给message。生成器的执行在执行线路的中途暂停。 (请记住,yield表达式的值与它产生的值不同。)

x.send(10)调用会导致yield表达式获取值10,该值将分配给message