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将人民币转换大写的脚本代码
Feb 10 Python
python基于隐马尔可夫模型实现中文拼音输入
Apr 01 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
Jul 08 Python
详解如何利用Cython为Python代码加速
Jan 27 Python
python实现三次样条插值
Dec 17 Python
python 获取毫秒数,计算调用时长的方法
Feb 20 Python
Python 实现微信防撤回功能
Apr 29 Python
python字符串和常用数据结构知识总结
May 21 Python
python语言基本语句用法总结
Jun 11 Python
python格式化输出保留2位小数的实现方法
Jul 02 Python
Java Spring项目国际化(i18n)详细方法与实例
Mar 20 Python
pytorch中的 .view()函数的用法介绍
Mar 17 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
世界收音机发展史
2021/03/01 无线电
详细介绍PHP应用提速面面观
2006/10/09 PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
2014/06/27 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
2019/10/16 PHP
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
js 与或运算符 || &amp;&amp; 妙用
2009/12/09 Javascript
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
鼠标选择动态改变网页背景颜色的JS代码
2013/12/10 Javascript
JS中的log对象获取以及debug的写法介绍
2014/03/03 Javascript
Iframe实现跨浏览器自适应高度解决方法
2014/09/02 Javascript
jQuery实现自定义事件的方法
2015/04/17 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
Python列表删除的三种方法代码分享
2017/10/31 Python
pandas ix &amp;iloc &amp;loc的区别
2019/01/10 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
出纳的岗位职责
2013/11/09 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
球队口号
2014/06/18 职场文书
安全演讲稿开场白
2014/08/25 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
幼儿园小班个人工作总结
2015/02/12 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python