Python中的 for 与 迭代器

文章目录

  • 一、`for` 循环的底层机制
    • 示例:手动模拟 `for` 循环
  • 二、可迭代对象 vs 迭代器
    • 关键区别:
  • 三、`for` 循环的典型应用场景
    • 1. 遍历序列类型
    • 2. 遍历字典
    • 3. 结合 `range()` 生成数字序列
    • 4. 遍历文件内容
  • 四、迭代器的自定义实现
    • 示例:生成斐波那契数列的迭代器
  • 五、生成器(简化迭代器)
        • 示例:生成偶数序列
  • 六、迭代工具库 `itertools`
    • 示例:合并多个迭代器
  • 七、常见问题与最佳实践🐥🐥
    • 1. 避免在迭代中修改集合
    • 2. 使用 `enumerate()` 获取索引
    • 3. 利用 `zip()` 并行遍历
  • 总结

在 Python 中, for 循环与迭代器(iterator)紧密结合,它们共同实现了对可迭代对象(iterable)的高效遍历。以下是详细解析及实际应用示例:


一、for 循环的底层机制

for 循环本质上是通过迭代器协议工作的:

  1. 自动调用 iter() 函数,将可迭代对象(如列表、字符串、字典)转换为迭代器。
  2. 反复调用 next() 函数获取元素,直到触发 StopIteration 异常时退出循环。

示例:手动模拟 for 循环

numbers = [1, 2, 3]
iterator = iter(numbers)  # 转换为迭代器
while True:try:num = next(iterator)  # 获取下一个元素print(num)except StopIteration:    # 遍历完成break
# 输出:1 2 3

二、可迭代对象 vs 迭代器

类别定义示例
可迭代对象实现了 __iter__() 方法的对象list, str, dict
迭代器实现了 __iter__()__next__() 方法的对象iterator = iter([1,2,3])

关键区别:

  • 可迭代对象:可被多次遍历(每次 for 循环会创建新迭代器)。
  • 迭代器:遍历一次后耗尽(无法重置,再次调用 next() 会触发异常)。

三、for 循环的典型应用场景

1. 遍历序列类型

# 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:print(fruit)# 遍历字符串
text = "Hello"
for char in text:print(char)

2. 遍历字典

person = {"name": "Alice", "age": 30, "city": "Paris"}
for key in person:           # 默认遍历键print(key)for key, value in person.items():  # 同时遍历键值对print(f"{key}: {value}")

3. 结合 range() 生成数字序列

for i in range(3):        # 0, 1, 2print(i)for i in range(1, 5, 2):  # 1, 3print(i)
注意:range()作为Python中的一个内置函数,调用会产生一个迭代序列。
如果range()产生的序列为空,那么用该迭代器控制for循环的时候,
其循环体将一次也不执行,循环立刻结束。

4. 遍历文件内容

with open("data.txt", "r") as file:for line in file:      # 逐行读取文件print(line.strip())

四、迭代器的自定义实现

通过实现 __iter__()__next__() 方法创建自定义迭代器。

示例:生成斐波那契数列的迭代器

class FibonacciIterator:def __init__(self, max_count):self.max_count = max_countself.count = 0self.a, self.b = 0, 1def __iter__(self):return selfdef __next__(self):if self.count >= self.max_count:raise StopIterationresult = self.aself.a, self.b = self.b, self.a + self.bself.count += 1return result# 使用迭代器
fib = FibonacciIterator(5)
for num in fib:print(num)  # 输出:0 1 1 2 3

五、生成器(简化迭代器)

使用 yield 关键字快速创建迭代器,无需手动实现类。

示例:生成偶数序列
def even_numbers(max_num):num = 0while num <= max_num:yield numnum += 2for n in even_numbers(10):print(n)  # 输出:0 2 4 6 8 10

六、迭代工具库 itertools

Python 内置的 itertools 模块提供多种高级迭代器操作:

示例:合并多个迭代器

import itertools   #不要忘了!!!numbers = [1, 2]
letters = ['a', 'b']# 笛卡尔积
for pair in itertools.product(numbers, letters):print(pair)  # (1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')# 无限计数器
counter = itertools.count(start=10, step=3)
print(next(counter))  # 10
print(next(counter))  # 13
print(next(counter))  # 16
print(next(counter))  # 19

七、常见问题与最佳实践🐥🐥

1. 避免在迭代中修改集合

