python中生成器(關鍵字yield)

2021-09-29 13:55:16 字數 2365 閱讀 5154

用法理解可迭代物件和迭代器

⾸先我們要理解迭代器(iterators)。 迭代器是可以遍歷⼀個容器(特別是列表) 的物件。 然⽽, ⼀個迭代器在遍歷並讀取⼀個容器的資料元素時, 並不會執⾏⼀個迭代。 你可能有點暈了, 那我們來個慢動作。 換句話說這⾥有三個部分:

可迭代物件(iterable)

迭代器(iterator)

迭代(iteration)

上⾯這些部分互相聯絡。 我們會先各個擊破來討論他們, 然後再討論⽣成器(generators)。

python中任意的物件, 只要它定義了可以返回⼀個迭代器的__iter__⽅法, 或者定義了可以⽀持下標索引的__getitem__⽅法(這些雙下劃線⽅法會在其他章節中全⾯解釋),那麼它就是⼀個可迭代物件。 簡單說, 可迭代物件就是能提供迭代器的任意物件。

任意物件, 只要定義了next(python2) 或者__next__⽅法, 它就是⼀個迭代器。 就這麼簡單。

⽤簡單的話講, 它就是從某個地⽅(⽐如⼀個列表) 取出⼀個元素的過程。 當我們使⽤⼀個迴圈來遍歷某個東西時, 這個過程本⾝就叫迭代。

⽣成器也是⼀種迭代器, 但是你只能對其迭代⼀次。 這是因為它們並沒有把所有的值存在記憶體中, ⽽是在運⾏時⽣成值。 你通過遍歷來使⽤它們, 要麼⽤⼀個「for」迴圈, 要麼將它們傳遞給任意可以進⾏迭代的函式和結構。 ⼤多數時候⽣成器是以函式來實現的。 然⽽,它們並不返回⼀個值, ⽽是yield(暫且譯作「⽣出」)⼀個值。

第一種用法

#!coding:utf8

defnum_generators()

:for i in

range(0

,3):

yield i

if __name__==

'__main__'

:for num in num_generators():

print num

輸出結果是01

2第二種用法:使用python內建函式next()

#!coding:utf8

defnum_generators()

:for i in

range(0

,3):

yield i

if __name__==

'__main__'

: nums = num_generators(

)print

next

(nums)

,next

(nums)

,next

(nums)

print

next

(nums)

結果如下:

0 1 2

file 「e:/pycharmworkspace/deep/csdn/csdn.py」, line 10, in

print next(nums)

stopiteration

我們可以看到, 在yield掉所有的值後, next()觸發了⼀個stopiteration的異常。這個異常告訴我們所有的值都已經被yield完了。聯想一下為什麼使用for迴圈就沒有就沒這異常呢,原因很簡單:for迴圈會自動捕捉到這個異常並停⽌調⽤next()

首先我們看乙個例子(遍歷字串)

#!coding:utf8

if __name__==

'__main__'

: csdn=

"csdn"

print

next

(csdn)

執行結果如下

traceback (most recent call last):

file 「e:/pycharmworkspace/deep/csdn/csdn.py」, line 6, in

print next(csdn)

typeerror: str object is not an iterator

由上面的結果可以知道字串(str)不是乙個迭代器,但是我們卻是可以用for迴圈遍歷字串,說明字串是乙個可迭代物件

那麼我們如何將乙個可迭代物件變成乙個迭代器呢?這裡我需要引入乙個python內建函式iter(),**如下:

#!coding:utf8

if __name__==

'__main__'

: csdn=

iter

("csdn"

)print

next

(csdn)

,next

(csdn)

,next

(csdn)

,next

(csdn)

執行結果如下:

c s d n

python生成器 yeild關鍵字

1.yeild版本的斐波那契數列 def fab max n,a,b 0,0,1 while n max yield b print b a,b b,a b n n 1 第四個版本的 fab 和第一版相比,僅僅把 print b 改為了 yield b,就在保持簡潔性的同時獲得了 iterable ...

生成器yield關鍵字

yield是乙個類似return的關鍵字,只是這個函式返回的是個生成器 當你呼叫這個函式時,函式內部 並不立即執行,這個函式只是返回乙個生成器物件。當你使用for迭代時,函式中的 才會執行。使用yield方式建立乙個生成器 def creategenerator for i in range 10 ...

python中生成器

生成器 生成器generator 生成器函式generator m i for i in range 5 定義乙個生成器 print type m 判斷m的型別,是乙個生成器 print next m 使用next函式 def inc 定義乙個inc函式 for i in range 5 yield...