避免在 Python 生成器中使用多个 Next () 语句

Avoid Multiple Next () Statement in Python Generator

我正在使用 returns 生成器的库。有没有一种方法可以在不使用多个 next () 语句的情况下从特定迭代开始?

在一个简单的 for 循环中,我可以执行以下操作。

array = [2, 5, 1, 4, 3]

for i in array [2:]:
    # do something

在生成器中,我不能像上面那样做。相反,我将不得不使用多个 next () 语句从第 3 个索引开始。当尝试执行与 for 循环相同的操作时,我收到一条错误消息,指出 "generator is not scriptable."

itertools.islice 这样做,但实际上,它只是一遍又一遍地为您调用 next(尽管在 CPython 中是在 C 层,所以它比手动调用更快)。

for i in itertools.islice(mygenerator, 2, None):
    # do something

是的,你可以使用 itertools.islice() ,它可以根据需要对生成器进行切片 -

>>> def a():
...     for i in range(10):
...             yield i
...
>>>
>>>
>>> x = a()
>>> import itertools
>>> for i in itertools.islice(x, 2, None):
...     print(i)
...
2
3
4
5
6
7
8
9

请注意,虽然您不是手动执行多个 next() ,但它是由 islice() 在内部完成的。在迭代之前,您无法到达所需的索引(islice 只是为您做这件事,而不是您必须编写多个 next() 等)。


itertools.islice的签名是-

itertools.islice(iterable, stop)
itertools.islice(iterable, start, stop[, step])

第一个参数总是可迭代的,然后如果你只传入 2 个参数,第二个参数被解释为 stop 索引(独占,这意味着它不会 return stop 索引元素).

如果有 3 或 4 个参数,则第二个参数被视为起始索引(index),第三个参数被视为 stop(不包括),如果指定了第四个参数,则其被视为step 值。