生成器中的python3 send()函数

时间:2017-08-11 05:53:30

标签: python python-3.x coroutine

根据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()时,为什么这两个步骤不应该同时发生。

1 个答案:

答案 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