0
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

并且根据我的理解,第一个yield返回值改为“ Fighting!” 已经,但是为什么稍后print m它仍然显示值 5?

4

2 回答 2

2

不,您没有更改yield 5表达式使生成器产生的内容。

.send()将更改本地m 内部h()设置的内容。

会发生什么:

  • 您创建h()一个生成器函数,然后执行被冻结。
  • 你调用.next()生成器。执行被恢复,'Wen Chuan'被打印并且代码运行直到yield 5表达式。5返回并分配给全局m. 生成器再次暂停。
  • 你打电话c.send('Fighting!')。执行被恢复,'Fighting!'分配给m生成器函数中的局部变量,print m打印出来。yield 12执行时,生成器暂停并12分配给全局变量d
  • 'We will never forget the date', 5, '.', 12被打印。

此时生成器函数仍然暂停,并且生成器函数的最后一行永远不会执行。如果你再次调用.next(),then'We are together!'将被打印,生成器结束并被StopIteration提升。

于 2013-07-13T07:34:55.623 回答
1

m函数内部和外部是不同的变量,它们不会相互影响。

于 2013-07-13T07:34:43.127 回答