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之使用Python操作数据库(1)
Nov 25 Python
Linux下为不同版本python安装第三方库
Aug 31 Python
Python实现修改IE注册表功能示例
May 10 Python
解决pycharm 安装numpy失败的问题
Dec 05 Python
tensorflow多维张量计算实例
Feb 11 Python
Python任务自动化工具tox使用教程
Mar 17 Python
使用python+poco+夜神模拟器进行自动化测试实例
Apr 23 Python
windows下的pycharm安装及其设置中文菜单
Apr 23 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
Jun 29 Python
Python如何导出导入所有依赖包详解
Jun 08 Python
Python pygame实现中国象棋单机版源码
Jun 20 Python
Python尝试实现蒙特卡罗模拟期权定价
Apr 21 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的FTP学习(一)
2006/10/09 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
JQUERY 浏览器判断实现函数
2009/08/20 Javascript
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
jQuery 前的按键判断代码
2010/03/19 Javascript
Jquery之美中不足小结
2011/02/16 Javascript
DWZ刷新dialog解决方法
2013/03/03 Javascript
js网页版计算器的简单实现
2013/07/02 Javascript
node.js中的fs.link方法使用说明
2014/12/15 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
2017/08/17 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
vue实现模态框的通用写法推荐
2018/02/26 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
Pytorch基本变量类型FloatTensor与Variable用法
2020/01/08 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
基于matplotlib中ion()和ioff()的使用详解
2020/06/16 Python
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
工作时间上网检讨书
2014/02/03 职场文书
《海底世界》教学反思
2014/04/16 职场文书
个人查摆剖析材料
2014/10/16 职场文书
工作收入证明范本
2015/06/12 职场文书
反邪教学习心得体会
2016/01/15 职场文书
2016年中学端午节主题活动总结
2016/04/01 职场文书
导游词之太原天龙山
2020/01/02 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP