Python 为什么zip急切地评估其论点的要素?
使用以下定义:Python 为什么zip急切地评估其论点的要素?,python,python-3.x,zip,generator,iterable-unpacking,Python,Python 3.x,Zip,Generator,Iterable Unpacking,使用以下定义: def a(x): return x + 1 def b(x): return x + 2 [map(a,range(3)),map(b,range(3)]导致[,]。我正在尝试复制此功能,而不必构造两次range迭代器 我做了这个函数: def map_many(mappers, values): def get_many(value): for mapper in mappers: yield mapper(
def a(x):
return x + 1
def b(x):
return x + 2
[map(a,range(3)),map(b,range(3)]
导致[,]
。我正在尝试复制此功能,而不必构造两次range
迭代器
我做了这个函数:
def map_many(mappers, values):
def get_many(value):
for mapper in mappers:
yield mapper(value)
mapped_values = map(get_many, values)
return zip(*mapped_values)
做:
for my_iterator in map_many((a, b), range(3)):
print(my_iterator)
结果:
(1, 2, 3)
(2, 3, 4)
为什么我的迭代器
会被急切地评估?我本来希望它仍然是一个会被懒散地评估的迭代器(当打印出来时,它会显示为与
类似的东西)。据我所知,*
之前的映射的\u值
,解包了映射的\u值
本身(它是迭代器的迭代器),而不是通过不断调用next(mapped_values)
来解包将返回的所有迭代器
是否可以让每个
my_迭代器
保持作为迭代器并进行惰性计算,而不是转换为元组
?根据的文档,它相当于:
def zip(*iterables):
# zip('ABCD', 'xy') --> Ax By
sentinel = object()
iterators = [iter(it) for it in iterables]
while iterators:
result = []
for it in iterators:
elem = next(it, sentinel)
if elem is sentinel:
return
result.append(elem)
yield tuple(result)
如您所见,它确实会对给定的每个迭代器求值,并对每个迭代器调用next
,直到其中至少一个迭代器耗尽。从这个角度来看,您看到的是预期的行为