13. 前⽅⾼能-迭代器和⽣成器
本节主要内容:
1. 迭代器
2. ⽣成器

⼀. 迭代器
我们之前⼀直在⽤可迭代对象进⾏迭代操作. 那么到底什么是可迭代对象. 本⼩节主要讨
论可迭代对象. ⾸先我们先回顾⼀下⽬前我们所熟知的可迭代对象有哪些:
str, list, tuple, dict, set. 那为什么我们可以称他们为可迭代对象呢? 因为他们都遵循了可
迭代协议. 什么是可迭代协议. ⾸先我们先看⼀段错误代码:

注意看报错信息中有这样⼀句话. 'int' object is not iterable . 翻译过来就是整数类型对象
是不可迭代的. iterable表⽰可迭代的. 表⽰可迭代协议. 那么如何进⾏验证你的数据类型是否
符合可迭代协议. 我们可以通过dir函数来查看类中定义好的所有⽅法.

我们发现在字符串中可以找到__iter__. 继续看⼀下list, tuple, dict, set

 我们发现这⼏个可以进⾏for循环的东⻄都有__iter__函数, 包括range也有. 可以⾃⼰试⼀
下.
综上. 我们可以确定. 如果对象中有__iter__函数. 那么我们认为这个对象遵守了可迭代协议.
就可以进⾏迭代. 这⾥的__iter__是帮助我们获取到对象的迭代器. 我们使⽤__next__()来获取
到⼀个迭代器中的元素. 那么我们之前讲的for的⼯作原理到底是什么? 继续看代码

⼆. ⽣成器
什么是⽣成器. ⽣成器实质就是迭代器.
在python中有三种⽅式来获取⽣成器:
1. 通过⽣成器函数
2. 通过各种推导式来实现⽣成器
3. 通过数据的转换也可以获取⽣成器
今天, 我们主要使⽤⽣成器函数来完成⽣成器的创建和使⽤.
⾸先, 我们先看⼀个很简单的函数:

运⾏的结果和上⾯不⼀样. 为什么呢. 由于函数中存在了yield. 那么这个函数就是⼀个⽣成器
函数. 这个时候. 我们再执⾏这个函数的时候. 就不再是函数的执⾏了. ⽽是获取这个⽣成器.
如何使⽤呢? 想想迭代器. ⽣成器的本质是迭代器. 所以. 我们可以直接执⾏__next__()来执⾏
以下⽣成器.

示例:

 当程序运⾏完最后⼀个yield. 那么后⾯继续进⾏__next__()程序会报错.
好了⽣成器说完了. ⽣成器有什么作⽤呢? 我们来看这样⼀个需求. 公司向JACK JONES订
购10000套学⽣服. JACK JONES就比较实在. 直接造出来10000套衣服.

但是公司现在没那么多人啊,你一下给我一万套我没地方存啊,很尴尬,   

最完美的就是我用一套 你给我一套  

区别: 第⼀种是直接⼀次性全部拿出来. 会很占⽤内存. 第⼆种使⽤⽣成器. ⼀次就⼀个. ⽤多
少⽣成多少. ⽣成器是⼀个⼀个的指向下⼀个. 不会回去, __next__()到哪, 指针就指到哪⼉.
下⼀次继续获取指针指向的值.

---->>>> send和__next__区别<<<<<-----

第一次执行必须用__next__

这个比较乱,可以自己运行一下看看结果    先打印 然后打印yield返回值  然后send传值进上一个yield  打印出来

最新文章

  1. 修改eclipse中包的显示结构为树形
  2. 一个CentOS7的开发环境部署,包括防火墙|VPN|多IP多网关|HTTP代理服务器设置等
  3. 「译」JavaScript 的怪癖 1:隐式类型转换
  4. Android进阶之大话设计模式
  5. [QT]构建正则表达式测试
  6. &amp;lt;ctype.h&amp;gt; C语言标准库
  7. 2.bootstrap-全局css
  8. LeetCode 674. Longest Continuous Increasing Subsequence (最长连续递增序列)
  9. iOS 远程推送消息解析及逻辑处理
  10. python爬虫(6)——正则表达式(三)
  11. 【BZOJ3931】【CQOI2015】网络吞吐量(最短路,网络流)
  12. AnyConnect使用说明(手机版)
  13. Docker系列02—LXC---Docker的“前身”
  14. HTTP Streaming Architecture HLS 直播点播 HTTP流架构
  15. Activiti 工作流之所学所感(基本配置) DAY1
  16. python的语法小结
  17. 开启Java之旅
  18. ASP.NET WebApi 基于JWT实现Token签名认证
  19. UVa 11728 Alternate Task (枚举)
  20. kickstart模式实现批量安装centos7.x系统

热门文章

  1. 【洛谷T37388】P哥破解密码
  2. 【洛谷P3469】[POI2008]BLO-Blockade
  3. 【题解】洛谷P1350 车的放置(矩阵公式推导)
  4. HDU 1077 Catching Fish(用单位圆尽可能围住多的点)
  5. 【办公】Microsoft Office 2016 专业增强版下载及永久激活-亲测分享
  6. SqlSugar之SqlQueryDynamic返回值处理
  7. Linux查看日志命令- more、less、tail、head命令的区别
  8. c#的二进制序列化组件MessagePack介绍
  9. 小程序登录 -41003: aes 小程序加密数据解密失败问题
  10. Linux 服务器之间文件传输