1. 程式人生 > >生成器,叠代器,可叠代對象

生成器,叠代器,可叠代對象

next() pre 類型 每次 () 變量 ner class __next__

技術分享圖片

Python中 list,truple,str,dict這些都可以被叠代,但他們並不是叠代器。

可叠代對象使用iter()函數後就變成了一個叠代器

比如說str類型,它可以叠代,但是他不是一個叠代器,使用iter(str)可以把str類型轉換成str_iter類型的叠代器.(同理,list會變成list_iter)

叠代器可以調用next()函數(或者.__next__()方法,效果一致),參數為其本身,獲取下一次叠代的值.

--------------------------------------------------------------------------------------------------------------------------------------------

生成器:(yield,生產,產生的意思),生成器一定是叠代器,反之不成立.

a = [x*x for x in range(10)] 是列表生成式,返回列表

如果我要生成的列表很大很大,占用內存空間,一次性生成不太現實,那麽我就需要使用生成器

a = (x*x for x in range(10)) 生成器表達式(generator expression)

使用next(a)一次只生成一個值

生成器可以再函數中加入yield關鍵字,後面接一變量名實現,把這個函數變成生成器,比如一個實現斐波那契數列的函數,節省內存空間

每次調用這個函數後會執行到yield行,返回變量值.函數停止,下次再調用這個函數會從上次中斷的地方繼續執行到下個yield處.如此反復.

要註意的是 yield 並沒有返回值,如果

temp = yield a

temp一直是為None的

要使yield有返回值,請使用生成器的.send(參數)方法

send()方法不能在還沒開始叠代的時候傳遞non-None參數

生成器,叠代器,可叠代對象