Python 3.3
我写了这段有点神秘的 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]
如果我在列表构造器中使用生成器推导式,我会得到不同的结果:
>>> 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]
为什么列表推导式没有返回列表?
Python 2.7
在Python 2中,我可以通过使用集合推导式(因为列表推导式具有奇怪的范围)来获得类似的奇怪效果:>>> {(yield i) for i in range(5)}
<generator object <setcomp> at 0x0000000004A06120>
>>> list(_)
[0, 1, 2, 3, 4, {None}]
当使用生成器表达式时:
>>> list((yield i) for i in range(5))
[0, None, 1, None, 2, None, 3, None, 4, None]
那个{None}
是从哪来的?
yield
在这里并不是必需的,直接用[ j for i in range(5) for j in (i, i+1, i) ]
即可达到预期效果。 - Alfe