3-3利用生成器實現可叠代對象
阿新 • • 發佈:2018-04-14
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利用生成器實現可叠代對象