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

 更新时间:2019年08月08日 11:03:25   作者:Johnny丶me  
这篇文章主要介绍了Python学习笔记之迭代器和生成器用法,结合实例形式详细分析了Python迭代器与生成器的功能、原理、定义及使用方法,需要的朋友可以参考下

本文实例讲述了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 time时间格式化和设置时区实现代码详解

    Python time时间格式化和设置时区实现代码详解

    这篇文章主要介绍了Python time时间格式化和设置时区实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
    2023-02-02
  • Python实现统计文本中的字符数量

    Python实现统计文本中的字符数量

    这篇文章主要为大家详细介绍了如何利用Python实现统计文本中的字符数量,包括中/英文字符、数字、特殊字符等,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-05-05
  • Pandas中如何对DataFrame列名进行重命名

    Pandas中如何对DataFrame列名进行重命名

    在做数据挖掘的时候,想改一个DataFrame的column名称,所以就查了一下,下面这篇文章主要给大家介绍了关于Pandas中如何对DataFrame列名进行重命名的相关资料,需要的朋友可以参考下
    2023-04-04
  • Python实现接口自动化测试的方法详解

    Python实现接口自动化测试的方法详解

    Python接口自动化测试是一种高效、可重复的软件质量验证方法,尤其在现代软件开发中,它已经成为不可或缺的一部分,本文将深入探讨如何使用Python进行接口自动化测试,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • Matplotlab显示OpenCV读取到的图像

    Matplotlab显示OpenCV读取到的图像

    本文介绍了如何使用OpenCV和Matplotlib处理图像,本文通过实例讲解的非常详细,对Matplotlab OpenCV图像相关处理方法感兴趣的朋友一起看看吧
    2025-02-02
  • Python中PDF解析利器pdfplumber的使用详细教程

    Python中PDF解析利器pdfplumber的使用详细教程

    pdfplumber是一个Python库,专门用于从PDF文件中提取文本、表格和其他信息,本文将为大家详细介绍一下pdfplumber的安装与详细使用,有需要的小伙伴可以参考下
    2025-04-04
  • 将不规则的Python多维数组拉平到一维的方法实现

    将不规则的Python多维数组拉平到一维的方法实现

    这篇文章主要介绍了将不规则的Python多维数组拉平到一维的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • python如何以表格形式打印输出的方法示例

    python如何以表格形式打印输出的方法示例

    这篇文章主要介绍了python如何以表格形式打印输出的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • 详解使用python crontab设置linux定时任务

    详解使用python crontab设置linux定时任务

    本篇文章主要介绍了使用python crontab设置linux定时任务,具有一定的参考价值,有需要的可以了解一下。
    2016-12-12
  • 如何在ubuntu中切换使用不同版本的python

    如何在ubuntu中切换使用不同版本的python

    在ubuntu环境下进行嵌入式开发,我们在进行不同的项目开发时,可能会遇到python环境不统一的情况,下面这篇文章主要给大家介绍了关于如何在ubuntu中切换使用不同版本的python的相关资料,需要的朋友可以参考下
    2023-02-02

最新评论