gpt4 book ai didi

python - 为什么 itertools.islice 的 Python 版本不起作用?

转载 作者:太空宇宙 更新时间:2023-11-03 11:06:33 25 4
gpt4 key购买 nike

我注意到 itertools 文档中的 Recipes 部分有一些有用的代码,比如 consume,但我发现了一个问题。

from itertools import islice
numbers = iter(range(10))
for i in numbers:
print i
next(islice(numbers, 3, 3), None)

上面的代码工作正常,它打印 [0,4,8]next(islice(numbers, 3, 3), None) 技巧被采用来自 consume 食谱。

我们可以看到islice在这里发挥了重要的作用。但是,当我将 itertools.islice 替换为该函数的 python 文档中提供的代码时,代码无法按预期工作:

#from itertools import islice

def islice(iterable, *args):
# islice('ABCDEFG', 2) --> A B
# islice('ABCDEFG', 2, 4) --> C D
# islice('ABCDEFG', 2, None) --> C D E F G
# islice('ABCDEFG', 0, None, 2) --> A C E G
s = slice(*args)
it = iter(xrange(s.start or 0, s.stop or 200, s.step or 1))
nexti = next(it)
for i, element in enumerate(iterable):
if i == nexti:
yield element
nexti = next(it)


numbers = iter(range(10))
for i in numbers:
print i
next(islice(numbers, 3, 3), None)

输出与上面的输出不同; 范围内的所有 数字都被打印出来,islice() consume 行似乎没有做任何事情。

谁能解释为什么会这样以及 islice 在这里的工作方式?

最佳答案

切片开始和停止参数相等,因此对 xrange 的 next(it) 调用引发 StopIteration:

>>> s = slice(3, 3, None)
>>> it = iter(xrange(s.start or 0, s.stop or 200, s.step or 1))
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

slice() 生成器函数立即终止。这是合乎逻辑的,xrange() 函数在这种情况下不会产生任何数字。

itertools 文档是说明性的,并不意味着完整。您发现了一个边缘案例,其中示例 Python 代码的工作方式与 C 实现的工作方式不同。

要使 Python 代码也适用于这种情况,请捕获 StopIteration 异常,并在循环中显式测试边缘情况:

def islice(iterable, *args):
s = slice(*args)
it = iter(xrange(s.start or 0, s.stop or 200, s.step or 1))
try:
nexti = next(it)
consume = False
except StopIteration:
if s.start < 1:
return
nexti = s.start - 1
consume = True
for i, element in enumerate(iterable):
if i == nexti:
if consume:
return
yield element
nexti = next(it)

Python示例代码使用了一个slice()对象,使代码更紧凑,更易于阅读; C 代码执行自己的开始、停止和步进解析,并自行处理计数而不是委托(delegate)给 xrange(),因此不会遇到这种边缘情况。

关于python - 为什么 itertools.islice 的 Python 版本不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17906351/

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