16_Python的迭代器

server/2024/9/23 10:20:53/

在这里插入图片描述
在Python中,迭代是一个非常重要的概念。迭代通常指的是按照某种顺序逐个访问容器中的元素的行为。如使用for循环遍历取值的过程。

可迭代对象(Iterable)

可迭代对象是任何可以返回一个迭代器的对象。简单来说,它是可以逐一返回其成员项的对象。大多数内置集合类型,如list、set、dict、tuple和str都是可迭代的。即可以使用for循环遍历取值的对象。如:字符串、列表、元组、集合、字典。

  • 可迭代对象一般都具有一个 __iter__ 方法,用于创建迭代器

可迭代对象的特点:

  • 可以使用iter()函数从可迭代对象中得到一个迭代器。
  • 可以在for循环中使用,因为for循环背后使用了迭代器。
python"># 对列表进行for循环遍历
my_list = [1, 2, 3]
for item in my_list:print(item)
python"># 对元组进行for循环遍历
t = (1, 2, 3)
for item in t:print(item)
python"># 对集合进行for循环遍历
st = (1, 2, 3, 4)
for item in st:print(item)
python"># 对字典进行遍历
my_dict = {'name':'Jim', 'age':12}
for i in my_dict:print(i)

迭代器(Iterator)

迭代器是实现了 __iter__()__next__() 方法的对象。 __iter__() 方法返回迭代器本身,而 __next__() 方法返回序列中的下一个项目。

迭代器是特殊的可迭代对象,

  • __next__ :访问迭代器中的元素
    • 从迭代提中的第一个元素开始访问,一只访问到最后一个元素。如果继续进行访问会报StopIteration异常。访问之后会将元素丢弃,不会存在内存中。

迭代器的特点:

  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
  • 使用next()函数可以手动获取下一个元素,当没有更多元素时,会抛出一个StopIteration异常。
python">class MyIterator:def __init__(self, items):self.items = itemsself.index = 0def __iter__(self):return selfdef __next__(self):if self.index >= len(self.items):raise StopIterationcurrent_item = self.items[self.index]self.index += 1return current_item# 使用迭代器
my_iterator = MyIterator([1, 2, 3])
for item in my_iterator:print(item)
python">it1 = my_list.__iter__()
it1
python">it1.__next__()
python">it1.__next__()
python">it1.__next__()
python"># 访问最后一个元素后,再访问会报错:StopIteration。
it1.__next__()

迭代对象和迭代器的总结

  • 所有迭代器都是可迭代的,但不是所有可迭代的都是迭代器。
  • 可迭代对象提供一个迭代器,而迭代器可以用来迭代其中的元素。

在Python编程中,理解这两个概念对于编写高效的循环和操作集合类型至关重要。

python"># 使用for循环访问迭代器
class MyIterator:def __init__(self, items):self.items = itemsself.index = 0def __iter__(self):return selfdef __next__(self):if self.index >= len(self.items):raise StopIterationcurrent_item = self.items[self.index]self.index += 1return current_item# 创建一个迭代器实例
my_iterator = MyIterator([1, 2, 3, 4, 5])# 使用for循环来访问迭代器
for item in my_iterator:print(item)
python"># 使用while循环
my_iterator = MyIterator([1, 2, 3, 4, 5, 6])
it = iter(my_iterator)
while True:try:print(next(it))except StopIteration:break

迭代器的优点

  • 内存效率:迭代器按需计算值,这意味着它们不需要在内存中存储整个数据集。
  • 惰性计算:迭代器只在需要时计算下一个值,这对于大数据集或无限数据流来说非常有用。
  • 提供一个统一的接口:迭代器提供了一个通用的接口来遍历数据结构,而不需要关心底层数据结构的细节。

以下是一个使用迭代器的实例,其中我们创建了一个生成斐波那契数列的迭代器。斐波那契数列是一个无限序列,使用迭代器可以有效地生成它,而不需要预先计算整个序列。

python">class FibonacciIterator:def __init__(self):# 初始化前两个斐波那契数self.first = 0self.second = 1def __iter__(self):# 返回迭代器本身return selfdef __next__(self):# 计算下一个斐波那契数next_value = self.first + self.second# 更新前两个数self.first, self.second = self.second, next_value# 返回下一个斐波那契数return self.first# 创建斐波那契数列迭代器
fib_iterator = FibonacciIterator()# 使用for循环打印前10个斐波那契数
for i, value in enumerate(fib_iterator):if i >= 10:  # 打印前10个数后停止breakprint(value)

附件

本文对应的jupyter notebook源码链接,欢迎下载练习:https://download.csdn.net/download/fx_yzjy101/89779395

如有问题请留言。


http://www.ppmy.cn/server/120025.html

相关文章

spark 面试题

spark 面试题 1、spark 任务如何解决第三方依赖 比如机器学习的包,需要在本地安装?--py-files 添加 py、zip、egg 文件不需要在各个节点安装 2、spark 数据倾斜怎么解决 spark 中数据倾斜指的是 shuffle 过程中出现的数据倾斜,主要是由于…

MySQL索引详解

前言 在数据库管理中,索引是提高数据检索速度的重要工具。MySQL作为流行的关系型数据库管理系统,提供了多种类型的索引来优化查询性能。本文将深入探讨MySQL索引的工作原理、类型、创建方法以及最佳实践。 索引简介 MySQL中的索引是一种数据库对象&am…

OpenAI / GPT-4o:Python 返回结构化 / JSON 输出

在调用 OpenAI(比如:GPT-4o)接口时,希望返回的结果是能够在后续任务中自动化处理的结构化 / JSON 输出。GPT 版本:gpt-4o-2024-08-06,提供了这样的功能。 目标:从非结构化输入到结构化数据&…

在 Mac 上安装双系统会影响性能吗,安装双系统会清除数据吗?

在 Mac 系统安装并使用双系统已经成为了许多用户办公的选择之一,双系统可以让用户在 Mac 上同时运行 Windows 或其他操作系统。然而,许多用户担心这样做会对 Mac 的性能产生影响。 接下来将给大家介绍 Mac 装双系统会影响性能吗,Mac装双系统…

将Java程序打包成EXE程序

Java制作可执行jar 方式一:mainClass与lib分离 1)将Java程序依赖的所有jar都拷贝在lib目录下,并添加到classpath中 2)运行时指定MainClass pom.xml 这个pom.xml生成的jar可双击直接运行,但是因为没有将其依赖的jar…

AJAX(一)HTTP协议(请求响应报文),AJAX发送请求,请求问题处理

文章目录 一、AJAX二、HTTP协议1. 请求报文2. 响应报文 三、AJAX案例准备1. 安装node2. Express搭建服务器3. 安装nodemon实现自动重启 四、AJAX发送请求1. GET请求2. POST请求(1) 配置请求体(2) 配置请求头 3. 响应JSON数据的两种方式(1) 手动,JSON.parse()(2) 设置…

PHP:强大的Web开发语言

PHP:强大的Web开发语言 一、PHP 简介及优势 PHP 的基本概念 PHP(PHP: Hypertext Preprocessor)即 “超文本预处理器”,是一种通用开源脚本语言,最初由 Rasmus Lerdorf 于 1994 年创建。它可以在服务器上执行&#xf…

树与图的深度优先遍历(dfs的图论中的应用)

模板题 846. 树的重心 给定一颗树,树中包含 nn 个结点(编号 1∼n)和 n−1条无向边。 请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。 重心定义:重心是指树中的一个结点&#xff…