迭代器和生成器

2021-10-02 05:48:58 字數 2687 閱讀 8995

迭代器包含有next方法的實現,在正確的範圍內返回期待的資料以及超出範圍後能夠丟擲stopiteration的錯誤停止迭代

可以直接作用於for 迴圈的物件統稱為可迭代物件:iterable,例如集合資料型別,如list,tuple,dict,set,str等

乙個實現了iter方法的物件是可迭代的,乙個實現next方法並且是可迭代的物件是迭代器。可以使用isinstance()判斷乙個物件是否是iterator物件

>>

>

from collections import iterator

>>

>

isinstance

((x for x in

range(10

)), iterator)

true

>>

>

isinstance([

], iterator)

false

>>

>

isinstance

(, iterator)

false

>>

>

isinstance

('abc'

, iterator)

false

s=

'hello'

#字串是可迭代物件,但不是迭代器l=[

1,2,

3,4]

#列表是可迭代物件,但不是迭代器t=(

1,2,

3)#元組是可迭代物件,但不是迭代器

d=#字典是可迭代物件,但不是迭代器

set=

#集合是可迭代物件,但不是迭代器

f=open

('test.txt'

)#檔案是可迭代物件,是迭代器

通過列表生成式,我們可以直接建立乙個列表,但是,受到記憶體限制,列表容量肯定是有限的,而且建立乙個包含100萬個元素的列表,不僅占用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。

所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不必建立完整的list,從而節省大量的空間,在python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator

生成器是乙個特殊的程式,可以被用作控制迴圈的迭代行為,python中生成器是迭代器的一種,使用yield返回值函式,每次呼叫yield會暫停,而可以使用next()函式和send()函式恢復生成器。生成器一次只能產生乙個值,這樣消耗的記憶體數量將大大減小,而且允許呼叫函式可以很快的處理前幾個返回值,因此生成器看起來像是乙個函式,但是表現得卻像是迭代器

類似於列表解析,只需把列表解析式的[ ]換成( )就ok了

#列表生成式

lis =

[x*x for x in

range(10

)]print

(lis)[0

,1,4

,9,16

,25,36

,49,64

,81]#生成器

>>

>generator_ex =

(x*x for x in

range(10

))>>

>

print

(generator_ex)

generator object

at 0x000002a4cbf9eba0

>

#可以通過next()函式獲得下乙個返回值

>>

>

print

(next

(generator_ex))0

>>

>

print

(next

(generator_ex))1

#也可以利用for迴圈列印

>>

>

for i in generator_ex:

print

(i)014

9162536

4964

81

生成器函式

def

create_counter

(n):

print

("create_counter"

)while

true

:yield n

print

("increment n"

) n +=

1gen= create_counter(2)

print

(gen)

#print

(next

(gen)

)#create_counter

#2print

(next

(gen)

)#increment n

#3

函式是順序執行的,遇到return語句或者最後一行函式語句就返回, 而變成generator的函式,在每次呼叫next()的時候執行,執行完yield語句返回,再次被next()呼叫時候從上次的返回yield語句之後繼續執行,也就是用多少,取多少,不佔記憶體

yield是乙個類似return 的關鍵字,迭代一次遇到yield的時候就返回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...