gpt4 book ai didi

python - 为什么 zip 急切地评估其参数的元素?

转载 作者:行者123 更新时间:2023-12-03 20:53:34 25 4
gpt4 key购买 nike

使用以下定义:

def a(x):
return x + 1

def b(x):
return x + 2
[map(a, range(3)), map(b, range(3)]结果 [<iterator>, <iterator>] .我正在尝试复制此功能而无需构建 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)

为什么是 my_iterator急切评价?我原以为它仍然是一个会被懒惰评估的迭代器(当打印时,它会显示为类似 <iterator> 的东西)。 *之前 mapped_values ,据我所知,解包 mapped_values本身(它是迭代器的迭代器),而不是解包通过不断调用 next(mapped_values) 返回的所有迭代器。 .

是否可以每个 my_iterator保留为迭代器并延迟计算,而不是转换为 tuple ?

最佳答案

根据 zip 的文档,它等价于:

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。在它们中的每一个上,直到其中至少一个耗尽。从这个角度来看,您看到的是预期的行为。

关于python - 为什么 zip 急切地评估其参数的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61883275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com