我构建了这个有点神秘的python 3.3:
>>> [(yield from (i, i + 1, i)) for i in range(5)]
<generator object <listcomp> at 0x0000008666D96900>
>>> list(_)
[0, 1, 0, 1, 2, 1, 2, 3, 2, 3, 4, 3, 4, 5, 4]
Run Code Online (Sandbox Code Playgroud)
如果我在列表构造函数中使用生成器理解,我会得到不同的结果:
>>> list((yield from (i, i + 1, i)) for i in range(5))
[0, 1, 0, None, 1, 2, 1, None, 2, 3, 2, None, 3, 4, 3, None, 4, 5, 4, None]
Run Code Online (Sandbox Code Playgroud)
为什么列表理解不返回列表?
我可以在python 2中得到类似的奇怪效果(使用集合理解,因为列表推导具有奇数范围):
>>> {(yield …Run Code Online (Sandbox Code Playgroud) 我正在玩生成器和生成器表达式,我不完全确定我理解它们是如何工作的(一些参考资料):
>>> a = (x for x in range(10))
>>> next(a)
0
>>> next(a)
1
>>> a.send(-1)
2
>>> next(a)
3
Run Code Online (Sandbox Code Playgroud)
所以看起来好像generator.send被忽略了.这是有道理的(我猜)因为没有明确的yield表达式来捕获发送的信息......
然而,
>>> a = ((yield x) for x in range(10))
>>> next(a)
0
>>> print next(a)
None
>>> print next(a)
1
>>> print next(a)
None
>>> a.send(-1) #this send is ignored, Why? ... there's a yield to catch it...
2
>>> print next(a)
None
>>> print next(a)
3
>>> a.send(-1) #this send …Run Code Online (Sandbox Code Playgroud)