2015-09-19 43 views
0

我正在使用返回生成器的库。有没有办法从一个特定的迭代开始,而不使用多个next()声明?在Python生成器中避免多个Next()语句

在一个简单的for循环中,我可以做到以下几点。

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

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

在一个发生器中,我无法如上所示。相反,我将不得不使用多个下一个()语句从第3个索引开始。当试图做for循环时,我得到一个错误,表示“生成器不可编写脚本”。

+0

如果你可以控制发生器的创建方式,你可以简单地从你想要的元素开始yielding。否则根据定义必须计算前面的值(例如:斐波纳契数列的生成器)。 – metatoaster

回答

4

itertools.islice这样做,但实际上,它只是为您反复调用next(尽管在CPython中的C层,因此它比手动执行更快)。

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

是的,你可以使用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值。

+0

谢谢你的澄清。您的解决方案也适用。 – dreamzboy

+0

很高兴我能帮到你。 –