为什么收益率回报值会改变?

时间:2013-07-13 07:32:26

标签: python generator yield

def h():  
    print 'Wen Chuan',
    m = yield 5 # Fighting!  
    print m  
    d = yield 12  
    print 'We are together!'  
c = h()  
m = c.next() #m gets the value of yield 5
d = c.send('Fighting!') #d gets the value of yield 12
print 'We will never forget the date', m, '.', d

请检查上面的代码。 它的运行结果如下:

>>> ================================ RESTART ================================
>>> 
Wen Chuan Fighting!
We will never forget the date 5 . 12

根据我的理解,第一个收益率返回值更改为“Fighting!”已经,但为什么以后print m仍显示值5?

2 个答案:

答案 0 :(得分:2)

不,你没有改变yield 5表达式使生成器生成的内容。

.send()会更改m 中的本地h() 仅设置为的内容。

会发生什么:

  • 您创建h(),生成器函数,并冻结执行。
  • 您在生成器上调用.next()。恢复执行,打印'Wen Chuan'并运行代码直到yield 5表达式。系统会返回5并将其分配给全局m。发电机再次暂停。
  • 您致电c.send('Fighting!')。执行恢复,'Fighting!'被分配给生成器函数中的局部变量mprint m打印出来。 yield 12已执行,生成器已暂停,12已分配给全局变量d
  • 'We will never forget the date', 5, '.', 12已打印。

此时,生成器功能仍处于暂停状态,并且永远不会执行生成器功能的最后一行。如果您再次致电.next(),则会打印'We are together!',生成器结束并StopIteration将被提升。

答案 1 :(得分:1)

函数内外的

m是不相互影响的不同变量。