可迭代物件:乙個實現了iter方法的物件是可迭代的
迭代器:乙個實現了iter方法和next方法的物件就是迭代器(iter方法會返回乙個迭代器)
生成器都是iterator
物件,但list
、dict
、str
雖然是iterable(可迭代物件)
,卻不是iterator(迭代器)
。
from collections import iterator #為什麼迭代器from collections import iterable #
可迭代物件
print(isinstance(s,iterator)) #
判斷是不是迭代器
print(isinstance(s,iterable)) #
判斷是不是可迭代物件
#iter可以
把可迭代物件轉換為迭代器
print(isinstance(iter(s),iterator))
list
、dict
、str
等資料型別不是iterator
?
這是因為python的iterator
物件表示的是乙個資料流,iterator物件可以被next()
函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration
錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()
函式實現按需計算下乙個資料,所以iterator
的計算是惰性的,只有在需要返回下乙個資料時它才會計算。
iterator
甚至可以表示乙個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。
生成器:生成器是迭代器的一種
建立生成器的方法有兩種:
1.把乙個列表生成式的中括號改為()小括號
a = [i+1 for i in range(5)] #列表生成式
(a)b = (i+1 for i in range(5)) #
生成器print
(b)
(next(b))
(next(b))
(next(b))
(next(b))
(next(b))
(next(b))
輸出結果:
[1, 2, 3, 4, 5]
at 0x00000163c820baf0>12
345traceback (most recent call last):
file
"e:/myproj/pytest_demo/b.py
", line 13, in
(next(b))
stopiteration
生成器最常用的還是通過for迴圈呼叫:
for i in b:2.定義乙個包含yield語句的函式,通過呼叫該函式得到生成器(生成器函式)print(i)
def如果對以上執行原理還是不清楚,可以通過debug示例**進一步理解...fib(max):
n,a,b =0,0,1
while n
yield
b a,b =b,a+b
n = n+1
return
'done
'a =fib(6) # 呼叫包含yield語句的函式並不會立即執行,它只是返回乙個生成器,只有當程式通過next()函式呼叫或者遍歷生成器時,函式才會真正執行
(a)for i in fib(6): # 之所以能用for迴圈,是因為fib(6)是個迭代器
(i)
輸出結果:11
2358
關於yield:
與return類似,程式執行到yield會返回,等再次呼叫時,程式從上次yield處繼續往下執行
python中生成器,迭代器和裝飾器
解析器在實時生成資料,資料不會駐留在記憶體中。因此,其執行效率很高!yield 是乙個類似 return 的關鍵字,只是這個函式返回的是個生成器 當你呼叫這個函式的時候,函式內部的 並不立即執行 這個函式只是返回乙個生成器物件 當你使用for進行迭代的時候,函式中的 才會執行 list1 i 2 f...
個人理解的python中生成器與迭代器
可迭代物件 在python中,列表,元組,字典,字串這些可以用for迴圈遍歷的物件稱為可迭代物件。迭代器 我們建立乙個容器,該容器中可以生成一些資料,這些資料可以遍歷,該容器被我們稱為迭代器。生成器 生成器為迭代器的一種,使用yield返回函式,每次呼叫yield函式程式都會暫停,使用next 或s...
python中生成器
生成器 生成器generator 生成器函式generator m i for i in range 5 定義乙個生成器 print type m 判斷m的型別,是乙個生成器 print next m 使用next函式 def inc 定義乙個inc函式 for i in range 5 yield...