一、迭代器
之前我們一直在用可迭代物件進行迭代操作,那麼到底什麼是可迭代物件。str,list,tuple,dict,set這些都是可迭代物件,因為它們都遵循可迭代協議。檢視物件是否可迭代可以使用dir(物件)再把其列印出來如果其中有__iter__就說明其屬於可迭代物件。
for迴圈使用的就是迭代原則,一開始是用__iter__()來獲取迭代器,後面每次獲取元素都是通過__next__()完成,當程式遇到stopiteration結束迴圈。
什麼叫做迭代器?迭代器英文意思是iterator。
l = [1,2,3,4]
l_iter = l.__iter__() # 將可迭代的轉化成迭代器
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
迭代器遵循迭代器協議:必須擁有__iter__方法和__next__方法。
for迴圈,能遍歷乙個可迭代物件,他的內部到底進行了什麼?
用while迴圈模擬for迴圈:
l = [1,2,3,4]
l_iter = l.__iter__()
while true:
try:
item = l_iter.__next__()
print(item)
except stopiteration:
break
二、生成器
生成器的實質就是迭代器
在python中有三種方式來獲取生成器:
1.通過生成器函式
2.通過各種推導式來實現生成器
3.通過資料轉換也可以獲取生成器
def func():
print("111")
yield 222
ret = func()
print(ret)
此時就生成了乙個生成器,由於函式中存在yield那麼這個函式就是乙個生成器函式。如何來執行這個函式呢,見下面:
那麼我們看到,yield和return的效果是一樣的有什麼區別呢?yield是分段來執行乙個函式,return是直接停止執行函式。
當程式執行完最後乙個yield,那麼後i按繼續進行__next__()程式會報錯。
def cloth():for i in range(0,10000):
yield "衣服"+str(i)
cl = cloth()
print(cl.__next__())
print(cl.__next__())
print(cl.__next__())
區別:第一種是直接一次性全部拿出,會很佔記憶體第二種使用生成器,一次就生成乙個,用多少生成多少。生成器是乙個乙個地指向下乙個
不會回去,__next__()到哪,指標就指到哪。下一次繼續獲取指標指向的值。
接下來我們來看send方法,send和__next__()一樣都可以讓生成器執行到下乙個yield.
send和__next__()的區別:
1.send和next()都是讓生成器走下一次
2.send可以給上乙個yield的位置傳遞值,不能給最後哦的乙個yield傳送值。在第一次執行生成器**的時候不能用send()
注:send比__next__多了個向上乙個yield傳值的功能不過第乙個yield跟最後乙個都傳不到
生成器和迭代器
可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...
迭代器和生成器
1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...
生成器和迭代器
1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...