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 self,cls,decorator的理解
Jul 13 Python
Python全局变量操作详解
Apr 14 Python
python中函数总结之装饰器闭包详解
Jun 12 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
Sep 05 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
Feb 20 Python
flask 框架操作MySQL数据库简单示例
Feb 02 Python
为什么称python为胶水语言
Jun 16 Python
如何编写python的daemon程序
Jan 07 Python
解决pytorch 的state_dict()拷贝问题
Mar 03 Python
Django一小时写出账号密码管理系统
Apr 29 Python
python程序的组织结构详解
Dec 06 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
叶罗丽:为什么大家对颜冰这对CP非常关心,却对金茉两人十分冷漠
2020/03/17 国漫
php文档更新介绍
2011/07/22 PHP
一组PHP加密解密函数分享
2014/06/05 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
PHP面向对象程序设计方法实例详解
2016/12/24 PHP
JavaScript中的私有成员
2006/09/18 Javascript
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
JS正则中的RegExp对象对象
2012/11/07 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
使用BootStrapValidator完成前端输入验证
2016/09/28 Javascript
简单易懂的天气插件(代码分享)
2017/02/04 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
vue项目打包后怎样优雅的解决跨域
2019/05/26 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
2019/10/25 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
vue 通过base64实现图片下载功能
2020/12/19 Vue.js
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
浅谈Python中range与Numpy中arange的比较
2020/03/11 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
阿里巴巴Oracle DBA笔试题答案-备份恢复类
2013/11/20 面试题
自我鉴定四大框架
2014/01/17 职场文书
30年同学聚会邀请函
2014/01/25 职场文书
商务英语专业求职信
2014/06/26 职场文书
人事专员岗位职责说明书
2014/07/30 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
感谢信格式范文
2015/01/22 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
趣味运动会通讯稿
2015/07/18 职场文书
导游词之上海豫园
2019/10/24 职场文书
SpringBoot深入分析讲解监听器模式下
2022/07/15 Java/Android