自动化办公-Python中的for循环
for
循环是 Python 中用于迭代(遍历)序列(如列表、元组、字典、集合、字符串)或其他可迭代对象的控制结构。它允许您逐一访问序列中的每个元素,并对其执行操作。以下是对 for
循环的详细介绍,包括语法、使用场景和示例。
1. 基本语法
for 变量 in 可迭代对象:# 执行的代码块操作
变量
:每次迭代时,从可迭代对象中取出的当前元素会赋值给这个变量。可迭代对象
:可以是列表、元组、字符串、字典、集合、生成器等。- 代码块:在
for
循环内部执行的代码,每次迭代都会执行一次。
示例:遍历列表
fruits = ['苹果', '香蕉', '樱桃']for fruit in fruits:print(fruit)
输出:
苹果
香蕉
樱桃
2. 遍历字符串
字符串也是可迭代对象,可以逐个字符进行遍历。
word = "Python"for char in word:print(char)
输出:
P
y
t
h
o
n
3. 使用 range()
函数
range()
函数生成一个整数序列,常用于需要按特定次数迭代的场景。
示例:使用 range()
进行计数
for i in range(5):print(f"当前计数: {i}")
输出:
当前计数: 0
当前计数: 1
当前计数: 2
当前计数: 3
当前计数: 4
示例:指定起始和结束值
for i in range(2, 6):print(i)
输出:
2
3
4
5
示例:指定步长
for i in range(0, 10, 2): //0-10以2为步长print(i)
输出:
0
2
4
6
8
4. 遍历字典
遍历字典时,可以选择遍历键、值或键值对。
示例:遍历字典的键
student_grades = {'Alice': 85, 'Bob': 92, 'Charlie': 78}for student in student_grades:print(student)
输出:
Alice
Bob
Charlie
示例:遍历字典的值
for grade in student_grades.values():print(grade)
输出:
85
92
78
示例:遍历字典的键值对
for student, grade in student_grades.items():print(f"{student} 的成绩是 {grade}")
输出:
Alice 的成绩是 85
Bob 的成绩是 92
Charlie 的成绩是 78
5. 嵌套 for
循环
可以在一个 for
循环内部嵌套另一个 for
循环,用于处理多维数据结构。
示例:遍历嵌套列表
matrix = [[1, 2, 3],[4, 5, 6],[7, 8, 9]
]for row in matrix:for element in row:print(element, end=' ')print() # 换行
输出:
1 2 3
4 5 6
7 8 9
6. 循环控制语句
break
语句
break
用于提前终止 for
循环。
for num in range(1, 10):if num == 5:breakprint(num)
输出:
1
2
3
4
continue
语句
continue
用于跳过当前迭代,继续下一次循环。
for num in range(1, 10):if num % 2 == 0:continueprint(num)
输出:
1
3
5
7
9
else
子句
for
循环可以配合 else
子句使用,当循环正常结束(未被 break
打断)时执行 else
代码块。
for num in range(1, 5):print(num)
else:print("循环正常结束")
输出:
1
2
3
4
循环正常结束
如果循环被 break
打断,else
子句不会执行。
for num in range(1, 5):if num == 3:breakprint(num)
else:print("循环正常结束")
输出:
1
2
7. 使用 enumerate()
函数
enumerate()
函数为可迭代对象生成索引和值的对。
示例:遍历列表并获取索引
fruits = ['苹果', '香蕉', '樱桃']for index, fruit in enumerate(fruits):print(f"索引 {index} 对应的水果是 {fruit}")
输出:
索引 0 对应的水果是 苹果
索引 1 对应的水果是 香蕉
索引 2 对应的水果是 樱桃
指定起始索引
for index, fruit in enumerate(fruits, start=1):print(f"索引 {index} 对应的水果是 {fruit}")
输出:
索引 1 对应的水果是 苹果
索引 2 对应的水果是 香蕉
索引 3 对应的水果是 樱桃
8. 列表推导式(List Comprehensions)
虽然不是严格意义上的 for
循环,但列表推导式利用 for
循环的思想,可以更简洁地生成列表。
示例:生成平方数列表
squares = [x**2 for x in range(1, 6)]
print(squares)
输出:
[1, 4, 9, 16, 25]
示例:筛选列表中的偶数
evens = [x for x in range(1, 11) if x % 2 == 0]
print(evens)
输出:
[2, 4, 6, 8, 10]
9. 遍历多个可迭代对象
使用 zip()
函数可以同时遍历多个可迭代对象。
示例:同时遍历两个列表
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]for name, age in zip(names, ages):print(f"{name} 的年龄是 {age}")
输出:
Alice 的年龄是 25
Bob 的年龄是 30
Charlie 的年龄是 35
10. 遍历文件中的每一行
for
循环常用于逐行读取和处理文件内容。
示例:读取并打印文件内容
假设有一个名为 example.txt
的文件,内容如下:
第一行
第二行
第三行
with open('example.txt', 'r', encoding='utf-8') as file:for line in file:print(line.strip()) # 使用 strip() 去除换行符
输出:
第一行
第二行
第三行
11. 高级用法
遍历生成器
for
循环可以遍历生成器对象,这对于处理大量数据或流式数据非常有用。
def generator_example():for i in range(1, 4):yield ifor num in generator_example():print(num)
输出:
1
2
3
使用 itertools
模块
itertools
提供了许多高级迭代工具,可以与 for
循环结合使用。
示例:无限循环(使用 cycle
)
import itertoolscount = 0
for item in itertools.cycle(['A', 'B', 'C']):if count >= 6:breakprint(item)count += 1
输出:
A
B
C
A
B
C
12. 实践示例
示例 1:计算列表中所有数字的总和
numbers = [10, 20, 30, 40, 50]
total = 0for num in numbers:total += numprint(f"总和是: {total}")
输出:
总和是: 150
示例 2:查找列表中的最大值
numbers = [5, 3, 9, 1, 7]
max_num = numbers[0]for num in numbers:if num > max_num:max_num = numprint(f"最大值是: {max_num}")
输出:
最大值是: 9
示例 3:将两个列表合并为字典
keys = ['name', 'age', 'city']
values = ['Alice', 25, 'New York']combined_dict = {}
for key, value in zip(keys, values):combined_dict[key] = valueprint(combined_dict)
输出:
{'name': 'Alice', 'age': 25, 'city': 'New York'}
示例 4:筛选出列表中的字符串并转换为大写
mixed_list = ['apple', 123, 'banana', 456, 'cherry']
filtered_list = []for item in mixed_list:if isinstance(item, str):filtered_list.append(item.upper())print(filtered_list)
输出:
['APPLE', 'BANANA', 'CHERRY']
13. 常见错误及调试
错误示例 1:忘记缩进
for i in range(3):
print(i) # 缩进错误,会引发 IndentationError
错误信息:
IndentationError: expected an indented block
正确写法:
for i in range(3):print(i)
错误示例 2:使用未定义的变量
for i in range(3):print(j) # 变量 j 未定义,会引发 NameError
错误信息:
NameError: name 'j' is not defined
错误示例 3:尝试修改遍历中的列表
fruits = ['苹果', '香蕉', '樱桃']for fruit in fruits:if fruit == '香蕉':fruits.remove(fruit)print(fruits)
输出:
['苹果', '樱桃']
注意:在遍历列表时修改列表可能导致意想不到的行为,建议使用列表推导式或遍历副本。
更安全的做法:
fruits = ['苹果', '香蕉', '樱桃']
fruits = [fruit for fruit in fruits if fruit != '香蕉']
print(fruits)
输出:
['苹果', '樱桃']
14. 总结
for
循环是 Python 中非常强大且常用的控制结构,能够高效地遍历各种可迭代对象。通过掌握 for
循环的基本语法、常见用法以及一些高级技巧,您可以在编写 Python 程序时处理复杂的数据操作任务。以下是一些关键点的总结:
- 基本语法:
for 变量 in 可迭代对象:
- 常见可迭代对象:列表、元组、字符串、字典、集合、生成器等。
- 控制语句:
break
、continue
和else
。 - 辅助函数:
range()
、enumerate()
和zip()
。 - 高级用法:列表推导式、生成器表达式和使用
itertools
模块。 - 嵌套循环:处理多维数据结构。
- 调试技巧:注意缩进、变量定义和遍历过程中不修改可迭代对象。
通过不断练习和应用,您将能够熟练掌握 for
循环,并在实际编程中高效地解决各种问题。
另外对于生成器:
**生成器(Generator)**是 Python 中一种用于创建迭代器的简便且高效的工具。它允许您在需要时生成值,而不是一次性生成所有值,从而节省内存并提高性能。os.walk()
确实是一个生成器函数,利用了生成器的特性来遍历文件系统。
1. 什么是生成器?
定义
生成器是一种特殊类型的迭代器,用于动态生成序列中的值。与列表不同,生成器不会一次性将所有值存储在内存中,而是根据需要逐个生成值。这使得生成器特别适合处理大型数据集或无限序列。
创建生成器的方法
有两种主要方法可以创建生成器:
-
生成器函数(Generator Function):
- 使用
yield
关键字的函数。 - 每次调用
yield
时,函数会暂停并返回一个值,保留其执行状态,以便下次继续执行。
- 使用
-
生成器表达式(Generator Expression):
- 类似于列表推导式,但使用圆括号
()
而不是方括号[]
。 - 更简洁,但功能上类似于生成器函数。
- 类似于列表推导式,但使用圆括号
生成器函数示例
def count_up_to(max):count = 1while count <= max:yield countcount += 1# 使用生成器函数
counter = count_up_to(5)
for num in counter:print(num)
输出:
1
2
3
4
5
生成器表达式示例
# 生成器表达式
squares = (x**2 for x in range(1, 6))for square in squares:print(square)
输出:
1
4
9
16
25
2. 生成器的特点
- 惰性求值(Lazy Evaluation):生成器按需生成值,不会预先生成所有值。这在处理大型数据集时尤其有用,可以节省大量内存。
- 状态保持:生成器在每次
yield
后会暂停执行,并在下一次迭代时恢复到暂停的位置。 - 一次性迭代:生成器只能被迭代一次,不能像列表那样多次访问。
- 高效性:由于不需要存储整个序列,生成器在处理大规模数据时更高效。
3. os.walk()
是生成器吗?
是的,os.walk()
是一个生成器函数。它利用生成器的特性来高效地遍历文件系统中的目录和文件。os.walk()
返回一个生成器对象,每次迭代生成一个三元组 (root, dirs, files)
,其中:
root
:当前遍历的目录路径。dirs
:当前目录下的子目录列表。files
:当前目录下的文件列表。
由于 os.walk()
是生成器函数,它不会一次性加载所有目录和文件,而是逐步生成每个目录的信息,这使得它在处理大型文件系统时非常高效。
示例:使用 os.walk()
遍历目录
import ossearch_root = '/path/to/search_root'for root, dirs, files in os.walk(search_root):print(f"当前目录: {root}")print(f"子目录: {dirs}")print(f"文件: {files}")print("---------------------------")
说明:
- 内存效率:即使
search_root
包含大量文件和子目录,os.walk()
也能高效地处理,因为它按需生成每个目录的内容。 - 适用场景:适用于需要遍历文件系统、查找特定类型的文件、统计文件数量等任务。
4. 生成器的优势与应用
优势
- 节省内存:适合处理大型数据集或无限序列。
- 提高性能:延迟计算可以减少不必要的计算和内存消耗。
- 简洁代码:生成器函数和表达式可以用较少的代码实现复杂的迭代逻辑。
应用场景
- 文件系统遍历:如
os.walk()
,适用于大规模目录的遍历。 - 数据流处理:处理实时数据流,如日志文件、网络数据等。
- 无限序列:生成无限的数列,如斐波那契数列、素数序列等。
- 协程与并发:在异步编程中,生成器可以用于协程的实现。
5. 自定义生成器函数示例
示例 1:生成斐波那契数列
def fibonacci():a, b = 0, 1while True:yield aa, b = b, a + b# 使用生成器
fib = fibonacci()
for _ in range(10):print(next(fib))
输出:
0
1
1
2
3
5
8
13
21
34
示例 2:读取大文件逐行处理
def read_large_file(file_path):with open(file_path, 'r', encoding='utf-8') as f:for line in f:yield line.strip()# 使用生成器
for line in read_large_file('large_file.txt'):process(line) # 假设有一个处理函数
说明:这种方法避免了一次性将整个文件加载到内存中,适用于处理非常大的文件。
6. 生成器与迭代器的关系
- 迭代器(Iterator):是一个对象,表示一个可迭代的序列,可以通过
__iter__()
和__next__()
方法进行迭代。 - 生成器:是一种特殊类型的迭代器,使用
yield
或生成器表达式创建。
所有生成器都是迭代器,但并非所有迭代器都是生成器。
示例:生成器 vs. 迭代器
# 生成器函数
def simple_generator():yield 1yield 2yield 3gen = simple_generator()# 迭代器使用
print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
print(next(gen)) # 输出: 3
# print(next(gen)) # 将引发 StopIteration 错误
7. 注意事项
- 一次性使用:生成器只能被迭代一次,迭代完毕后需要重新创建生成器对象。
- 异常处理:生成器在抛出
StopIteration
异常时结束迭代。可以在生成器函数中使用try...except
来处理异常。 - 内存管理:尽管生成器节省内存,但在生成大量数据时仍需注意潜在的内存消耗,特别是在生成器内部持有大量引用时。
8. 总结
- 生成器 是一种高效、节省内存的迭代工具,适用于处理大规模数据或需要动态生成数据的场景。
os.walk()
是一个生成器函数,利用生成器的特性高效地遍历文件系统,适合处理大型目录结构。- 通过理解和使用生成器,您可以编写更高效、简洁且功能强大的 Python 代码。
希望以上内容能帮助您更好地理解生成器及其在 Python 中的应用。如果您有任何进一步的问题,欢迎继续提问!
相关文章:

