迭代器和生成器

2022-04-04 13:16:54 字數 2251 閱讀 5662

一、迭代器

之前我們一直在用可迭代物件進行迭代操作,那麼到底什麼是可迭代物件。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...