06 Feb 2017
生成器是迭代器的一个子类,使用了yield代替return。当生成器被调用时,返回一个生成器对象。
>>> from collections import Iterator, Iterable >>> def gen(): yield >>> type(gen()) generator >>> isinstance(gen(), Iterator) True >>> issubclass(gen(), Iterator) True
>>> type([x for x in xrange(0, 2)]) list >>> type((x for x in xrange(0, 2))) generator
创建一个生成器,目标返回传入值范围内的素数,类似于下面的结构
pn = PrimeNumbers(1,30) for k in pn: print k,
其实只要你在一个函数内使用了yeild,则该函数就是一个生成器,就像我在本文中最开始做的那样
而此处,因为generator是iterator的一个子类,我们选择做一个标准的iterator,只是其中不适用return,而是使用yield来处理基本元素
class PrimeNumbers(object): def __init__(self, start, end): self.start = start self.end = end def isPrimeNum(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, 100): print x
执行结果
python /tmp/test.py 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97