python3 生成器 (自定义生成器)

2.生成器
        1.什么是生成器?
            生成器(generator)是一种特殊的迭代器,比迭代器更优雅,编写更简单,
        2.生成器的两中创建方式:
            1.简单的生成器实现:
                把列表推倒式[]改为()
            2.使用yield创建生成器:
                1.假如函数中有yield,则不在是函数,而是一个生成器
                2.yield会产生一个断点,暂停函数,挂起函数,保存当前状态
                3.假如yield后紧跟一个数据,就会把数据返回,作为next函数或for..in ..迭代出下一个值
                4.可以通过next()唤醒生成器,让生成器从断点处继续执行

        3.yield实现生成器的执行过程:
            1.生成器默认是沉睡的,可以通过next()唤醒生成器
            2.第一次唤醒生成器是从函数的起始位置开始的,直到遇见下一个yield,就会暂停函数,挂起函数
            3.第二次唤醒生成器是从断点开始,直到又遇见yield
            4.当生成器没有了yield,再使用next,则会抛出异常StopIteration 

        4.send与next唤醒生成器的不同
            1.generator.send()与next()都可以唤醒生成器,但send可以传值给断点处
            2.使用的方式不同:
                next(generator):next是内置的函数
                generator.send():是生成器中的方法
            3.generator.send(None)等价于next(generator)
            4.第一次唤醒生成器时,假如使用send,则只能传Nonem,因为刚开始执行生产器时是没有断点的    

        4.参考代码:

        #1.简单的生成器实现:把列表推倒式[]改为()
        # l = [x for x in range(5)]
        # print(l)#[0, 1, 2, 3, 4]
        # l = (x for x in range(5))#这里创建的是一个迭代对象,也叫生成器对象
        # print(l)#<generator object <genexpr> at 0x7f13ae310620>,所以打印的是生成器对象的内存地址

        """
        2.使用yield创建生成器:
            1.假如函数中有yield,则不在是函数,而是一个生成器
            2.yield会产生一个断点,暂停函数,挂起函数,保存当前状态
            3.假如yield后紧跟一个数据,就会把数据返回,作为next函数或for..in ..迭代出下一个值
            4.可以通过next()唤醒生成器,让生成器从断点处继续执行
        """

        class feibo(object):
            def __init__(self,n):
                self.n = n #记录返回的斐波那契数列的数量
                self.a,self.b = 0,1#记录前两位的值为0,1
                self.position = 0#记录当前迭代的位置,初始为0

            def __iter__(self):
                return self#返回一个迭代器,返回自己

            def __next__(self):
                if self.position < self.n:
                    num = self.a
                    # self.a,self.b = self.b,self.a+self.b#斐波那契的规律
                    self.position += 1
                    return num
                else:
                    raise StopIteration


        def fib(n):
            print("----")
            position = 0
            num1,num2 = 0,1
            while position<n:
                print("---")
                yield num1
                num1,num2 = num2,num1+num2
                position += 1

        #创建生成器
        gen = fib(5)
        print(gen)
        print(next(gen))
        print(next(gen))
        print(next(gen))
        print(next(gen))
        print(next(gen))
        # fib = feibo(10)
        #当前用这种方式去遍历使无法取到数据的,因为此时生成器默认是沉睡的,
        # 需要通过next()去唤醒,遇到yield在沉睡
        # for item in gen:
        #     print(item)  
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值