python函數五(叠代器,生成器)
阿新 • • 發佈:2018-02-06
ext 構建 什麽是 器協 生成 false 推導式 gen ict
一。叠代器
1.可叠代對象(只含有__iter__方法的數據是可叠代對象)
常見的可叠代對象:str list tuple dict set range
1.1什麽是可叠代對象?
方法一: dir(被測對象) 如果 他含有‘__iter__ ‘,那這個對象就叫做可叠代對象.
遵循可叠代協議
s = ‘alex‘ l = [1,2,3,4,5] print(‘__iter__‘ in dir(s)) print(‘__iter__‘ in dir(l)) # 輸出結果: # True # True
2.叠代器(含有__iter__方法,並且含有__next__方法的數據是叠代器)
常見的叠代器:文件句柄
2.1叠代器的取值
s = ‘alex‘ l = [1,2,3,4,5] s1 = s.__iter__() print(s1.__next__()) print(s1.__next__()) print(s1.__next__()) # 輸出結果: a l e
2.2叠代器的意義:
1)叠代器節省內存.
2)叠代器惰性機制.
3)叠代器不能反復,一直向下執行.
for循環的機制就是完美的運用的叠代器
內部含有__iter__方法,他會將可叠代對象先轉化成叠代器。然後在調用__next__方法,他有異常處理的方法.
3.可叠代對象與叠代器的關系
1)可叠代對象------>叠代器
可叠代對象.__iter__()------->叠代器
s = ‘alex‘ l = [1,2,3,4,5] l1 = l.__iter__() #叠代器 print(l1) #iterator 遵循叠代器協議 # 輸出結果:<list_iterator object at 0x00000156B0EC7630>
判斷是可叠代對象還是叠代器
方法二(isinstance與type類似,但是功能比type更強大)
l = [1,2,3,4,5] l_iter = l.__iter__() from collections import Iterable from collections import Iterator print(isinstance(l,Iterable)) #True print(isinstance(l,Iterator)) #True print(isinstance(l_iter,Iterator)) #False print(isinstance(l,list)) #True
二。生成器
生成器的本質就是叠代器,生成器是自己用python代碼寫的叠代器.
1,可以用生成器函數
2,可以用各種推導式構建叠代器.
3,可以通過數據轉化.
def gener(): print(111) yield 222 count = yield 333 print(count) yield 444 yield 555 g = gener() print(g) print(g.__next__()) print(g.__next__()) print(g.send(‘aaa‘)) print(g.__next__()) # 輸出結果: # <generator object gener at 0x0000014CDE5B1BF8> # 111 # 222 # 333 # aaa # 444 # 555
4.send
1)send 和next功能一樣
2)給上一個yiled 整體發送一個值
send不能給最後一個yield發送值
獲取第一個值的時候,不能用send 只能用next
python函數五(叠代器,生成器)