自动化办公-Python中的for循环
for 循环是 Python 中用于迭代(遍历)序列(如列表、元组、字典、集合、字符串)或其他可迭代对象的控制结构。它允许您逐一访问序列中的每个元素,并对其执行操作。以下是对 for 循环的详细介绍,包括语法、使用…...

Python_itertools
itertools itertools.count(start, step) 返回一个无限迭代器,从指定的start开始,每次增加step。 import itertools # 从1开始,每次增加1,输出前5个数 for i in itertools.count(1, 1):if i > 5:breakprint(i)运行结果&#…...

Apache Iceberg 数据类型参考表
Apache Iceberg 概述-链接 Apache Iceberg 数据类型参考表 数据类型描述实例方法注意事项BOOLEAN布尔类型,表示真或假true, false用于条件判断,例如 WHERE is_active true。确保逻辑条件的正确性。INTEGER32位有符号整数42, -7可用于计算、聚合…...

职责链模式
职责链模式 责任链(Chain of Responsibility)模式:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这…...

新品 | Teledyne FLIR IIS 推出Forge 1GigE SWIR 短波红外工业相机系列
近日,51camera的合作伙伴Teledyne FLIR IIS推出了新品Forge 1GigE SWIR 130万像素的红外相机。 Forge 1GigE SWIR系列的首款相机配备宽频带、高灵敏度的Sony SenSWIR™️ 130万像素IMX990 InGaAs传感器。这款先进的传感器采用5um像素捕捉可见光和SWIR光谱ÿ…...

