你可以做類型檢查,但你可能不想檢查只是發電機。你真正想要的是檢查'迭代器',或者說,你需要兩個迭代器。
import collections, itertools
def cheap_tee(foo):
if isinstance(foo, collections.Iterator):
# this is already an iterator, we need to 'tee' it
return itertools.tee(foo)
elif isinstance(foo, collections.Iterable):
# this is already an iterable, get two iterators from it:
return iter(foo), iter(foo)
raise TypeError("Don't know how to cheaply copy these", foo)
這將然後任何即遠程迭代,不只是生成器表達式工作。某些類型將提供自定義迭代器,這些自定義迭代器在數據結構上工作,這些數據結構不容易用生成器表達式或生成器表示,或者在C中作爲迭代器實現。也可以提供__copy__
機制,itertools.tee
實際上可以使用,並且不會複製工作,或者。只有當它的'真的已經是一個迭代器,tee
不能爲你複製它將使用空間,爲你做所有的結晶。
爲什麼你想要檢查它呢? – ThiefMaster
isgenerator我認爲更多的是一個函數(這沒有被稱爲),而isinstance通常是指一個instanciated生成器已返回或構建的東西(這就是我的2C在這件事上) –
@ThiefMaster:公平的問題,顯然類型檢查到在Python中避免。我有一個函數,在99%的時間內通過一個列表迭代兩次。在發電機通過的1%時間內,我需要先將它列爲清單,然後再做這個清單。 – HorseloverFat