python-7-如何使用生成器函数实现可迭代对象?

这里写图片描述

  • 创建List和generator的区别仅在于最外层的[]和()
  • 如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
  • generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
  • 生成器既实现了迭代器接口,也实现了可迭代接口 。也就是说g.iter() is g
def f():
    print('in f(),1')
    yield 1

    print('in f(),2')
    yield 2

    print('in f(),3')
    yield 3

g = f()
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())

这里写图片描述
第四次调用时,超出停止迭代异常。
不过呢,我们创建了一个generator后,基本上永远不会调用next(),因为太麻烦了。所以,通过for循环来迭代它,并且不需要关心StopIteration的错误。

g = f()
for x in g:
    print(x)
print(g.__iter__() is g)
返回true

解决方案:
这里写图片描述
iter在调用的时候并不会直接运行,而是返回一个包含next()方法的生成器对象。

class PrimeNumbers:
    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
n = 0
for x in PrimeNumbers(1,1235):

    print(x)
    n = n + 1
print(n)

了解生成器可以看看廖老师的博客,很详细。
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值