深入MySQL:掌握索引、事务、视图、存储过程与性能优化
在掌握了MySQL的基本操作之后,你可能会遇到更复杂的数据管理和优化需求。本文将介绍一些MySQL的进阶特性,包括索引、事务、视图、存储过程和函数、以及性能优化等内容。通过学习这些高级功能,你可以更高效地管理和优化你的数据库。 索引 索…...

【WSL——Windows 上使用 Linux 环境】
引入 以前在windows上使用linux工具链,一般都要安装虚拟机(VMware/virtualBox)。虚拟机的缺点是,因为是完整的虚拟环境,消耗系统资源比较多。 windows自己开发了WSL功能,实现了虚拟机的功能,但是比虚拟机性…...

Redis:事务
什么是Redis事务 Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。 总结说&…...

策略模式的介绍和具体实现
❤ 作者主页:李奕赫揍小邰的博客 ❀ 个人介绍:大家好,我是李奕赫!( ̄▽ ̄)~* 🍊 记得点赞、收藏、评论⭐️⭐️⭐️ 📣 认真学习!!!🎉🎉 文章目录 策略接口三种…...

MySQL InnoDB MVCC数据结构分析
1、概述 MVCC(Multiversion Concurrency Control)多版本并发控制,通过维护不同的版本号,提供一种很好的并发控制技术,这种技术能够使读写操作不冲突,提升并发性能。 MySQL InnoDB存储引擎,在更…...

