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

Tro*_*yvs 4 python yield generator return-value send

我正在尝试生成器的发送功能,我期待发送会改变正在产生的值,所以我尝试了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
Run Code Online (Sandbox Code Playgroud)

好吧,我想我对"发送"真正做了什么,如何纠正它有错误的理解?

nie*_*mmi 6

你正在屈服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()
Run Code Online (Sandbox Code Playgroud)

输出:

Before start
Generator started
0
value is: 5
6
value is: None
7
Run Code Online (Sandbox Code Playgroud)

更新:sendnext称为首次发电机从开始执行到第一个yield在该点的值返回给调用者的发言.这就是为什么value is:第一次通话时看不到文字的原因.当第二次sendnext第二次调用时,执行从中恢复yield.如果send被调用,则由yield语句返回给定的参数,否则yield返回None.