Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么zip急切地评估其论点的要素?_Python_Python 3.x_Zip_Generator_Iterable Unpacking - Fatal编程技术网

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