MySQL 8 查看 SQL 语句的执行进度
目录 1. 查询各阶段执行进度 (1)开启收集与统计汇总执行阶段信息的功能 (2)确定执行的SQL所属的thread_id (3)查询各阶段的执行进度 2. 查询SQL语句的整体执行进度 1. 查询各阶段执行进度 ࿰…...

OpenStack 部署实践与原理解析 - Ubuntu 22.04 部署 (DevStack)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言OpenStack 原理详解1. OpenStack 的架构2. OpenStack 的工作原理3. OpenStack 的 API4. 扩展性和模块化 OpenStack 安装方式比较1. DevStack2. Kolla3. OpenSta…...

【软件工程】可行性研究
一、目的 二、任务 三、步骤 四、结果:可行性研究报告 例题 选择题...

乌克兰因安全风险首次禁用Telegram
据BleepingComputer消息,乌克兰国家网络安全协调中心 (NCCC) 以国家安全为由,已下令限制在政府机构、军事单位和关键基础设施内使用 Telegram 消息应用程序。 这一消息通过NCCC的官方 Facebook 账号对外发布,在公告中乌…...

[SDX35]SDX35如何查看GPIO的Base值
SDX35 SDX35介绍 SDX35设备是一种多模调制解调器芯片,支持 4G/5G sub-6 技术。它是一个4nm芯片专为实现卓越的性能和能效而设计。它包括一个 1.9 GHz Cortex-A7 应用处理器。 SDX35主要特性 ■ 3GPP Rel. 17 with 5G Reduced Capability (RedCap) support. Backward compati…...

