yield 被 zip 调用得太频繁了?
Yield called too often by zip?
在下面的代码中,一个计数被压缩成一个包含两个元素的列表。我预计计数器会被调用两次,但它被调用了三次。为什么?
def equivalent_count(start=0, step=1):
"""From python docs for itertools.count."""
n = start
while True:
print('count in loop =', n)
yield n
n += step
c = equivalent_count()
l = [0, 1]
for i, j in zip(c, l):
pass
输出为:
count in loop = 0
count in loop = 1
count in loop = 2
zip
状态的文档,"The iterator stops when the shortest input iterable is exhausted."
因为c
的每次迭代都在l
的等效迭代之前计算,所以Python还不知道l
已经用完了。如果您也将 l
替换为生成器,您会看到这一点:
def gen_l(lst):
for l in lst:
print 'gen_l called'
yield l
c = equivalent_count()
l = gen_l([0, 1])
for i, j in zip(c, l):
pass
输出:
count in loop = 0
gen_l called
count in loop = 1
gen_l called
count in loop = 2
交换 c
和 l
:
for i, j in zip(l, c):
pass
只打印两张:
count in loop = 0
count in loop = 1
现在 l
首先被耗尽并且 next(c)
不会像您的版本那样被调用第三次。
在下面的代码中,一个计数被压缩成一个包含两个元素的列表。我预计计数器会被调用两次,但它被调用了三次。为什么?
def equivalent_count(start=0, step=1):
"""From python docs for itertools.count."""
n = start
while True:
print('count in loop =', n)
yield n
n += step
c = equivalent_count()
l = [0, 1]
for i, j in zip(c, l):
pass
输出为:
count in loop = 0
count in loop = 1
count in loop = 2
zip
状态的文档,"The iterator stops when the shortest input iterable is exhausted."
因为c
的每次迭代都在l
的等效迭代之前计算,所以Python还不知道l
已经用完了。如果您也将 l
替换为生成器,您会看到这一点:
def gen_l(lst):
for l in lst:
print 'gen_l called'
yield l
c = equivalent_count()
l = gen_l([0, 1])
for i, j in zip(c, l):
pass
输出:
count in loop = 0
gen_l called
count in loop = 1
gen_l called
count in loop = 2
交换 c
和 l
:
for i, j in zip(l, c):
pass
只打印两张:
count in loop = 0
count in loop = 1
现在 l
首先被耗尽并且 next(c)
不会像您的版本那样被调用第三次。