2015-09-19 46 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

很高興我能幫到你。 –