python "send"方法不会更改"next"的值?



我正在尝试生成器的发送函数,我期望发送会改变正在生成的值,所以我在 ipython 中尝试了:

In [17]: def z(n):
...:     i=0
...:     while(i<n):
...:         val=yield i
...:         print "value is:",val
...:         i+=1
...:
In [24]: z1=z(10)
In [25]: z1.next()
Out[25]: 0
In [26]: z1.send(5) # I was expecting that after "send", output value will become "5"
value is: 5
Out[26]: 1
In [27]: z1.next()
value is: None # I was expecting that z1.next() will restart from "6" because I sent "5"
Out[27]: 2

好吧,我想我对"发送"的真正作用有错误的理解,如何纠正它?

你产生了i但你没有将语句yield返回值分配给它。如果分配返回值,您将看到预期的输出:

def z(n):
print 'Generator started'
i=0
while(i<n):
val=yield i
print "value is:",val
if val is not None:
i = val
i+=1
z1=z(10)
print 'Before start'
print z1.next()
print z1.send(5)
print z1.next()

输出:

Before start
Generator started
0
value is: 5
6
value is: None
7

更新:当第一次调用sendnext时,生成器从开始执行到第一个yield语句,此时值将返回给调用方。这就是为什么第一次调用时看不到value is:文本的原因。第二次调用sendnext时,将从yield恢复执行。如果调用send则由yield语句返回给定的参数,否则yield返回None

最新更新