我正在使用返回生成器的库。有没有办法从一个特定的迭代开始,而不使用多个next()声明?在Python生成器中避免多个Next()语句
在一个简单的for循环中,我可以做到以下几点。
array = [2, 5, 1, 4, 3]
for i in array [2:]:
# do something
在一个发生器中,我无法如上所示。相反,我将不得不使用多个下一个()语句从第3个索引开始。当试图做for循环时,我得到一个错误,表示“生成器不可编写脚本”。
我正在使用返回生成器的库。有没有办法从一个特定的迭代开始,而不使用多个next()声明?在Python生成器中避免多个Next()语句
在一个简单的for循环中,我可以做到以下几点。
array = [2, 5, 1, 4, 3]
for i in array [2:]:
# do something
在一个发生器中,我无法如上所示。相反,我将不得不使用多个下一个()语句从第3个索引开始。当试图做for循环时,我得到一个错误,表示“生成器不可编写脚本”。
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(可迭代,停止)
itertools.islice(可迭代,启动,停止[步骤])
的第一个参数总是可迭代的,那么如果只传入2个参数,则第二个参数将被解释为stop
索引(独占,意味着它不会返回stop
索引e字元素)。
如果有3或4个参数,则将第二个参数视为开始索引(index),将第三个参数视为stop
(不包括),并且如果指定了第四个参数,则将其视为step
值。
谢谢你的澄清。您的解决方案也适用。 – dreamzboy
很高兴我能帮到你。 –
如果你可以控制发生器的创建方式,你可以简单地从你想要的元素开始yielding。否则根据定义必须计算前面的值(例如:斐波纳契数列的生成器)。 – metatoaster