Python中的 for 与 迭代器
文章目录
- 一、`for` 循环的底层机制
- 示例:手动模拟 `for` 循环
- 二、可迭代对象 vs 迭代器
- 关键区别:
- 三、`for` 循环的典型应用场景
- 1. 遍历序列类型
- 2. 遍历字典
- 3. 结合 `range()` 生成数字序列
- 4. 遍历文件内容
- 四、迭代器的自定义实现
- 示例:生成斐波那契数列的迭代器
- 五、生成器(简化迭代器)
- 示例:生成偶数序列
- 六、迭代工具库 `itertools`
- 示例:合并多个迭代器
- 七、常见问题与最佳实践🐥🐥
- 1. 避免在迭代中修改集合
- 2. 使用 `enumerate()` 获取索引
- 3. 利用 `zip()` 并行遍历
- 总结
在 Python 中,
for
循环与迭代器(iterator)紧密结合,它们共同实现了对可迭代对象(iterable)的高效遍历。以下是详细解析及实际应用示例:
一、for
循环的底层机制
for
循环本质上是通过迭代器协议工作的:
- 自动调用
iter()
函数,将可迭代对象(如列表、字符串、字典)转换为迭代器。 - 反复调用
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 代码!
喵,就是这样~😼😼😼
相关文章:
Python中的 for 与 迭代器
文章目录 一、for 循环的底层机制示例:手动模拟 for 循环 二、可迭代对象 vs 迭代器关键区别: 三、for 循环的典型应用场景1. 遍历序列类型2. 遍历字典3. 结合 range() 生成数字序列4. 遍历文件内容 四、迭代器的自定义实现示例:生成斐波那契…...
上篇:深入剖析 BLE 底层物理层与链路层(约5000字)
引言 在无线通信领域,Bluetooth Low Energy(BLE)以其超低功耗、灵活的连接模式和良好的生态支持,成为 IoT 与可穿戴设备的首选技术。要想在实际项目中优化性能、控制功耗、保证可靠通信,必须对 BLE 协议栈的底层细节有深入了解。本篇将重点围绕物理层(PHY)与链路层(Li…...
ArcGIS Pro跨图层复制粘贴
在map视图中,点击selection中的Select按钮,保持选择状态。 点击需要复制的要素,保持选中状态。右击点击copy,或CtrlC进行复制。 在Clipboard下拉框中点击Paste Special,选择需要粘贴的图层后点击OK。...
今日CSS学习浮动->定位
------------------------------------------------------------------------------------------------------- CSS的浮动 float 属性用于创建浮动框,将其移动到一边,直到左边缘或右边缘触及包含块或另一个浮动框的边缘。 float 属性定义元素在哪个方向浮…...
性行为同意协议系统网站源码
性行为同意协议系统网站源码 一个用于创建、签署和管理性行为同意协议的 Web 应用程序。该应用允许用户在线创建详细的性行为同意协议,并通过数字签名方式进行签署,同时支持导出为 PDF 格式保存。 功能特性 创建自定义性同意协议 多步骤表单引导用户完…...
项目自动化测试
一.设计测试用例(细致全面) 二.先引入所需要的pom.xml依赖 1.selenium依赖 2.webdrivermanager依赖 3.commons-io依赖 编写测试用例–按照页面对用例进行划分,每个页面是Java文件,页面下的所有用例统一管理 三.common包(放入公用包) 类1utils 可以调用driver对象,访问url …...
可变形卷积(可以观察到变形图片的卷积)【DCNv1、DCNv2、DCNv3】
一、DCNv1——可以观察到扭曲的图片 1.传统卷积的问题 在普通的卷积操作中,比如 33 卷积,采样的位置总是固定的:就是中间一个点,四周八个点,整齐地排成一个小网格。 但现实中的图像并不整齐——比如猫的身体弯着、车…...
vue3,element ui框架中为el-table表格实现自动滚动,并实现表头汇总数据
基础用法不太明白的请参考官网文档 ;element ui Plus官网:Table 表格 | Element PlusA Vue 3 based component library for designers and developershttps://element-plus.org/zh-CN/component/table.html 1、添加一个基础表格 <template><e…...
Selenium 怎么加入代理IP,以及怎么检测爬虫运行的时候,是否用了代理IP?
使用selenium爬虫的时候,如果不加入代理IP,很容易会被网站识别,容易封号; 最近去了解了一下买代理ip,但是还是有一些不太懂的东西。 例如有了代理ip以后,怎么用在爬虫上,requests 和selenium的…...
【Python爬虫实战篇】--Selenium爬取Mysteel数据
任务:爬取我的钢铁网的钢材价格指数数据,需要输入时间和钢材类型 网站:钢铁价格指数_今日钢铁价格指数实时行情走势_我的钢铁指数 目录 1.环境搭建 2.打开网站 3.点击右侧按钮展开 4.点击需要的钢材数据 5.点击“按日查询” 6.输入日查…...
LLM学习笔记4——本地部署Docker、vLLM和Qwen2.5-32B-Instruct实现OpenManus的使用
系列文章目录 参考博客 参考博客 参考博客 参考博客 文章目录 系列文章目录前言一、OpenManus介绍二、环境搭建1.DockervLLM2.搭建OpenManus1)安装anaconda虚拟环境2)安装OpenManus3)下载并配置Qwen2.5-32B-Instruct模型4)配置与…...
aarcpy 列表函数的使用(1)
arcpy.ListFeatureClasses() 该函数用于列出指定工作空间中的所有要素类。可以通过通配符和过滤条件进一步筛选结果。 语法: python arcpy.ListFeatureClasses(wild_cardNone, feature_typeNone)• wild_card:用于筛选要素类名称的通配符,…...
maven工程中引入外部jar
1、引入模块下的jar 1.负责打包的模块,pom中加上这个插件,这个可以把外部jar包打入工程中。 <!-- 打包 --> <build><finalName>xxx-send-admin</finalName><resources><resource><directory>${project.base…...
C++智能指针上
一、裸指针 “裸指针”是最基础的,直接存储内存地址的指针类型。特点:①它本身没有自动的内存管理机制:如它不会自动释放内存,也不会检查是否指向有效的内存区域;②直接操作内存地址,不进行任何的边界检查&…...
flutter 中各种日志
日志方法对比 输出方式调试模式控制台输出发布模式控制台输出DevTools Logging 视图print()✅ 显示✅ 显示❌ 不显示debugPrint()✅ 显示✅ 显示❌ 不显示stderr.writeln()✅ 显示✅ 显示✅ 显示dart:developer.log()✅ 显示❌ 不显示✅ 显示 详细说明: print()&a…...
Java面试:从Spring Boot到微服务的全面考核
Java面试:从Spring Boot到微服务的全面考核 场景设定: 在一家互联网大厂的面试室内,严肃的面试官正准备开始对前来面试的赵大宝进行技术考核。赵大宝是一位自称在Java开发方面经验丰富的求职者,不过却是个搞笑的水货程序员。 第…...
安卓adb shell串口基础指令
目录 前言一、列出串口设备节点二、修改串口设备权限三、串口参数配置(stty命令)3.1 基本配置3.2 其他常用参数3.3 查看当前配置 四、数据收发操作4.1 发送数据4.2 接受数据 参考链接: 前言 在 Android 设备上,ADB提供了一系列命令用于与设备…...
大模型技术全景解析:从基础架构到Prompt工程
大模型技术全景解析:从基础架构到Prompt工程 引言 近年来,大型语言模型(LLMs)如GPT、BERT等取得了突破性进展,彻底改变了自然语言处理领域。本文将全面剖析大模型的核心技术要素,包括三要素构成、系统架构、机器学习范式演进、P…...
404页面精选(一)翻滚盒子
内容很详细,直接上代码 效果演示 源码 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>翻滚盒子</title><style>body {background: #000;h…...
LJF-Framework 第15章 想想搞点啥-若依管理系统兼容一下
LJF-Framework 第15章 想想搞点啥-若依管理系统兼容一下 一、下载后端源码 我们学习一下他的前后端分离的项目吧RuoYi-Vue,我看他有单独的Vue3版本的项目,我们就整这新的吧,向新新势力低头。 1、下载地址 git clone https://gitcode.com/yangzongzhuan/RuoYi-Vue.git2、…...
Hadoop基础知识
Hadoop 是由 Apache 基金会开发的开源分布式计算框架,主要用于处理海量数据的存储和计算问题。其核心设计基于 Google 的 MapReduce 编程模型和 GFS(Google File System),旨在通过集群化的廉价硬件实现高可靠性、高扩展性的大数据…...
第1讲:Transformers 的崛起:从RNN到Self-Attention
序列建模的演进之路 一、RNN( Recurrent Neural Networks):序列处理的开拓者 循环神经网络(RNN)是最早处理序列数据的深度学习结构。RNN的核心思想是在处理序列的每个时间步时保持一个"记忆"状态。 h_t tanh(W_x * x_t W_h * …...
经验分享 | 如何高效使用 `git commit --amend` 修改提交记录
背景 在「地面智能观测项目」这种多模块协作的物联网系统中,版本迭代频率高达每周3次。每个部署包(如v0.3.19)都包含硬件控制脚本、数据处理模块和部署工具,任何提交遗漏都可能导致部署失败。传统的新建提交方式会造成冗余记录&a…...
生物创新药研发为何要上电子实验记录本?
前言:数据驱动的生物创新药研发新范式 在精准医疗时代,生物创新药以其靶向性强、疗效确切的优势,成为肿瘤、自身免疫性疾病等复杂病症的核心治疗方案。国家"十四五" 规划明确将生物制药列为战略性新兴产业,各地政府纷纷…...
PH热榜 | 2025-04-24
1. Peek 标语:AI个人财务教练,帮你做出明智的财务决策。 介绍:Peek的人工智能助手能够主动进行财务检查,分析你的消费模式,并以一种细腻而积极的方式帮助你改善习惯。完全没有评判,也没有负罪感。就像为你…...
民锋视角下的节奏判断与资金行为建模
民锋视角下的节奏判断与资金行为建模 在市场节奏的研判中,行为模型始终是构建逻辑核心。以民锋为代表的一类研究视角,更关注的是微观结构中的资金行为痕迹,而非单一技术形态。 节奏并非由K线决定,而是由成交密度与换手效率共同塑…...
Debian服务器上JSP页面无法加载如何解决?
如果你在 Debian 服务器上部署 JSP 页面无法加载,可以按以下步骤排查和解决问题: 1. 确认安装了 Java 环境 JSP 需要 Java 支持,先确认 Java 是否安装并配置好: java -version如果未安装,使用如下命令安装 OpenJDK&…...
第三篇:Django创建表关系及生命周期流程图
第三篇:Django创建表关系及生命周期流程图 文章目录 第三篇:Django创建表关系及生命周期流程图一、Django中orm创建表关系一、数据库中的表关系二、创建表 二、Django请求生命周期流程图 一、Django中orm创建表关系 一、数据库中的表关系 我们可以通过…...
【玩泰山派】7、玩linux桌面环境xfce - (2)音视频,yt-dlp下载工具、parole播放器
文章目录 前言yt-dlpyt-dlp概述发展背景特点应用场景使用方式局限性 安装yt-dlpyt-dlp常用命令直接下载默认格式指定格式 查看视频所有分辨率下载指定分辨率参考 parole播放器使用Parole概述源码地址使用 前言 前面安装了ubuntu Xfce桌面环境(xubuntu-desktop),现在…...
【文献速递】NMR代谢组寻找预测DR发展的候选标志物
2024年7月5日,中山大学中山眼科中心王伟教授团队在Ophthalmology(IF:13.2)上发表了题为“Plasma Metabolomics Identifies Key Metabolites and Improves Prediction of Diabetic Retinopathy:Development and Validat…...
flask学习(1)
1.基本框架 from flask import Flask app Flask(__name__)app.route(/) def hello():return "<h1>Hello, Flask in Conda!</h1>"if __name__ __main__:app.run(host0.0.0.0, port5000, debugTrue) # 关键行! 在此基础上 from flask imp…...
详解springcloudalibaba采用prometheus+grafana实现服务监控
1.官网下载安装 prometheus和grafana promethus 官网:https://prometheus.io/ 1.下载windows版本安装包 2.双击启动 3.访问地址 http://localhost:9090 grafana 官网:https://grafana.com/ 1.下载windows版本安装包 2.启动 ,默认windo…...
Java查询数据库表信息导出Word
参考: POI生成Word多级标题格式_poi设置word标题-CSDN博客 1.概述 使用jdbc查询数据库把表信息导出为word文档, 导出为word时需要下载word模板文件。 已实现数据库: KingbaseES, 实现代码: 点击跳转 2.效果图 2.1.生成word内容 所有数据库合并 数据库不合并 2.2.生成文件…...
【金仓数据库征文】从云计算到区块链:金仓数据库的颠覆性创新之路
目录 一、引言 二、金仓数据库概述 2.1 金仓数据库的背景 2.2 核心技术特点 2.3 行业应用案例 三、金仓数据库的产品优化提案 3.1 性能优化 3.1.1 查询优化 3.1.2 索引优化 3.1.3 缓存优化 3.2 可扩展性优化 3.2.1 水平扩展与分区设计 3.2.2 负载均衡与读写分离 …...
Kotlin函数体详解:表达式函数体 vs 代码块函数体——使用场景与最佳实践
🧩 什么是表达式函数体(Expression Body)? 表达式函数体指的是使用 号直接返回一个表达式结果的函数写法。 ✅ 示例: fun add(x: Int, y: Int): Int x y这个函数的意思是:传入两个整数,返…...
【bug修复】一次诡异的接口数据显示 bug 排查之旅
一次诡异的接口数据显示 bug 排查之旅 在后端开发的日常中,总会遇到一些让人摸不着头脑的 bug,最近我就经历了一个颇为诡异的情况。接口接收到的响应 data 对象里字段明明都有值,但直接打印到控制台却显示空字符串,最后通过一个简…...
C++ RPC以及cmake
目录 1.RPC概念 2.RPC实现计算举例 3.python进行rpc调用 4.thrift实现分布式容器创建 5.阶段总结 6.cmake简介 7.cmake使用的一般步骤 8.cmake编译多层次文件 9.cmake编译多种交付件 1.RPC概念 # 1.需求分析 靠谱的商用项目不是只有一个可执行程序就够了的。好的商用…...
数字隔离器,筑牢AC-DC数字电源中的“安全防线”
在传统工业与现代科技高速交融的发展浪潮中,AC-DC数字电源作为电能转换的核心枢纽,不仅能将交流电精准地转化为直流电,还可通过软件编程实现电流限制、过温保护与设定输出电压等多种功能,是现代众多电力电子基础设施中不可或缺的精…...
使用“复合索引”和不使用“复合索引”的优化对比
目录 1.创建数据库 2.未创建索引 3.创建索引 4.结论 1.创建数据库 CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,customer_id INT,order_date DATE,total_amount DECIMAL(10, 2));插入数据: INSERT INTO orders (customer_id, order_date, t…...
.NETCore部署流程
资料下载:https://download.csdn.net/download/ly1h1/90684992 1.下载托管包托管捆绑包 | Microsoft Learn,下载后点击安装即可。 2.安装IIS 3.打开VS2022,新建项目,选择ASP.NET Core Web API 5.Program修改启动项,取…...
深入解析微软MarkitDown:原理、应用与二次开发指南
一、项目背景与技术定位 微软开源的MarkitDown并非简单的又一个Markdown解析器,而是针对现代文档处理需求设计的工具链核心组件。该项目诞生于微软内部大规模文档系统的开发实践,旨在解决以下技术痛点: 大规模文档处理性能:能够高…...
Rust 2025:内存安全革命与异步编程新纪元
Rust 2025 Edition通过区域内存管理、泛型关联类型和零成本异步框架三大革新,重新定义系统级编程语言的能力边界。本次升级不仅将内存安全验证效率提升80%,更通过异步执行器架构优化实现微秒级任务切换。本文从编译器原理、运行时机制、编程范式转型三个…...
Vue3 setup、计算属性、侦听器、响应式API
一、setup 一、setup 函数基础 作用:组合式 API 的入口,用于定义响应式数据、方法和生命周期钩子 执行时机:在 beforeCreate 之前调用,此时组件实例尚未创建 基本结构: export default {setup(props, context) {/…...
从内核到应用层:深度剖析信号捕捉技术栈(含sigaction系统调用/SIGCHLD回收/volatile内存屏障)
Linux系列 文章目录 Linux系列前言一、进程对信号的捕捉1.1 内核对信号的捕捉1.2 sigaction()函数1.3 信号集的修改时机 二、可重入函数三、volatile关键字四、SIGCHLD信号 前言 Linux系统中,信号捕捉是指进程可以通过设置信号处理函数来响应特定信号。通过信号捕捉…...
【KWDB 创作者计划】_嵌入式硬件篇---寄存器与存储器截断与溢出
文章目录 前言一、寄存器与存储器1. 定义与基本概念寄存器(Register)位置功能特点存储器(Memory)位置功能特点2. 关键区别3. 层级关系与协作存储层次结构协作示例4. 为什么需要寄存器性能优化指令支持减少总线竞争5. 其他寄存器类型专用寄存器程序计数器(PC)栈指针(SP)…...
Python torchvision.datasets 下常用数据集配置和使用方法
torchvision.datasets 提供了许多常用的数据集类,以下是一些常用方法(datasets中有大量数据集处理方法,这里仅展示了部分数据集处理方法)及其实现类的介绍、用法和输入参数解释: CIFAR CIFAR10 :包含 10 个…...
unity使用iTextSharp生成PDF文件
iTextSharp 可以在VS中工具下面得NuGet包管理器中下载 ,具体操作可以搜一下 很多 , 我直接把我得生成pdf代码附上 我这个是生成我一个csv文件内容和图片 using System.IO; using UnityEngine; using iTextSharp.text; using iTextSharp.text.pdf; using…...
django admin 添加自定义页面
在Django中,你可以通过多种方式向Django Admin添加自定义页面。以下是一些常见的方法: 方法1:使用ModelAdmin的get_urls()方法 如果你只是想添加一个简单的页面来展示信息,你可以在你的ModelAdmin类中重写get_urls()方法。 from…...
Java并发编程|CompletableFuture原理与实战:从链式操作到异步编排
🔥 本文系统讲解Java并发编程核心类CompletableFuture,涵盖线程池配置策略、异步编程实践、异常处理机制等关键技术。通过电商订单系统与物流调度实战案例,深度解析:1)CompletableFuture链式操作与异步编排 2)多线程任务聚合与结果处理 3)生产级异常处理方案 4)组合操…...
动态自适应分区算法(DAPS)设计流程详解
动态自适应分区算法(Dynamic Adaptive Partitioning System, DAPS)是一种通过实时监测系统状态并动态调整资源分配策略的智能算法,广泛应用于缓存优化、分布式系统、工业制造等领域。本文将从设计流程的核心步骤出发,结合数学模型…...