# 错误示例:遍历时删除元素会导致意外跳过
numbers = [1, 2, 3, 4]
for num in numbers:if num % 2 == 0:numbers.remove(num)  # 危险操作!
print(numbers)  # 输出 [1, 3]# 正确方法:遍历副本或使用列表推导式
numbers = [num for num in numbers if num % 2 != 0]

2. 使用 enumerate() 获取索引

fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits, start=1):  # 索引从1开始print(f"{index}. {fruit}")

输出:

1. apple
2. banana
3. cherry

3. 利用 zip() 并行遍历

names = ["Alice", "Bob"]
ages = [24, 30]
for name, age in zip(names, ages):print(f"{name} is {age} years old")

输出:

Alice is 24 years old
Bob is 30 years old

总结

  • for 循环本质:基于迭代器协议,自动处理 iter()next()
  • 迭代器优势:惰性计算(节省内存),适合处理大型数据集。
  • 生成器简化:使用 yield 快速创建迭代器。
  • 工具扩展:利用 itertools 模块实现复杂迭代逻辑。

掌握迭代器机制,可以编写更高效、灵活的 Python 代码!
喵,就是这样~😼😼😼

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytest教程:为什么Pytest要用插件模式?

目录 一、历史背景:测试框架的局限性与Pytest的设计哲学 1.1 早期测试框架的困境 1.2 Pytest的模块化设计 二、横向对比:插件机制如何让Pytest脱颖而出 2.1 与Unittest/Nose的对比 2.2 插件模式的架构优势 三、插件模式的核心优势解析 3.1 可扩展性:从单元测试到全链…

【深度】如何通过MCP实现多智能体之间的协同

来源&#xff1a;腾讯技术工程、infoQ、原力注入 自 OpenAI 于 2023 年发布函数调用功能以来&#xff0c;我一直在思考如何构建一个开放的智能体与工具使用生态系统。随着基础模型愈发智能化&#xff0c;智能体与外部工具、数据和 API 的交互能力却日益碎片化&#xff1a;开发…

NVIDIA自动驾驶安全与技术读后感

ll在阅读了 NVIDIA 自动驾驶安全报告后&#xff0c;我对该公司致力于推进自动驾驶汽车&#xff08;AV&#xff09;技术、同时优先考虑安全和标准化的承诺印象深刻。它揭示了 NVIDIA 在功能安全、法规合规性以及与全球标准组织合作方面的严谨态度。    报告中最引人注目的部分…

关于nginx,负载均衡是什么?它能给我们的业务带来什么?怎么去配置它?

User 关于nginx&#xff0c;我还想知道&#xff0c;负载均衡是什么&#xff1f;它能为我的业务带来什么&#xff1f;怎么去配置它&#xff1f; Assistant 负载均衡是 Nginx 另一个非常强大的功能&#xff0c;也是构建高可用、高性能应用的关键技术之一。我们来详细了解一下。 …

前端如何优雅地对接后端

作为一名前端开发者&#xff0c;与后端对接是我们日常工作中不可避免的一部分。从API设计的理解到错误处理的优雅实现&#xff0c;前端需要的不只是调用接口的代码&#xff0c;更是一种协作的艺术。本文将从Vue 3项目出发&#xff0c;分享如何与后端高效协作&#xff0c;减少联…

PYTHON用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据

原文链接&#xff1a;http://tecdat.cn/?p27099 金融资产/证券已使用多种技术进行建模。该项目的主要目标是使用几何布朗运动模型和蒙特卡罗模拟来模拟股票价格。该模型基于受乘性噪声影响的随机&#xff08;与确定性相反&#xff09;变量&#xff08;点击文末“阅读原文”获取…

头歌之动手学人工智能-机器学习 --- PCA

目录 第1关&#xff1a;维数灾难与降维 第2关&#xff1a;PCA算法流程 任务描述 编程要求 测试说明 第3关&#xff1a;sklearn中的PCA 任务描述 编程要求 测试说明 第1关&#xff1a;维数灾难与降维 第2关&#xff1a;PCA算法流程 任务描述 本关任务&#xff1a;补充…

IOMUXC_SetPinMux的0,1参数解释

IOMUXC_SetPinMux(IOMUXC_ENET1_RX_DATA0_FLEXCAN1_TX, 0); 这里的第二个参数 0 实际上传递给了 inputOnfield&#xff0c;它控制的是 SION&#xff08;Software Input On&#xff09;位。 当 inputOnfield 为 0 时&#xff0c;SION 关闭&#xff0c;此时引脚的输入/输出方向由…

express响应设置 以及redirect,download,json.sendFdile

