python 基础篇 13 迭代器与生成器
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 打印出来
最新文章
- 修改eclipse中包的显示结构为树形
- 一个CentOS7的开发环境部署,包括防火墙|VPN|多IP多网关|HTTP代理服务器设置等
- 「译」JavaScript 的怪癖 1:隐式类型转换
- Android进阶之大话设计模式
- [QT]构建正则表达式测试
- &;lt;ctype.h&;gt; C语言标准库
- 2.bootstrap-全局css
- LeetCode 674. Longest Continuous Increasing Subsequence (最长连续递增序列)
- iOS 远程推送消息解析及逻辑处理
- python爬虫(6)——正则表达式(三)
- 【BZOJ3931】【CQOI2015】网络吞吐量(最短路,网络流)
- AnyConnect使用说明(手机版)
- Docker系列02—LXC---Docker的“前身”
- HTTP Streaming Architecture HLS 直播点播 HTTP流架构
- Activiti 工作流之所学所感(基本配置) DAY1
- python的语法小结
- 开启Java之旅
- ASP.NET WebApi 基于JWT实现Token签名认证
- UVa 11728 Alternate Task (枚举)
- kickstart模式实现批量安装centos7.x系统
热门文章
- 【洛谷T37388】P哥破解密码
- 【洛谷P3469】[POI2008]BLO-Blockade
- 【题解】洛谷P1350 车的放置(矩阵公式推导)
- HDU 1077 Catching Fish(用单位圆尽可能围住多的点)
- 【办公】Microsoft Office 2016 专业增强版下载及永久激活-亲测分享
- SqlSugar之SqlQueryDynamic返回值处理
- Linux查看日志命令- more、less、tail、head命令的区别
- c#的二进制序列化组件MessagePack介绍
- 小程序登录 -41003: aes 小程序加密数据解密失败问题
- Linux 服务器之间文件传输