我正在使用返回生成器的庫。有沒有辦法從一個特定的迭代開始,而不使用多個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