第8课:For 循环与迭代器
所属模块:模块二:控制流与循环 难度:beginner 标签:for-loop, range, iteration
1. 学习目标
通过本课的学习,你将能够:
- 理解并编写基本的
for循环语句。 - 使用
range()函数生成数字序列以控制循环。 - 理解"可迭代对象"与"迭代器"的基本概念。
- 掌握
enumerate()和zip()等常用的迭代工具。
2. 核心概念
什么是 for 循环?
for 循环是Python中最常用的循环结构。它不同于 while 循环(需要一个条件判断),for 循环的设计理念是"对于序列中的每一个元素,执行一次循环体"。这使得它在遍历(如列表、字符串、字典)或处理已知次数的循环时极为简洁和直观。
想象一下,你有一个花名册(一个列表),你想依次叫到每个人的名字。for 循环就是那个自动帮你点名并通知对应同学的"点名员"。
可迭代对象与迭代器
- 可迭代对象:任何可以用
for循环遍历的对象都是可迭代对象,例如:list(列表)、tuple(元组)、str(字符串)、dict(字典)、set(集合),甚至一个打开的文件。它们的共同点是内部都实现了__iter__()方法。 - 迭代器:是一个可以记住遍历位置的对象。当你对一个可迭代对象调用
iter()函数时,就会得到一个迭代器。每次调用迭代器的next()函数,它就会返回下一个元素,直到所有元素都返回完毕,然后抛出StopIteration异常。
简单比喻:
- 可迭代对象就像一本花名册(数据源)。
- 迭代器就像一个专门点名的人(执行过程)。
for循环在后台为你自动完成了创建点名人(迭代器)并依次点名(调用next())的所有工作。
range() 函数
当你需要执行一个固定次数的循环(例如100次)时,手动创建一个包含100个数字的列表很麻烦。range() 函数就是为此而生的,它生成一个整数序列,常与 for 循环配合使用。
range(stop): 生成从0到stop-1的整数序列。range(start, stop): 生成从start到stop-1的整数序列。range(start, stop, step): 生成从start到stop-1,步长为step的整数序列。
# 生成 0, 1, 2, 3, 4
for i in range(5):
print(i)
3. 代码示例
示例1:遍历一个列表
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
# 传统方式(不推荐,但有助于理解)
for i in range(len(fruits)):
print(f"索引{i}的水果是: {fruits[i]}")
# Pythonic 方式(推荐)
print("\n使用直接遍历:")
for fruit in fruits:
print(f"我喜欢吃{fruit}")
输出:
索引0的水果是: 苹果
索引1的水果是: 香蕉
索引2的水果是: 橙子
索引3的水果是: 葡萄
使用直接遍历:
我喜欢吃苹果
我喜欢吃香蕉
我喜欢吃橙子
我喜欢吃葡萄
示例2:遍历字符串
message = "Hello"
for char in message:
if char == 'l':
print("找到了字母 'l'!")
else:
print(char)
输出:
H
e
找到了字母 'l'!
找到了字母 'l'!
o
示例3:使用 enumerate() 获取索引和值
当你需要同时获取元素的索引和值时,enumerate() 是最佳选择。
names = ["Alice", "Bob", "Charlie"]
# enumerate 会返回一个包含 (索引, 值) 的元组
for index, name in enumerate(names):
print(f"第 {index + 1} 位同学是 {name}")
输出:
第 1 位同学是 Alice
第 2 位同学是 Bob
第 3 位同学是 Charlie
示例4:使用 zip() 并行遍历多个序列
students = ["小明", "小红", "小华"]
scores = [85, 92, 78]
# zip 将两个序列"拉链式"配对
for student, score in zip(students, scores):
if score >= 80:
print(f"{student} 成绩优秀,得分为 {score}")
else:
print(f"{student} 需要努力,得分为 {score}")
输出:
小明 成绩优秀,得分为 85
小红 成绩优秀,得分为 92
小华 需要努力,得分为 78
4. 实践练习
练习1:数字求和
编写一个 for 循环,计算从 1 到 100(包含1和100)所有整数的和,并打印结果。
预期输出:
1到100的和是: 5050
练习2:寻找偶数
给定列表 numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],编写一个循环,将列表中所有的偶数替换为字符串 "偶数",最后打印修改后的列表。
预期输出:
[1, '偶数', 3, '偶数', 5, '偶数', 7, '偶数', 9, '偶数']
练习3:成绩等级评定(综合应用)
使用 enumerate 和 zip 函数。给定学生名单 names 和对应的分数列表 scores,遍历它们,并为每个学生打印如下格式的信息:"[序号] [学生姓名]: [分数] ([等级])"。
等级判定规则:
- 分数 >= 90: "A"
- 80 <= 分数 < 90: "B"
- 70 <= 分数 < 80: "C"
- 60 <= 分数 < 70: "D"
- 分数 < 60: "F"
names = ["张三", "李四", "王五", "赵六"]
scores = [95, 82, 76, 58]
# 请在这里编写你的代码
预期输出:
[1] 张三: 95 (A)
[2] 李四: 82 (B)
[3] 王五: 76 (C)
[4] 赵六: 58 (F)
5. 常见错误
-
混淆
range()的参数- 错误:
for i in range(1, 10)会循环9次(1到9),如果你想要10次,应该用range(1, 11)或range(10)。 - 记住:
range(start, stop)是 左闭右开 区间[start, stop)。
- 错误:
-
在循环中试图修改正在遍历的序列
my_list = [1, 2, 3, 4] for item in my_list: if item % 2 == 0: my_list.remove(item) # 危险!在遍历时修改列表长度会导致意外跳过元素。 print(my_list) # 结果可能是 [1, 3] 而不是预期的 [1, 3, 4]?- 正确做法:遍历序列的副本
my_list[:],或者使用列表推导式(后面会学)创建新列表。
- 正确做法:遍历序列的副本
-
忽略迭代器的"一次性"
- 文件对象和某些生成器(如
map(),filter()的结果)是迭代器,只能遍历一次。
nums = [1, 2, 3] iterator = iter(nums) list1 = list(iterator) # [1, 2, 3] list2 = list(iterator) # [] 已经耗尽了! - 文件对象和某些生成器(如
6. 小结
for循环 是Python中用于遍历可迭代对象的核心结构,语法为for item in iterable:。- 可迭代对象 是数据容器(如列表、字符串),迭代器 是负责逐个取出数据的工具。
for循环在后台自动管理迭代器。 range()用于生成数字序列,是控制循环次数的好帮手,注意其"左闭右开"的特性。enumerate()在遍历时提供索引和值,代码更清晰、高效。zip()可以同时并行遍历多个序列,非常适合处理关联数据。- 编写
for循环时,避免在循环体内修改你正在遍历的原始序列。
练习编辑器
python
Loading...