簡體   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