8·模块二:控制流与循环入门

For 循环与迭代器

for-looprangeiteration

第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): 生成从 0stop-1 的整数序列。
  • range(start, stop): 生成从 startstop-1 的整数序列。
  • range(start, stop, step): 生成从 startstop-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 循环,计算从 1100(包含1和100)所有整数的和,并打印结果。 预期输出:

1到100的和是: 5050

练习2:寻找偶数

给定列表 numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],编写一个循环,将列表中所有的偶数替换为字符串 "偶数",最后打印修改后的列表。 预期输出:

[1, '偶数', 3, '偶数', 5, '偶数', 7, '偶数', 9, '偶数']

练习3:成绩等级评定(综合应用)

使用 enumeratezip 函数。给定学生名单 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. 常见错误

  1. 混淆 range() 的参数

    • 错误:for i in range(1, 10) 会循环9次(1到9),如果你想要10次,应该用 range(1, 11)range(10)
    • 记住:range(start, stop)左闭右开 区间 [start, stop)
  2. 在循环中试图修改正在遍历的序列

    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[:],或者使用列表推导式(后面会学)创建新列表。
  3. 忽略迭代器的"一次性"

    • 文件对象和某些生成器(如 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...

继续学习

完成本课后,建议继续学习下一课「列表、字典与集合推导式」 以巩固所学知识。