![](/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.