【Linux学习】【Ubuntu入门】2-1-1 vim编辑器设置
设置TAB键为4字节及显示行号 VIM编辑器默认TAB键为8空格,改为4空格 输入命令sudo vi /etc/vim/vimrc回车后输入密码按键盘下键到最后,按下“a”进入编辑模式,输入set ts4设置为4空格下一行输入set nu显示行号...

全栈开发(一):springBoot3+mysql初始化
1.开发环境准备 1.开发工具 2.jdk下载 官网下载java17 3.java环境变量配置 用户变量: ①.JAVA_HOME ②.path 4.mysql下载 b站随便搜 5.新建项目 6.maven配置 可以下载zip放到目录里 这里是配置好的 repository文件夹:为maven提供下载的文件存放…...

有关若依登录过程前端的对应处理学习
导言 在用C#搞完个后端后想用若依的前端做对接,不过很久没搞过若依了,想趁这个二次开发的过程记录熟悉一下登录的过程 过程 验证,在permission.js的路由守卫,这里在用户发起api请求时会验证用户的请求是否有token,对…...

django使用笔记6--docker部署
django使用笔记--docker部署 多环境配置创建环境变量配置文件静态资源配置dockerfile配置 由于服务器中python版本和依赖与本地开发环境不同,且centOS7中python及依赖安装更新较为麻烦,所以采用docker容器部署 多环境配置 多环境配置类似Spring中的多环…...

