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

问题描述 投票:4回答:1

使用以下定义:

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

使用以下定义:def a(x):返回x + 1 def b(x):返回x + 2 [map(a,range(3)),map(b,range(3)]结果为[ ]。我正在尝试复制...

python python-3.x zip generator iterable-unpacking
1个回答
0
投票

根据zip的文档,相当于:

© www.soinside.com 2019 - 2024. All rights reserved.