3-3使用生成器函数实现可迭代对象

来源:互联网 发布:js日期比大小 编辑:程序博客网 时间:2024/06/07 19:12
# -*- coding:utf-8 -*-"""实际案例:实现一个可迭代对象的类,它能迭代出给定范围内的所有素数:pn = PrimeNumber(1, 30)for k in pn:    print k输出结构:2 3 5 7 11 13 17 19 23 29解决方案:将该类的__iter__方法实现成生成器函数,每次yield返回一个素数"""def f():    print('in f(), 1')    yield 1    print('in f(), 2')    yield 2    print('in f(), 3')    yield 3g = f()# 生成器对象和迭代器对象在行为上非常相似,都支持可迭代接口__next__print(g.__next__())# 如果想调用生成器函数的语句,需要调用__next__函数,返回的结果就是yield返回的结果# 虽然f函数被yield临时返回,但保留了程序运行的状态.再次调用,会继续沿着上次进行print(g.__next__())print(g.__next__())# print(g.__next__())    # 抛出异常:StopIterationfor x in g:    # 可以代替上面几句代码    print(x)print(g.__iter__() is g)      # g对象既实现了迭代器接口__next__,又实现了可迭代接口__iter__# 调用g的可迭代接口,返回的就是g自身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 range(2, k):            if k % i == 0:                return False        return True    def __iter__(self):        for k in range(self.start, self.end + 1):            if self.isPrimeNum(k):                yield kfor x in PrimeNumbers(1, 100):    print(x)
0 0
原创粉丝点击