python中經常用到迭代,但是對於迭代器、生成器一直處於模糊的理解,檢視了不少資料,感覺有些清晰了。
通過for迴圈不斷的拿到list中的值就是迭代,迭代就是迴圈做重複的事情。
for i in range(10):可以通過for迴圈進行迭代的物件稱為可迭代物件(iterable),如何判斷是否是可迭代物件,可以用collection模組中的iterable來判斷print(i)
>>> from collections import iterable可迭代物件內部都實現了_iter_方法,例如list,通過help(list)檢視>>> isinstance(,iterable)
true
>>> isinstance("",iterable)
true
>>> isinstance({},iterable)
true
>>> isinstance(123,iterable)
false
>>> isinstance((),iterable)
true
| __iter__(self, /)可迭代物件可以通過迴圈拿到值,但是可迭代物件不是迭代器。| implement iter(self).
為什麼list、dict、str等資料型別不是iterator?這是因為python的迭代器(iterator)物件表示的是乙個資料流,迭代器(iterator)物件可以被next() 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們不能提前知道序列的長度,只能不斷通過next()函式實現按需計算下乙個資料,所以iterator的計算是惰性的,只有在需要返回下乙個資料時它才會計算。
迭代器(iterator)甚至可以表示乙個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。
迭代器可以通過next函式不斷計算下乙個資料。
>>> c=iter(b)可以看到list是可迭代物件,但是無法使用next函式,因為它不是迭代器,而c則可以>>> c
>>> next(b)
traceback (most recent call last):
file "", line 1, in typeerror: 'list' object is not an iterator
>>> next(c)
0
建立迭代器的方法
可以通過 iter(list/set..) 來把乙個可迭代物件建立為迭代器。
生成器可以理解為特殊的迭代器,它也實現了iter和next方法,也是基於計算的迭代,一邊計算一邊迭代的機制稱為generator
建立生成器的方法
1. 通過列表推導式,把列表生成式的改為()
>>> g=(x for x in range(10))2.通過生成器函式得到乙個生成器,定義乙個包含yield的函式,普通函式中通過return返回值,返回後整個函式已經結束,而生成器函式中通過yield返回值,返回後會記錄yield的位置,然後下次再呼叫會從yield的位置繼續執行>>> type(g)
def func(n):看下結果,返回的是乙個生成器,可以通過next函式不斷拿到值,直到丟擲stopiterationa=1for i in range(n):
yield a
a+=i
a=func(5)
print(a)
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
1. 可迭代物件不一定是迭代器
2.迭代器一定是可迭代物件
3.實現了__next__函式(或可以通過next函式取值),__iter__函式的是迭代器
4.生成器是特殊的迭代器,可以通過列表推導式或者函式中使用yield來獲得生成器
Python 迭代器 生成器
可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...
python 迭代器,生成器
什麼事迭代 可直接用作與for迴圈的物件統稱為可迭代物件 可以被next 函式呼叫,並不斷返回下乙個值的物件稱為迭代器,所有的iterable均可以通過內建函式iter 來轉變為iterator。對於迭代器來講,有乙個next 就夠了。在你使用for和in語句時,程式就會自動呼叫即將被處理的物件的可...
python 迭代器 生成器
知識背景 1 呼叫乙個普通的python函式時,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式結束 可以看作隱式的返回none 2 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失 3 再次呼叫這個函式時,一切都將從頭建立。...