Python学习笔记之迭代器和生成器用法实例详解


Posted in Python onAugust 08, 2019

本文实例讲述了Python学习笔记之迭代器和生成器用法。分享给大家供大家参考,具体如下:

迭代器和生成器

迭代器

  • 每次可以返回一个对象元素的对象,例如返回一个列表。我们到目前为止使用的很多内置函数(例如 enumerate)都会返回一个迭代器。
  • 是一种表示数据流的对象。这与列表不同,列表是可迭代对象,但不是迭代器,因为它不是数据流。

生成器

  • 是使用函数创建迭代器的简单方式。也可以使用类定义迭代器

下面是一个叫做 my_range 的生成器函数,它会生成一个从 0 到 (x - 1) 的数字流:

def my_range(x):
  i = 0
  while i < x:
    yield i
    i += 1

该函数使用了 yield 而不是关键字 return。这样使函数能够一次返回一个值,并且每次被调用时都从停下的位置继续。关键字 yield 是将生成器与普通函数区分开来的依据。

因为上述代码会返回一个迭代器,因此我们可以将其转换为列表或用 for 循环遍历它,以查看其内容。例如,下面的代码:

for x in my_range(5):
  print(x)

输出如下:

0
1
2
3
4

为何要使用生成器?

  • 生成器是构建迭代器的 “懒惰” 方式。当内存不够存储完整实现的列表时,或者计算每个列表元素的代价很高,你希望尽量推迟计算时,就可以使用生成器。但是这些元素只能遍历一次。
  • 由于使用生成器是一次处理一个数据,在内存和存储的需求上会比使用list方式直接全部生成再存储节省很多资源。由此区别,在处理大量数据时,经常使用生成器初步处理数据后,再进行长期存储,而不是使用 list。
  • 因为无论使用生成器还是 list,都是使用过就要丢弃的临时数据。既然功能和结果一样,那就不如用生成器。
  • 但是生成器也有自己的局限,它产生的数据不能回溯,不像list可以任意选择。

迭代器和生成器[相关练习]

请自己写一个效果和内置函数 enumerate 一样的生成器函数。如下所示地调用该函数:

lessons = ["Why Python Programming", "Data Types and Operators", "Control Flow", "Functions", "Scripting"]
for i, lesson in my_enumerate(lessons, 1):
  print("Lesson {}: {}".format(i, lesson))

应该会输出:

Lesson 1: Why Python Programming
Lesson 2: Data Types and Operators
Lesson 3: Control Flow
Lesson 4: Functions
Lesson 5: Scripting

解决方案:

lessons = ["Why Python Programming", "Data Types and Operators", "Control Flow", "Functions", "Scripting"]
def my_enumerate(iterable, start=0):
  # Implement your generator function here
  i = start
  for element in iterable:
    yield i, element
    i += 1
for i, lesson in my_enumerate(lessons, 1):
  print("Lesson {}: {}".format(i, lesson))

如果可迭代对象太大,无法完整地存储在内存中(例如处理大型文件时),每次能够使用一部分很有用。实现一个生成器函数 chunker,接受一个可迭代对象并每次生成指定大小的部分数据。如下所示地调用该函数:

for chunk in chunker(range(25), 4):
  print(list(chunk))

应该会输出:

  [0, 1, 2, 3]
  [4, 5, 6, 7]
  [8, 9, 10, 11]
  [12, 13, 14, 15]
  [16, 17, 18, 19]
  [20, 21, 22, 23]
  [24]

解决方案:

def chunker(iterable, size):
  for i in range(0, len(iterable), size):
    yield iterable[i:i + size]
for chunk in chunker(range(25), 4):
  print(list(chunk))

学习参考:

https://www.python.org/dev/peps/pep-0257/

https://docs.python.org/3/tutorial/classes.html#iterators

https://softwareengineering.stackexchange.com/questions/290231/when-should-i-use-a-generator-and-when-a-list-in-python/290235

https://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中利用sorted()函数排序的简单教程
Apr 27 Python
Python实现短网址ShortUrl的Hash运算实例讲解
Aug 10 Python
深入浅析Python中join 和 split详解(推荐)
Jun 30 Python
Python实现网站注册验证码生成类
Jun 08 Python
基于Python对象引用、可变性和垃圾回收详解
Aug 21 Python
对Python 文件夹遍历和文件查找的实例讲解
Apr 26 Python
python使用matplotlib画饼状图
Sep 25 Python
matplotlib实现热成像图colorbar和极坐标图的方法
Dec 13 Python
Dlib+OpenCV深度学习人脸识别的方法示例
May 14 Python
利用python中集合的唯一性实现去重
Feb 11 Python
python 日志 logging模块详细解析
Mar 31 Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 Python
pandas 选取行和列数据的方法详解
Aug 08 #Python
pandas 对日期类型数据的处理方法详解
Aug 08 #Python
解决Python设置函数调用超时,进程卡住的问题
Aug 08 #Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 #Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 #Python
Python实现直方图均衡基本原理解析
Aug 08 #Python
python获取指定日期范围内的每一天,每个月,每季度的方法
Aug 08 #Python
You might like
PHP实现通过正则表达式替换回调的内容标签
2015/06/15 PHP
php实现Mysql简易操作类
2015/10/11 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
js正则表达式中test,exec,match方法的区别说明
2014/01/29 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
JS使用cookie实现只出现一次的广告代码效果
2017/04/22 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
支付宝小程序tabbar底部导航
2018/11/06 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
python实现的解析crontab配置文件代码
2014/06/30 Python
python简单程序读取串口信息的方法
2015/03/13 Python
Python编程之序列操作实例详解
2017/07/22 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
2019/04/16 Python
Pandas分组与排序的实现
2019/07/23 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
总经理办公室主任岗位职责
2013/11/12 职场文书
高中生学习生活的自我评价
2013/11/27 职场文书
三国演义读书笔记
2015/06/25 职场文书
放飞理想主题班会
2015/08/14 职场文书
Java网络编程之UDP实现原理解析
2021/09/04 Java/Android