python如何使用生成器函式實現可迭代物件

2021-08-08 17:49:10 字數 1858 閱讀 6932

實際案例

實現乙個可迭代物件的類,它能迭代出給定範圍內所有素數:

pn = primenumbers(1, 30)

for k in pn:

print k

輸出結果為:

2 3 5 7 11 13 17 19 23 29
解決方案:將該類的__iter__方法實現成生成器函式,每次yield返回乙個素數。

有了解決方案後,我們首先要了解一下什麼是生成器函式。讓我們先看看如下**:

def

f():

print

'in f(), 1'

yield

1print

'in f(), 2'

yield

2print

'in f(), 3'

yield

3g = f()

print type(g)

其輸出結果為:

'generator'>
誒,我們呼叫了f()卻沒有列印輸出我們設想的結果,這是為什麼呢?我們現在來看看這個輸出結果,它表示呼叫f()後的返回結果型別為generator型別,即返回的結果為生成器物件。那麼,我們將任何包含yield 語句的函式稱為生成器(函式)。當然,生成器不僅僅是包含yield語句的函式,更多關於生成器的知識請參閱廖雪峰的python教程。

yield語句不會像return那樣返回值,而是每次產生多個值。每次產生乙個值(使用yield語句),函式就會被凍結:即函式停在那點等待被重新喚醒。函式被重新喚醒後就從停止的那點開始執行。

將yield語句的知識補充完後,我們再回到生成器這個知識點。上面我們講到我們呼叫f()後返回乙個生成器物件,其和迭代器物件類似,它也可以實現next()。(注:python 3.x版本中為__next__()。)

那我們就在**中實現next():

# g.next()

for x in g:

print x

其結果為:

in f(), 1

1in f(), 2

2in f(), 3

3

通過上述**,我們又可發現g(生成器物件)也是乙個迭代器物件。因此,我們就可以利用這一點解決我們的實際案例,**如下:

# -*- coding: utf-8 -*-

class

primenumbers:

def__init__

(self, start, end):

self.start = start

self.end = end

defisprimenum

(self, k):

if k < 2:

return

false

for i in xrange(2, k):

if k % i == 0:

return

false

return

true

def__iter__

(self):

for k in xrange(self.start, self.end + 1):

if self.isprimenum(k):

yield k

if __name__ == "__main__":

for x in primenumbers(1, 30):

print x

輸出結果為:

235

7111317

1923

29

python生成器函式 Python 生成器函式

一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...

python 生成器函式

python 函式的定義體中有 yield 關鍵字,該函式就是生成器函式。呼叫生成器函式時,會返回乙個生成器物件。生成器函式的定義體執行完畢後,生成器物件會丟擲stopiteration 異常。def gen a print start yield 1 print starting yield 2 ...

python函式 生成器

1.生成器 是乙個特殊的迭代器 迭代的抽象層級更高 所以,擁有迭代器的特性,惰性計算資料,節省記憶體。能夠記錄下狀態,並通過next 函式,訪問下乙個狀態。具備可迭代性。但是,如果打造乙個自己的迭代器,比較複雜,需要實現很多方法 在後續的面相物件程式設計中會講解 所以,就有乙個更加優雅的方式 生成器...