![](/img/trans.png)
[英]Different results in Python v 3.5.2 and v 2.7.12, but the v 2.7.12 is correct?
[英]Different behavior of generators in python-2.7.12 and python-3.5.2
对于下面的代码,生成器在python2和python3中的行为有所不同。
def g1():
for i in range(3):
print("in g1: {}".format(i))
yield i
def g2():
for i in range(3):
print("in g2: {}".format(i))
yield 2*i
def g3(f1,f2):
for (i,(x,y)) in enumerate(zip(f1,f2)):
print("in g3: {} ---- {},{}".format(i,x,y))
yield (x,y)
h1 = g1()
h2 = g2()
h3=g3(h1,h2)
print(list(h3))
输出python2
in g1: 0
in g2: 0
in g1: 1
in g2: 1
in g1: 2
in g2: 2
in g3: 0 ---- 0,0
in g3: 1 ---- 1,2
in g3: 2 ---- 2,4
[(0, 0), (1, 2), (2, 4)]
输出python3
in g1: 0
in g2: 0
in g3: 0 ---- 0,0
in g1: 1
in g2: 1
in g3: 1 ---- 1,2
in g1: 2
in g2: 2
in g3: 2 ---- 2,4
[(0, 0), (1, 2), (2, 4)]
为什么会这样? 需要python3行为。 这可以在python2中实现吗?
在Python 2中, zip
不是懒惰的并且返回一个列表,完全消耗它的参数。 但是,您可以使用itertools
izip
模拟Python 3行为:
from itertools import izip
...
for (i,(x,y)) in enumerate(izip(f1,f2)):
...
在2.7.15, zip
更改为izip
,代码输出:
in g1: 0
in g2: 0
in g3: 0 ---- 0,0
in g1: 1
in g2: 1
in g3: 1 ---- 1,2
in g1: 2
in g2: 2
in g3: 2 ---- 2,4
[(0, 0), (1, 2), (2, 4)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.