gpt4 book ai didi

python - `zip()` 中生成器的额外 next() ?

转载 作者:行者123 更新时间:2023-12-03 21:45:05 25 4
gpt4 key购买 nike

鉴于,

import itertools as it
def foo():
idx = 0
while True:
yield idx
idx += 1

k = foo()
当我使用 zip()如下所示,
>>> list(zip(k,[11,12,13]))
[(0, 11), (1, 12), (2, 13)]
然后紧接着,
>>> list(zip(k,[11,12,13]))
[(4, 11), (5, 12), (6, 13)]
请注意,第二个 zip 应该以 (3,11) 开头。但它跳到 (4,11)反而。好像还有一个隐藏的 next(k)某处。当我使用 it.islice 时不会发生这种情况
>>> k = foo()
>>> list(it.islice(k,6))
[0, 1, 2, 3, 4, 5]
通知 it.islice没有错过 3学期。
我正在使用 Python 3.8。

最佳答案

zip基本上(并且必须,考虑到迭代器协议(protocol)的设计)是这样工作的:

 # zip is actually a class, but we'll pretend it's a generator
# function for simplicity.
def zip(xs, ys):
# zip doesn't require its arguments to be iterators, just iterable
xs = iter(xs)
ys = iter(ys)
while True:
x = next(xs)
y = next(ys)
yield x, y
无法判断 ysxs 的元素之前用尽被消耗,并且迭代器协议(protocol)没有为 zip 提供方法放 x xs中的“返回”如果 next(ys)引发 StopIteration异常(exception)。

关于python - `zip()` 中生成器的额外 next() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64866654/

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