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 正则表达式操作指南
May 04 Python
Python原始字符串(raw strings)用法实例
Oct 13 Python
Python PyQt5实现的简易计算器功能示例
Aug 23 Python
Python实现购物系统(示例讲解)
Sep 13 Python
Python制作词云的方法
Jan 03 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
Nov 07 Python
Python离线安装PIL 模块的方法
Jan 08 Python
Python3数字求和的实例
Feb 19 Python
网易2016研发工程师编程题 奖学金(python)
Jun 19 Python
python 画3维轨迹图并进行比较的实例
Dec 06 Python
Python基于xlutils修改表格内容过程解析
Jul 28 Python
python前后端自定义分页器
Apr 13 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 变量未定义等错误的解决方法
2011/01/12 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
js 加载时自动调整图片大小
2008/05/28 Javascript
jQuery 版本的文本输入框检查器Input Check
2009/07/09 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
js+jquery实现图片裁剪功能
2015/01/02 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
2015/08/10 Javascript
JavaScript开发者必备的10个Sublime Text插件
2016/02/27 Javascript
AngularJS入门教程之ng-class 指令用法
2016/08/01 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
JS基于递归实现倒计时效果的方法
2016/11/26 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
vue实现点击展开点击收起效果
2018/04/27 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
如何手动实现一个 JavaScript 模块执行器
2020/10/16 Javascript
Python比较两个图片相似度的方法
2015/03/13 Python
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
详解python中*号的用法
2019/10/21 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
美国领先的机场停车聚合商:Airport Parking Reservations
2020/02/28 全球购物
创业计划书——互联网商机
2014/01/12 职场文书
党员承诺书怎么写
2014/05/20 职场文书
爱牙日活动总结
2014/08/29 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
优秀少先队员事迹材料
2014/12/24 职场文书
Python中Selenium对Cookie的操作方法
2021/07/09 Python