繁体   English   中英

python-2.7.12和python-3.5.2中生成器的不同行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM