迭代器與生成器

2021-08-31 01:26:49 字數 1416 閱讀 9688

迭代器是python的強大的功能之一,是訪問容器型別元素的一種方式

可迭代協議:有__iter__方法的變數/值都是可迭代物件

可迭代物件可以通過__iter__方法來返回乙個迭代器

迭代器協議:有__iter__方法和__next__方法的變數/值都是迭代器

迭代器特有的方法:

有兩種方法判斷物件是不是乙個迭代器:

'__iter__' in dir(iter) and '__next__' in dir(iter) 如果結果為true,則說明iter是乙個迭代器,否則不是迭代器

注:dir() 返回乙個由物件可用方法為元素組成的列表

從collections中匯入iterable,然後使用isinstance(args,iterable)的返回值來判斷是不是迭代器

迭代器的特點有:

具有__next__,__iter__方法

通過乙個next就可以多次執行,獲得所有這個容器中的值

迭代器中的值只能取一次

不取的時候值不出現

迭代器的優點:

range生成的就是乙個迭代器

for迴圈的原理:

for迴圈的本質是將可迭代物件轉換為迭代器,然後使用迭代器進行迴圈,for迴圈會幫你處理迭代器沒有值產生的異常

for迴圈與迭代器的關係:

無論是迭代器還是可迭代物件都可以被for迴圈

如果直接迴圈迭代器,那麼迴圈一次後就不能再取出值

如果迴圈非迭代器,每一次迴圈都相當於建立了乙個迭代器,進行從頭到尾的迴圈

迭代器的三種取值方式:

for迴圈

next方法

資料型別的強制轉換

生成器的本質就是迭代器

生成器通過簡單的函式來實現

只要函式中含有yield關鍵字,這個函式就是乙個生成器函式.

生成器函式呼叫時不會執行,返回乙個生成器,只有生成器執行__next__方法是才會執行,執行到yield,返回yield後的值

yield的作用就是記錄當前函式執行到的位置,下一次呼叫__next__方法是繼續執行

yield from list作用等同於:for temp in list:yield temp

生成器表示式與列表推導式格式類似,格式為(x for x in range(5)),生成器表示式本身就是乙個生成器

g.send()相當於g.__next__(),但是g.send()會傳乙個值過去,具體用法如下:

def func():

a = yield 1

yield a

g = func()

g.__next__()

g.send(2)

g.send(2)的返回值為2

__next__方法相當於send的值為none

迭代器與生成器

可迭代物件 可以直接作用於for迴圈的物件 統稱為可迭代物件 返回迭代器的物件 即iterable。一是集合資料型別,如list tuple dict set str等 二是generator,包括生成器和帶yield的generator function。容器 簡單來說 容器是一系列元素的集合 容...

生成器與迭代器

迭代是python最強大的功能之一,是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。迭代器有兩個基本的方法 iter 和 next 字串,列表或元組物件都可用於建立迭代器 list 1,2,3,...

生成器與迭代器

通過列表推導式,可以直接建立乙個列表,但是收到記憶體限制,列表容量肯定是有限的而且,建立乙個包含100萬個元素的列表,占用很大的儲存空間。如果我們僅僅需要訪問前面幾個元素,後面 後面元素的占用儲存空間就被浪費 所以,如果列表元素可以按照某種演算法算出來,那我們就可以再迴圈當中不斷地推導它,生成元素,...