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

本文介绍了一个使用Python生成指定范围内所有素数的可迭代对象类。通过实现__iter__方法为生成器函数,每次yield返回一个素数,从而高效地遍历指定范围内的所有素数。
# -*- 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 3

g = f()
# 生成器对象和迭代器对象在行为上非常相似,都支持可迭代接口__next__
print(g.__next__())
# 如果想调用生成器函数的语句,需要调用__next__函数,返回的结果就是yield返回的结果
# 虽然f函数被yield临时返回,但保留了程序运行的状态.再次调用,会继续沿着上次进行
print(g.__next__())
print(g.__next__())
# print(g.__next__())    # 抛出异常:StopIteration

for 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 k

for x in PrimeNumbers(1, 100):
    print(x)







评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值