Express 中常用响应方法 的整理&#xff0c;包括设置响应头、重定向、下载、发送 JSON、发送文件等&#x1f447; &#x1f4e4; 一、设置响应头与状态码 设置状态码 res.status(404).send(Not Found);设置响应头 res.set(Content-Type, text/plain); // 设置内容类型 res.s…

深度学习-数值稳定性和模型初始化

到目前为止&#xff0c;我们实现的每个模型都是根据某个预先制定的分布来初始化模型的参数&#xff0c;有人会认为初始化方案时理所当然的&#xff0c;忽略了如何做出这些选择的细节&#xff0c;甚至有人可能会觉得&#xff0c;初始化方案的选择并不是特别重要&#xff0c;实际…

SFINAE(Substitution Failure Is Not An Error)

C 中的 SFINAE&#xff08;替换失败并非错误&#xff09; SFINAE&#xff08;Substitution Failure Is Not An Error&#xff09;是 C 模板元编程的核心机制之一&#xff0c;允许在编译时根据类型特性选择不同的模板实现。以下通过代码示例和底层原理&#xff0c;逐步解析 SFI…

【Python笔记 04】输入函数、转义字符

一、Input 输入函数 prompt是提示&#xff0c;会在控制台显示&#xff0c;用作提示函数。 name input("请输入您的姓名&#xff1a;") print (name)提示你输入任意信息&#xff1a; 输入input test后回车&#xff0c;他输出input test 二、常用的转义字符 只讲…

什么是量子计算?它能做什么?

抛一枚硬币。要么正面朝上&#xff0c;要么反面朝上&#xff0c;对吧&#xff1f;当然&#xff0c;那是在我们看到硬币落地的结果之后。但当硬币还在空中旋转时&#xff0c;它既不是正面也不是反面&#xff0c;而是正面和反面都有一定的可能性。 这个灰色地带就是量子计算的简…

入门 Go 语言

本专栏的 Go 语言学习参考了B站UP 软件工艺师的视频 本节需要&#xff1a; Go 语言环境VSCode 安装环境 下载 Go 环境&#xff0c;并安装下载 VSCode&#xff0c;安装。在 VSCode 中安装 Go 扩展&#xff1a; 接下来就可以编写 Go 语言了 第一条 Go Go 语言是一种编译型…

Oracle EBS R12.2 汉化

一、前言 在使用oracle ebs时&#xff0c;使用中文会更好的理解整个ebs流程&#xff0c;以下介绍oracle r12中文补丁的方式 如果你的系统除了支持英语外&#xff0c;还支持其他语言&#xff0c;比如中文&#xff0c;那你在下载补丁的时候除了下载Generic Platform版本外&#…

参考文献新国标GB/T 7714-2025的 biblatex 实现

参考文献新国标GB/T 7714-2025的biblatex实现 新版 GB/T 7714 目前正在修订和征求意见&#xff08;https://std.samr.gov.cn/gb/search/gbDetailed?id14CA9D282EB75AC8E06397BE0A0AEA2E&#xff09;。 根据已经呈现的草案&#xff0c;初步实现了biblatex样式(详见biblatex-gb…

Discuz!与DeepSeek的深度融合:打造智能网址导航新标杆

引言 在数字化信息爆炸的时代&#xff0c;网址导航网站作为用户获取优质资源、高效浏览互联网的重要入口&#xff0c;其信息筛选能力、用户体验和商业化潜力成为了决定其竞争力的核心要素。Discuz!作为国内应用广泛的社区论坛系统&#xff0c;以其强大的功能扩展性和用户管理能…

Linux424 chage密码信息 gpasswd 附属组

https://chat.deepseek.com/a/chat/s/e55a5e85-de97-450d-a19e-2c48f6669234

【低配置电脑预训练minimind的实践】

低配置电脑预训练minimind的实践 概要 minimind是一个轻量级的LLM大语言模型&#xff0c;项目的初衷是拉低LLM的学习门槛&#xff0c;让每个人都能从理解每一行代码开始&#xff0c; 从零开始亲手训练一个极小的语言模型。对于很多初学者而言&#xff0c;电脑配置仅能够满足日…

docker部署Ollama并简单调用模型

Ollama简介 Ollama 是一个开源的大型语言模型&#xff08;LLM&#xff09;平台&#xff0c;旨在让用户能够轻松地在本地运行、管理和与大型语言模型进行交互。 Ollama 提供了一个简单的方式来加载和使用各种预训练的语言模型&#xff0c;支持文本生成、翻译、代码编写、问答等…