{{ cat }}'s docs

2.3.0 构造一个生成器


0. 生成器概念

1) 生成器与迭代器

生成器是迭代器的一个子类,使用了yield代替return。当生成器被调用时,返回一个生成器对象。

>>> from collections import Iterator, Iterable
>>> def gen(): yield
>>> type(gen())
generator
>>> isinstance(gen(), Iterator)
True
>>> issubclass(gen(), Iterator)
True

2) 生成器与列表推导式

>>> type([x for x in xrange(0, 2)])
list

>>> type((x for x in xrange(0, 2)))
generator

1. 目标

创建一个生成器,目标返回传入值范围内的素数,类似于下面的结构

pn = PrimeNumbers(1,30)

for k in pn:
    print k,

2. 构造一个生成器

其实只要你在一个函数内使用了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