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

标签 python functional-programming

我试图通过使用 itertools.count() 套用 zip 来将 functools.partial 与 itertools.count 一起使用:

g = functools.partial(zip, itertools.count())

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

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

>>> x=itertools.count();
>>> list(zip("abc",x))
[('a', 0), ('b', 1), ('c', 2)]
>>> list(zip("ABC",x))
[('A', 3), ('B', 4), ('C', 5)]

但相反,我得到以下信息——注意 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')]

最佳答案

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

>>> 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() 确实与它无关。

关于python - 为什么 itertools.count() 在与 zip 一起使用时会消耗额外的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56213879/

相关文章:

Python - 有效地将数据从元组列表提取到另一个列表

python - 如何让django runserver停止记录到pycharm中的控制台

python - 尝试在程序启动后立即播放音乐

list - Erlang打印2列表

scala - Scala中的纯FP?

algorithm - 如何从递归函数中获取终止原因?

javascript - AMD 兼容的 JavaScript - 定义然后返回与只返回之间的任何区别

python - 如何在不阻塞事件循环的情况下迭代一个大列表

python - 从字典生成Python类

java - RxJava 收集() & takeUntil()