迭代器和生成器个人笔记——Python

迭代器

  • 能用for… in 遍历的叫可迭代对象

  • for in 每一次都会调用__next__方法 获取返回值

  • 在for… in 循环中 记录我们遍历到第几次的对象就是迭代器

  • 一个具备了__iter__方法的对象,就是一个可迭代对象。

  • 简单来说计数君就是迭代器 迭代器需要迭代对象提供

  • 迭代器中的数据是一次性的

  • for in 用时间换空间

  • 迭代器用空间换时间

  • 因为迭代去需要一直next()

class Demo(object):

    def __init__(self,x):
        self.x = x        
        self.count = 0    实例化的计数man

    def __iter__(self):
        return self 返回实例化的可迭代对象

#for in 每一次都会调用__next__方法 获取返回值
    def __next__(self):
        self.count+=1
        if self.count<=self.x:
            print("我是count", self.count)
            return self.count-1

        else:
            print("我是count",self.count)
            raise StopIteration#终止迭代器


d1 = Demo(8)  # 只要重写了 __iter__方法他就是可迭代对象  可以使用for in

test = d1.__iter__()  # 这样就获取到对象的迭代器


迭代器生成斐波那契数列

class Fact(object):
    def __init__(self,num:int):
        self.num = num

        self.num1 = 0
        self.num2 = 1

        self.count = 0


    def __iter__(self):
        return self

    def __next__(self):
        self.count +=1

        if self.count <= self.num:
            #x 存放最后的结果
            x = self.num2
            self.num1,self.num2 =self.num2,self.num1+self.num2
            return x
        else:
            raise StopIteration

f = Fact(10)#占时间 不占空间
z = 0
for i in f:
    z = i
print(z)

print(next(iter(z)) 等价于  print((f.__iter__()).__next__()) 这样一次只能拿一个值要拿多少个要写多少次 占用空间不占用时间


生成器

  • 生成器(generator)。生成器是一类特殊的迭代器。
  • 把列表生成式的[ ]括号改成( )括号就是生成器
  • 迭代器是一个对象 通过class定义
    生成器 写法像函数
  • 只要在def中有yield关键字的 就称为 生成器
  • yield关键字有两点作用:
    保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起

在这里插入图片描述

def my_gemerator(n:int):
    i = 0
    while i <n:
        yield  i  #将函数变成了生成器   本来我们的函数是用return 表示函数结束 但是现在通过yield
        i +=1


  • 将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用

  • 可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数)

  • Python3中的生成器可以使用return返回最终运行的返回值,而Python2中的生成器不允许使用return返回一个返回值(即可以使用return从生成器中退出,但return后不能有任何表达式)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值