Python学习笔记之迭代器和生成器用法实例详解

作者:Johnny丶me 时间:2021-07-15 21:25:04 

本文实例讲述了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程序设计有所帮助。

来源:https://blog.csdn.net/Tyro_java/article/details/80732366

标签:Python,迭代器,生成器
0
投稿

猜你喜欢

  • 微信小程序实现顶部搜索框

    2024-05-02 16:21:03
  • python实现有效的括号判断实例代码

    2023-11-24 14:40:34
  • Python中无限循环需要什么条件

    2023-03-28 09:05:14
  • asp中数组的用法

    2008-05-12 22:29:00
  • Python中http请求方法库汇总

    2021-04-28 10:26:21
  • python 搭建简单的http server,可直接post文件的实例

    2021-08-25 15:07:39
  • python数据库编程 ODBC方式实现通讯录

    2024-01-15 10:58:01
  • 解析:正确的理解SQL Server和XML支持

    2009-01-23 13:52:00
  • 学习JavaScript设计模式之装饰者模式

    2023-07-19 08:59:07
  • 优雅使用GoFrame共享变量Context示例详解

    2024-04-27 15:27:02
  • SQLserver 数据库危险存储过程删除与恢复方法

    2011-09-30 11:33:54
  • python文件读取和导包的绝对路径、相对路径详解

    2021-04-12 03:27:05
  • 简单了解操作mysql数据库的命令行神器mycli

    2024-01-24 03:44:14
  • PyTorch的深度学习入门教程之构建神经网络

    2021-11-21 09:34:22
  • 利用Python脚本实现传递参数的三种方式分享

    2023-07-11 03:45:44
  • Python实战之markdown转pdf(包含公式转换)

    2023-11-24 12:39:34
  • TypeScript与JavaScript项目里引入MD5校验和

    2024-05-28 15:40:03
  • JQuery调用绑定click事件的3种写法

    2024-04-09 19:48:14
  • asp读取xml实例代码

    2011-03-08 11:13:00
  • Python中PyQt5/PySide2的按钮控件使用实例

    2023-03-04 16:27:44
  • asp之家 网络编程 m.aspxhome.com