迭代器和生成器

1 如何判断一个类是不是迭代器(迭代器的生成的步骤) : 首先 你要判断这个类能不能够遍历 我们使用的是collections模块中的Iterable, isinstance(类的对象,Iterable) 如果返回值为True则表示是可以遍历的对象 反之则表示不可以 一般来说类中有函数–iter–都可以遍历 第二 在第一步成立的情况下 调用–iter–函数 得到对象的–next–方法的返回值 第三 --iter–方法的返回值是一个迭代器(只要一个类中有–iter–,--next–方法 这个类就是一个迭代器) 注意 判断一个类是不是迭代器我们使用的也是collections模块中的Iterator,isinstance(类名,Iterator) 返回值如果是True 则表示这个类就是一个迭代器 反之 则不是
2 迭代器的作用 :迭代 顾名思义就是重复做一些事很多次(就现在循环中做的那样) 迭代器是实现了–next–()方法的对象(这个方法在调用时不需要任何参数) 他是访问迭代序列的一种方式 通常其从序列的第一个元素开始访问 直到所有的元素都被访问才结束 注意 迭代器只能前进不能后退
3 迭代器的优点 : 使用迭代器不要求事先准备好整个迭代过程中的所有元素 迭代器仅仅在迭代到某个元素时才计算该元素 而在这之前或之后元素都可以不存在或者被销毁 因此迭代器适合遍历一些数量巨大甚至是无限的序列
4 生成器的介绍 : 只要一个函数(比如这个函数叫main)中有yield出现 那么这个就不是函数 而是一个生成器的模板 如果在调用main的时候 发现这个函数有yield出现 不是调用函数 而是创建一个生成器对象 启动yield的两种方法就是next send
在这里插入图片描述其实我们生成器的本质就是一个迭代器 生成器能够自动生成iter() next() 所以生成器能做到迭代器做到的所有 而且代码看着还特别的整洁 干净 下面我们说一个简单的生成器 比如 一个列表推导式 list = [i for i in range(3)] 如果你打印list这个列表 那么肯定是 [0,1,2] 但是你对这个列表推导式进行一种改造 他就变成了一个简单的生成器 list = (i for i in range(3)) 此时你再打印这个列表 肯定是一个对象 这个对象存储的是生成这个列表的方法 或者说是地址 数据用时生成 不用时就可以销毁 这样不就是迭代器的原理 所以说生成器其实就是一个迭代器 简单来说 当我们的数据特别大的时候建立一个列表的储存数据就会很占内存的 这时生成器就排上用场了 他可以说是一个不怎么占计算机资源的一种方法
我们可以举个简单的例子来总结下生成器的作用 : 比如我们泡茶 第一步 我们需要去煮水 第二步 拿出茶具和茶叶 第三步 水开了 就开始泡茶 第四步 就是品茶了 假如我们定义好了一个泡茶的函数(生成器) 然后将泡茶步骤的方法封装到这个函数 每一次调用这个函数就返回一个步骤(我们可以理解为使用next或者是send调用一次生成器 或者说是唤醒一次生成器) 并保存号当前执行到那个状态 如果中途有事 比如我们执行到第二步的时候突然去接了一个电话 回来调用这个函数就会得到第三步 这也就是状态保持好了 我们可以执行这个泡茶函数直到调用完所有的步骤为止 调完之后还会自动抛出StopIteration异常
所以总结来说 : 生成器其实就是一个迭代器 只不过生成器自动创建了iter() next() 方法 使代码显得整洁 干净 就是生成的是一种方法或者是对象 而不是数据 还可以状态保持 就是这次遍历到 数字5 下次就从5后面的数字开始遍历(这就是迭代器的功能) 而生成器状态保持也是自动创建的 生成器就是比迭代器多了一个yield yield就是 这些能够自动生成的原因 我们就是每使用next send来唤醒一次生成器时 由于有状态保持 所以我们取出的是上一次取出的数据的下一个 还有 就是遍历完后 会自动抛出StopIteration 每遍历一次到yield都会停止 然后接着遍历 等着next send来从yield中取数据

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值