
什么是生成器,
含有yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()
(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
In [1]: def f(): ...: print("f().1") ...: yield 1 ...: print("f().2") ...: yield 2 ...: print("f()3") ...: yield 3 ...: # 生成器 就是迭代器,它返回了__iter__ In [7]: g.__iter__() is g Out[7]: True # 迭代器不一定是生成器 In [8]: f Out[8]: <function __main__.f> In [9]: f() |
该问题的解决方法:
在该类的__iter__方法实现生成器函数,每次yield一个素数,就可以解决了
素数:一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# -*- coding: utf-8 -*- __author__ = 'songhao' class PrimeNumbers(object): def __init__(self, start, end): self.start = start self.end = end def is_prime(self, k): """这个函数主要是实现 什么是素数的定义""" if k < 2: return False for x in range(2, k): if k%x == 0: return False return True def __iter__(self): # 实现了 迭代器 for u in range(self.start,self.end+1): if self.is_prime(u): yield u # 实现了生成器 if __name__ == '__main__': for x in PrimeNumbers(1, 10): print(x) |
代码的结果是:

如果看到这里,你还是不明白什么是生成器什么是迭代器,可以看这篇文章:
