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实现根据ip地址反向查找主机名称的方法
Apr 29 Python
Python NumPy库安装使用笔记
May 18 Python
Python同时向控制台和文件输出日志logging的方法
May 26 Python
Python探索之爬取电商售卖信息代码示例
Oct 27 Python
用python实现的线程池实例代码
Jan 06 Python
python如何统计序列中元素
Jul 31 Python
python requests 库请求带有文件参数的接口实例
Jan 03 Python
python版DDOS攻击脚本
Jun 12 Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
Dec 08 Python
pytorch 使用半精度模型部署的操作
May 24 Python
Pygame Time时间控制的具体使用详解
Nov 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
php知道与问问的采集插件代码
2010/10/12 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
JQuery开发的数独游戏代码
2010/10/29 Javascript
javascript计时器事件使用详解
2014/01/07 Javascript
javascript正则表达式基础知识入门
2015/04/20 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
jQuery如何获取动态添加的元素
2016/06/24 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
vue+高德地图实现地图搜索及点击定位操作
2020/09/09 Javascript
Javascript confirm多种使用方法解析
2020/09/25 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
python操作redis数据库的三种方法
2020/09/10 Python
python 实现有道翻译功能
2021/02/26 Python
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
全球最大的瓷器、水晶和银器零售商:Replacements
2020/06/15 全球购物
外企C语言笔试题
2013/11/10 面试题
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
Python的两道面试题
2013/06/29 面试题
函授自我鉴定
2013/11/06 职场文书
即将毕业大学生自荐信
2014/01/24 职场文书
2015年国庆节标语大全
2015/07/30 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书
【DOTA2】总决赛血虐~ XTREME GAMING vs MAGMA - OGA DOTA PIT 2022 CN
2022/04/02 DOTA