Cha*_*ley 18 python yield assignment-operator
这个代码,包括赋值和yield运算符,如何工作?结果相当混乱.
def test1(x):
for i in x:
_ = yield i
yield _
def test2(x):
for i in x:
_ = yield i
r1 = test1([1,2,3])
r2 = test2([1,2,3])
print list(r1)
print list(r2)
Run Code Online (Sandbox Code Playgroud)
输出:
[1, None, 2, None, 3, None]
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
Jer*_*own 15
赋值语法("yield expression")允许您将生成器视为基本协程.
首先在PEP 342中提出并在此处记录:https://docs.python.org/2/reference/expressions.html#yield-expressions
使用生成器的客户端代码可以使用其send()方法将数据传回发生器.可以通过赋值语法访问该数据.
send()也将迭代 - 所以它实际上包括一个next()电话.
使用您的示例,这就是使用couroutine功能的方式:
>>> def test1(x):
... for i in x:
... _ = yield i
... yield _
...
>>> l = [1,2,3]
>>> gen_instance = test1(l)
>>> #First send has to be a None
>>> print gen_instance.send(None)
1
>>> print gen_instance.send("A")
A
>>> print gen_instance.send("B")
2
>>> print gen_instance.send("C")
C
>>> print gen_instance.send("D")
3
>>> print gen_instance.send("E")
E
>>> print gen_instance.send("F")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Run Code Online (Sandbox Code Playgroud)
请注意,由于yield每个循环迭代中的第二个不捕获发送的数据,因此某些发送丢失.
编辑:
忘了解释None你的例子中得到的结果.
来自https://docs.python.org/2/reference/expressions.html#generator.next:
当使用next()方法恢复生成器函数时,当前yield表达式始终求值为None.
next() 在使用迭代语法时使用.
_ = yield i
yield _
Run Code Online (Sandbox Code Playgroud)
首先,它yield人民共同引用的值i,例如1。然后得出yield操作返回的值None。它在循环的每次迭代中执行此操作。
for i in x:
_ = yield i
Run Code Online (Sandbox Code Playgroud)
这简单地yield是通过引用的值i,例如1,然后进行循环的下一个迭代,生成2,然后3。
不同于return,yield关键字可以在表达式中使用:
x = return 0 # SyntaxError
x = yield 0 # perfectly fine
Run Code Online (Sandbox Code Playgroud)
现在,当解释器看到a时yield,它将生成指示的值。但是,这样做时,该操作将返回值None,就像value 一样mylist.append(0)或print('hello')会返回returnvalue None。当您将该结果分配给诸如的引用时_,您将保存该结果None。
所以,在第一个片段,你得到一个对象,然后您保存的“结果” yield的操作,这是None,然后你yield说None。在第二个代码段中,您产生一个对象,然后保存该yield操作的“结果” ,但从未获得yield该结果,因此None不会出现在输出中。
请注意,yield并非总是会返回None-这只是您使用发送给生成器的结果send()。由于在这种情况下那没什么,您得到了None。有关更多信息,请参见此答案send()。
| 归档时间: |
|
| 查看次数: |
6375 次 |
| 最近记录: |