根据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'
那么为什么x变量保持'无'的显示我通过c.send(100)向它发送100?看来,右边的yield表达式分两步工作:首先它返回生成器调用者的值,第二个返回生成器内发送函数的参数。如果在发送(42)之前添加额外的下一个(c),我将得到预期的行为,并且程序打印'100'。从文档中我不清楚,当我调用send()时,为什么这两个步骤不应该同时发生。
答案 0 :(得分:1)
来自文档: value参数成为当前yield表达式的结果。 send()方法返回生成器产生的下一个值。
假设我们有以下无限生成器:
def infgen():
a = 0
while True:
a = yield a
a += 1
generato = infgen()
generato.send(None)
输出:0
.send(None)几乎与next()相同
现在我们有了a = 0的第一个值,并且
代码在此处停止 a =产生a
值变为当前收益表达式的结果
屈服表达式是 yield a 。屈服表达式的结果是 a
generato.send(5)
.send(5),我们将5发送到发生器中的 a ,然后继续:
屈服表达式的结果是 a = 5
a = 5
a + = 1
转到a = 5 + 1 = 6的while循环
然后停止并产生a ,其中a为6
输出:6