python中任意的物件,只要它定義了可以返回乙個迭代器的__iter__
方法,或者定義了可以支援下標索引的__getitem__
方法,那麼它就是乙個可迭代物件。簡單來說,可迭代物件就是能提供迭代器的任意物件,但可迭代物件本身並不一定是乙個迭代器。
任意物件,只要定義了next
(python2) 或者__next__
方法,它就是乙個迭代器。迭代完畢後繼續呼叫__next__
方法會產生乙個stopiteration
異常。for迴圈即通過自動捕捉這個異常來停止迭代的。
相關內建函式
a = iter([1,2,3])
a.__next__()
next(a)
a.__next__()
# 輸出:12
3
生成器也是一種迭代器,但是只能對其迭代一次。通過使用「for」迴圈,或者傳遞給任意可以進行迭代的函式和結構來遍歷它們。大多數時候生成器是以函式配合yield
來實現的,可以將yield
看成一種特殊的return
,每次會順序返回乙個新值。
def
func
():yield
1yield
2yield
3a = func()
a.__next__()
a.__next__()
a.__next__()
# 輸出:12
3
生成器使用場景
因為它們並沒有把所有的值存在記憶體中,而是在執行時生成值。因此特別適合不想同一時間將所有計算出來的大量結果集分配到記憶體當中時的場景,特別是當結果集裡還包含迴圈的時候。
# 計算斐波那契數列的生成器
deffibon
(n):
a = b = 1
for i in range(n):
yield a
a, b = b, a + b
for x in fibon(1000000):
print(x)
了解完以上知識後,以一段綜合**進行下總結。
# fei類中實現了__iter__方法,成為乙個可迭代的類
class
fei:
@staticmethod
# 計算斐波那契數列的生成器
deffibon
(n):
a = b = 1
for i in range(n):
yield a
a, b = b, a + b
# 返回乙個計算前100斐波那契數列的生成器
def__iter__
(self):
return fei.fibon(100)
a = fei()
# 使用for迴圈來遍歷fei類物件a
for i in a:
print(i)
Python 高階特性 生成器和迭代器
生成器generator 目的 list容量太大佔太多記憶體而操作時卻僅僅訪問前幾個元素,generator可以通過迴圈不斷推算出後面的元素,邊迴圈邊計算,節省大量空間 建立乙個generator vlist a a for a in range 3 vlist 0,1,4 vgenerator b...
python高階 迭代器 生成器
迭代是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有 list tuple等都是可迭代物件,我們可以通過iter 函式獲取這些可迭代物件的迭代器。然後我們可以對獲取到的迭代器不斷使用next 函式來獲取下一條資料。iter 函式實際上就是...
python迭代器生成器高階
def num for i in range 1,4 print i,傳送出去 try a yield i print a,接受外部引數 except exception print 接收錯誤並處理 i num nu next i print nu,接收迭代引數 while true try if ...