包含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
原文:https://www.cnblogs.com/smulngy/p/8830448.html