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开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 Python
Python基于csv模块实现读取与写入csv数据的方法
Jan 18 Python
对python遍历文件夹中的所有jpg文件的实例详解
Dec 08 Python
Python pickle模块实现对象序列化
Nov 22 Python
tornado+celery的简单使用详解
Dec 21 Python
python正则表达式匹配IP代码实例
Dec 28 Python
python给图像加上mask,并提取mask区域实例
Jan 19 Python
Python参数传递机制传值和传引用原理详解
May 22 Python
基于python代码批量处理图片resize
Jun 04 Python
解决Python import .pyd 可能遇到路径的问题
Mar 04 Python
python控制台打印log输出重复的解决方法
May 14 Python
Python快速优雅的批量修改Word文档样式
May 20 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函数
2010/02/16 PHP
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
基于Jquery的简单图片切换效果
2011/01/06 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
js函数返回多个返回值的示例代码
2013/11/05 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
JS插件overlib用法实例详解
2015/12/26 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
详解在create-react-app使用less与antd按需加载
2018/12/06 Javascript
Javascript如何实现扩充基本类型
2020/08/26 Javascript
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
Python实现针对中文排序的方法
2017/05/09 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
浅析Python 多行匹配模式
2020/07/24 Python
大学毕业感言
2014/01/10 职场文书
实习老师离校感言
2014/02/03 职场文书
专项法律服务方案
2014/06/11 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
《比尾巴》教学反思
2016/02/24 职场文书
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL
提高系统的吞吐量解决数据库重复写入问题
2022/04/23 MySQL