避免在 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
值。
我正在使用 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
值。