1. 程式人生 > >3-3利用生成器實現可叠代對象

3-3利用生成器實現可叠代對象

start info com cal prim 生成 rime shell div

技術分享圖片

包含yield語句的函數就是生成器函數。數裏有yield關鍵字,則是生成器,生成器內置有__iter__方法,只不過調用__iter__返回的是生成器本身,利用這一特性,可以創建一個可叠代對象的類。

生成器即實現了,next叠代器對象,同時也實現了__iter__()可叠代對象,返回的是他自身

>>> def f():
    print(1111)
    yield 1          #當調用next()時 yield會把後面的內容返回,但保存當前狀態,下次調用next()時繼續執行。
    print(2222)
    yield 2
    print
(3333) yield 3
>>> g = f()
>>> g.next()
1111
1
>>> g.next()
2222
2
>>> g.next()
3333
3
>>> g.next()

Traceback (most recent call last):
  File "<pyshell#57>", line 1, in <module>
    g.next()
StopIteration

用叠代方式:

>>> g = f()
>>> for x in g: print x 1111 1 2222 2 3333 3 >>>

和叠代器實現了相同的功能。

>>> g.__iter__() is g
True

驗證了生成器實現了__iter__()可叠代對象,返回的是他自身

將可叠代對象的__iter__()方法實現在生成器函數。當__iter__()運行時不會直接返回,而是會返回一個包含next()方法的生成器對象。每次通過yield返回

class PrimeNum():   #如果是定義成 class PrimeNum:  也能正確執行。
def __init__(self,start,end): self.start = start self.end = end def isPrime(self,k): #類中定義判斷是否是素數的方法 if k <= 2: return False for x in xrange(2,k): if k % x == 0: return False return True def __iter__(self): for x in xrange(self.start,self.end +1): #判斷輸入的範圍如果是素數,用yield返回當前值,等待下叠代,繼續返回 if self.isPrime(x): yield x primenum = PrimeNum(0,100) for x in primenum: print (x),

輸出:3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

3-3利用生成器實現可叠代對象