【发布时间】:2018-01-19 12:55:55
【问题描述】:
根据docs,send()函数:
"恢复执行并将一个值“发送”到生成器函数中。value 参数成为当前 yield 表达式的结果。send() 方法返回生成器生成的下一个值,如果生成器生成,则引发 StopIteration退出而不产生另一个值。当调用 send() 来启动生成器时,必须以 None 作为参数调用它,因为没有 yield 表达式可以接收该值。"
但我不明白,为什么“值参数成为当前yield表达式的结果”在下面的例子中没有发生:
def gen():
yield 1
x = (yield 42)
print(x)
yield 2
>>>c=gen() #create generator
>>>next(c) #prints '1' and stop execution, which is caused by yield 1
>>>c.send(100) #prints '42', because 'The send() method returns the next value yielded by the generator'
>>>next(c) #prints 'None' and '2'
尽管我通过 c.send(100) 向它发送了 100,但为什么 x 变量保持“无”? 看起来,右侧的 yield 表达式分两步工作:首先它返回生成器调用者的值,第二个它返回生成器内部发送函数的参数。如果在发送(42)之前添加额外的下一个(c),我会得到预期的行为并且程序打印'100'。从文档中我不清楚,为什么当我调用 send() 时这两个步骤不应该同时发生。
【问题讨论】:
标签: python python-3.x coroutine