高性能、高可靠,MK SD卡让数据存储无忧!
文章目录 SD卡(Secure Digital Memory Card),作为当代数字生活中不可或缺的存储媒介,凭借其卓越的数据传输效率、灵活的热插拔功能以及惊人的存储容量,在多个领域大放异彩。从日常使用的智能手机、平板电脑到追求极致体…...

NetAssist测试TCP和UDP
由于在Windows下经常使用NetAssist.exe这款网络调试工具进行TCP、UDP的服务端、客户端的监听,对于需要编写各种通信协议的TCP服务端、客户端以及UDP通信程序来说是很方便的。下载地址:http://free.cmsoft.cn/download/cmsoft/assistant/netassist5.0.14.…...

mcuboot使用介绍
准备工作 硬件平台选择 确保你的微控制器单元(MCU)是 MCUboot 所支持的类型。查看 MCUboot 的文档或官方支持列表,了解其兼容的 MCU 系列和硬件平台。根据硬件平台的设计,将微控制器与相关的外设(如闪存、通信接口等&a…...

如何在 Linux 终端使用 GET 和 POST 请求
文章目录 1、GET请求基本请求带有请求头带有参数将响应保存成文件 2、POST请求基本请求发送JSON格式的POST请求体使用文件作为POST请求体使用时注意 1、GET请求 基本请求 在Linux中,发送GET请求通常使用 curl 命令,curl 的默认行为就是发送GET请求&…...

主从数据库同步配置详解(MySQL/MariaDB)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、环境准备与安装配置本地部署MySQLUbuntu 系统:CentOS 系统: MariaDBUbuntu 系统:CentOS 系统: 容器部署MySQ…...

台式机通过笔记本上网
概述: ①将wifi共享给网口 ②网口配置成自协商IP和DNS即可 一、背景 由于台式机只有网口,没得wifi网卡,因此想通过笔记本连wifi,再通过网线将笔记本和台式机连接起来,从而实现台式机通过笔记本的wifi上网,即让笔记本当台式机的…...

golang雪花算法实现64位的ID
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...

LeetCode 137. 只出现一次的数字 II
LeetCode 137. 只出现一次的数字 II 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例 1:…...

新书推荐——《深度学习精粹与PyTorch实践》
深度学习绝非不可窥探的黑箱!深入理解其模型和算法的实际运作机制,是驾驭并优化结果的关键。你无需成为数学专家或资深数据科学家,同样能够掌握深度学习系统内部的工作原理。 本书旨在通过深入浅出的方式,为你揭示这些原理,让你在理解和解释…...

Docker:解决开发运维问题的开源容器化平台
云计算de小白 Docker是一个开源的容器化平台,可以将应用程序及其依赖的环境打包成轻量级、可移植的容器。 Docker为什么这么受欢迎呢?原因很简单:Docker可以解决不同环境一致运行的问题,而且占用资源少,速度快。 所以好的东西…...

多线程计算π
1、实现单线程计算π 2、使用任务分解方法,使用2线程,并行计算π 3、使用数据分解方法,使用2线程,并行计算π 注意:在循环中使用以上计算π的公式,n取值为1到Int.Max 问题1: import java.lang.*;public class Thread1 extends Thread{@Overridepublic void run(){l…...