def countdown(n):
print "conunting down form" ,n
while n>=0:
print "first n:",n
newvalue=(yield n)
print "second n:",n
print "first newvalue",newvalue
if newvalue is not None:
n=newvalue
else:
n-=1
print "second newvalue",newvalue
c=countdown(5)
for n in c:
# print n
if n==5:
c.send(3)
输出结果:
conunting down form 5
first n: 5
second n: 5
first newvalue 3
second newvalue 3
first n: 3
second n: 3
first newvalue None
second newvalue None
first n: 2
second n: 2
first newvalue None
second newvalue None
first n: 1
second n: 1
first newvalue None
second newvalue None
first n: 0
second n: 0
first newvalue None
second newvalue None
这个期间发送的send值是不是改变了n的值,是不是会继续进行n=3的迭代?
如果没有send操作,newvalue的值应该为None。send(3)作为(yield 5)的返回值,赋值给newvalue,所以n为3.从而导致后续的变化。值得注意的是yield n 会做为整个函数的返回值,而 newvalue = yield n,newvalue为None。
应该是send(3)
作为(yield 5)
的返回值,赋值给newvalue。所以操作完后newvalue==3,后续的n=newvalue
导致n发生变化。