Python 为什么itertools.count()与zip一起使用时会消耗额外的元素?

Python 为什么itertools.count()与zip一起使用时会消耗额外的元素?,python,functional-programming,Python,Functional Programming,我试图将functools.partial与itertools.count结合使用,方法是将zip与itertools.count()结合使用: 当使用“abc”、“abc”等输入调用g时,我注意到itertools.count()神秘地“跳跃” 我想我应该得到与直接使用zip和itertools.count()相同的结果?比如: 但是,我得到了如下结果——注意,第二次调用g时的起始索引是4,而不是3: >>> g = functools.partial(zip, iterto

我试图将functools.partial与itertools.count结合使用,方法是将zip与itertools.count()结合使用:

当使用“abc”、“abc”等输入调用g时,我注意到itertools.count()神秘地“跳跃”

我想我应该得到与直接使用zip和itertools.count()相同的结果?比如:

但是,我得到了如下结果——注意,第二次调用g时的起始索引是4,而不是3:

>>> g = functools.partial(zip, itertools.count())
>>> list(g("abc"))
[(0, 'a'), (1, 'b'), (2, 'c')]
>>> list(g("ABC"))
[(4, 'A'), (5, 'B'), (6, 'C')]

如果在函数中封装
itertools.count()
,很容易看出原因:

def count():
    c = itertools.count()
    while True:
        v = next(c)
        print('yielding', v)
        yield v

g = functools.partial(zip, count())
list(g("abc"))
输出是

yielding 0
yielding 1
yielding 2
yielding 3
[(0, 'a'), (1, 'b'), (2, 'c')]
您将看到
zip
将在意识到第二个iterable中没有任何其他内容之前,对
count()
中的下一个参数求值(因此产生了一个额外的值
3


作为练习,反转参数,您将看到计算结果有点不同。

请注意,如果原始代码使用参数的顺序与修改后的代码相同,则会得到相同的结果:

>>> x = itertools.count()
>>> list(zip(x, "abc"))
[(0, 'a'), (1, 'b'), (2, 'c')]
>>> list(zip(x, "ABC"))
[(4, 'A'), (5, 'B'), (6, 'C')]
zip()。。。当其中一个筋疲力尽时停止

在上面的拼写中,
“abc”
用尽后,它返回到第一个参数,并从
x
获取
3
。但是它的第二个参数已经用尽了,因此
zip()
停止,而
3
则会自动丢失

然后转到第二个
zip()
,从
x
获取
4


partial()。。。但是巨大的风扇。谢谢你的服务!
yielding 0
yielding 1
yielding 2
yielding 3
[(0, 'a'), (1, 'b'), (2, 'c')]
>>> x = itertools.count()
>>> list(zip(x, "abc"))
[(0, 'a'), (1, 'b'), (2, 'c')]
>>> list(zip(x, "ABC"))
[(4, 'A'), (5, 'B'), (6, 'C')]