本章摘要
- 核心目标:学会用
for循环让程序自动重复执行任务,告别复制粘贴 - 核心知识点:
for循环语法 /range()三种用法 / 遍历字符串与列表 /break跳出 /continue跳过 / 循环搭配if判断 - 实操产出:能独立写出九九乘法表、成绩批量统计、密码尝试拦截等实用小程序
- 前置基础:第 2 章
print/ 变量 /input,第 3 章if/elif/else条件判断
写在前面
第 3 章:我们让程序学会了"思考"——遇到不同条件走不同分支。但真实场景里,一次判断往往不够用。
比如你有 30 个学生的成绩要判断及格不及格,难道要写 30 段if?
再比如你想让程序打印 1 到 100,难道要敲 100 行print?
这一章你会认识 Python 里最常用的一个语法——for循环。它的作用只有一句话:让程序重复做同一件事,但每次用不同的数据。
学完这一章,你写 Python 代码的效率会突然翻好几倍。
一、for循环:让程序帮你数数
1.1 最简单的for循环
先看一个直觉最强的例子:
foriin[1,2,3,4,5]:print("第",i,"遍")运行输出:
第 1 遍 第 2 遍 第 3 遍 第 4 遍 第 5 遍这段代码在做什么?
for i in [1, 2, 3, 4, 5]:— 把方括号里的每个数字轮流取出来,塞进变量i- 缩进的那一行代码 — 每取一次,就执行一遍
也就是说:循环体执行了 5 次,每次i的值不一样。
1.2for循环的语法结构
for变量名in可迭代对象:循环体代码三个必须记住的点:
- 冒号
:— 结尾必须有,写掉就报语法错 - 缩进— 循环体必须缩进(默认 4 个空格),VS Code 会自动帮你缩
- 变量名任意— 常用
i、j、item、num,见名知意最好
💡
i是index(索引)的缩写,是编程界几十年的约定俗成。
1.3 循环变量名换成有意义的名字
scores=[88,76,95,62,100]forscoreinscores:print("这次得了",score,"分")score比i更能说明"这个变量装的是分数"。代码越长,好命名越重要。
二、range():Python 内置的"数字生成器"
上面的例子用[1, 2, 3, 4, 5]这种手写列表还行,但要循环 100 次呢?总不能手敲 100 个数字。
Python 内置了一个叫range()的函数,专门生成连续整数序列。
2.1range(n):生成 0 到 n-1
foriinrange(5):print(i)输出:
0 1 2 3 4注意两点:
- 从0开始,不是 1
- 到n-1结束,不包含n 本身
range(5)就是[0, 1, 2, 3, 4],一共 5 个数。这叫左闭右开——记住这四个字,后面切片、区间都是这个规则。
2.2range(start, stop):指定起止
foriinrange(1,6):print(i)输出:
1 2 3 4 5range(1, 6)=[1, 2, 3, 4, 5]——包含起点 1,不包含终点 6。
想让循环从 1 到 100,就写range(1, 101)。
2.3range(start, stop, step):带步长
# 打印 0 到 10 的所有偶数foriinrange(0,11,2):print(i)输出:
0 2 4 6 8 10第三个参数是步长,每次跳几个。步长可以是负数(倒着数):
foriinrange(10,0,-1):print(i)print("发射!")输出:
10 9 8 7 6 5 4 3 2 1 发射!一个 5 秒倒计时的雏形就有了。
2.4range()三种形式速查
| 写法 | 含义 | 生成的数字 |
|---|---|---|
range(5) | 0 到 4 | 0, 1, 2, 3, 4 |
range(2, 7) | 2 到 6 | 2, 3, 4, 5, 6 |
range(1, 10, 2) | 1 到 9,步长 2 | 1, 3, 5, 7, 9 |
range(10, 0, -1) | 10 到 1,倒着走 | 10, 9, 8, ..., 1 |
⚠️
range()只生成整数,不能生成小数。想要小数序列后面第 14 章会讲用numpy。
三、遍历字符串与列表
for循环不仅能配合range(),还能直接"翻"字符串和列表。
3.1 遍历字符串
name="Python"forchinname:print(ch)输出:
P y t h o n字符串在for眼里就是"一个个字符组成的队列",每次循环取一个字符。
3.2 遍历列表
fruits=["苹果","香蕉","橘子","西瓜"]forfruitinfruits:print("我喜欢吃",fruit)输出:
我喜欢吃 苹果 我喜欢吃 香蕉 我喜欢吃 橘子 我喜欢吃 西瓜3.3 循环里搭配if判断
真正的威力在于**for+if组合**——批量处理数据。
scores=[88,76,95,62,100,55,71]forscoreinscores:ifscore>=60:print(score,"及格 ✅")else:print(score,"不及格 ❌")输出:
88 及格 ✅ 76 及格 ✅ 95 及格 ✅ 62 及格 ✅ 100 及格 ✅ 55 不及格 ❌ 71 及格 ✅7 个学生的判断,代码只有 6 行——这就是循环的价值。
四、break与continue:循环的紧急开关
有时候我们不想把循环从头跑到尾——比如找到目标就想停,或者遇到脏数据想跳过。这时候需要两个关键字:break和continue。
4.1break:立刻终止整个循环
# 在 1 到 100 里找第一个能被 7 整除的数foriinrange(1,101):ifi%7==0:print("找到了:",i)break输出:
找到了: 7一旦break执行,循环立刻结束,后面的数字不再检查。
4.2continue:跳过本次,继续下一次
# 打印 1 到 10,但跳过所有偶数foriinrange(1,11):ifi%2==0:continueprint(i)输出:
1 3 5 7 9continue只是跳过当前这一轮的剩余代码,循环本身还在继续。
4.3breakvscontinue一图看懂
| 关键字 | 作用 | 记忆口诀 |
|---|---|---|
break | 立刻跳出整个循环 | “刹车、下车” |
continue | 跳过当前这一轮,进入下一轮 | “跳过、继续” |
五、Scratch 积木对照
Scratch 里的「重复执行 N 次」积木,就是 Python 的for循环。逻辑一模一样,只是形式变了。
| Scratch | Python | 说明 |
|---|---|---|
| 「重复执行 5 次」 | for i in range(5): | 循环 5 次 |
| 「重复执行到 [条件]」 | for + break | 满足条件就跳出 |
| 「对列表中每一项」 | for x in list: | 遍历列表 |
# Scratch「重复执行 10 次 → 说 你好」→ Python 对照foriinrange(10):print("你好")积木拖 10 次是一个循环,Python 敲两行也是一个循环,效率天差地别——这就是从图形化转到代码的收益。
六、综合实战案例:学生成绩批量统计器
6.1 需求描述
给一个班级 8 名学生的成绩列表,程序需要自动完成:
- 打印每个人的分数和及格状态
- 统计及格人数
- 计算全班平均分
- 找出最高分
6.2 完整源码
# ====== 学生成绩批量统计器 ======scores=[88,76,95,62,100,55,71,48]# 初始化统计变量pass_count=0# 及格人数total=0# 总分highest=0# 最高分print("="*30)print(" 班级成绩单")print("="*30)# 遍历每个分数forindexinrange(len(scores)):score=scores[index]student_no=index+1# 学号从 1 开始# 累加总分total=total+score# 判断及格ifscore>=60:status="及格 ✅"pass_count=pass_count+1else:status="不及格 ❌"# 更新最高分ifscore>highest:highest=scoreprint("学号",student_no,"|",score,"分 |",status)# 循环结束后计算平均分average=total/len(scores)print("="*30)print("班级总人数:",len(scores))print("及格人数:",pass_count)print("班级平均分:",round(average,2))print("班级最高分:",highest)print("="*30)6.3 运行输出
============================== 班级成绩单 ============================== 学号 1 | 88 分 | 及格 ✅ 学号 2 | 76 分 | 及格 ✅ 学号 3 | 95 分 | 及格 ✅ 学号 4 | 62 分 | 及格 ✅ 学号 5 | 100 分 | 及格 ✅ 学号 6 | 55 分 | 不及格 ❌ 学号 7 | 71 分 | 及格 ✅ 学号 8 | 48 分 | 不及格 ❌ ============================== 班级总人数: 8 及格人数: 6 班级平均分: 74.38 班级最高分: 100 ==============================6.4 分步拆解
第 1 步:定义数据和统计变量
scores=[88,76,95,62,100,55,71,48]pass_count=0total=0highest=0三个"计数器"变量在循环开始前必须初始化为 0——否则循环里pass_count + 1会因为pass_count未定义直接报错。
第 2 步:用range(len(scores))拿到"下标"
forindexinrange(len(scores)):score=scores[index]len(scores)返回列表长度,这里是 8range(8)生成0, 1, 2, ..., 7scores[index]通过下标取出对应的分数
为什么不直接for score in scores?因为我们还需要学号(下标 + 1),直接遍历值就拿不到位置信息。
💡 后面第 6 章我们会介绍
enumerate()——同时拿到下标和值的更优雅写法。
第 3 步:循环里边判断边累加
total=total+score# 累加总分ifscore>=60:pass_count=pass_count+1# 及格数 +1ifscore>highest:highest=score# 更新最高分这就是循环最经典的用法——每次迭代都在"叠加"数据。
第 4 步:循环结束后再算平均
average=total/len(scores)注意:平均分的计算必须写在循环外面(缩进要退回来)。如果写在循环里,就会每次都算一遍中间值,浪费又出错。
第 5 步:round()保留两位小数
round(average,2)round(数字, 位数)是 Python 内置的四舍五入函数,第二个参数指定保留几位小数。
七、常见报错速查表
| 报错信息 | 场景 | 原因 | 解决方法 |
|---|---|---|---|
SyntaxError: expected ':' | 写 for 循环 | 末尾漏了英文冒号: | 在range(...)后加冒号 |
IndentationError: expected an indented block | for 循环下一行 | 循环体没缩进 | 循环体缩进 4 个空格 |
TypeError: 'int' object is not iterable | for i in 5: | for 后面必须是可迭代对象(列表 / range / 字符串),不能是单个数字 | 改为for i in range(5): |
NameError: name 'total' is not defined | 循环里累加 | 累加变量循环前没有初始化 | 循环前先写total = 0 |
IndexError: list index out of range | scores[index] | 下标超出了列表长度 | 检查 range 范围是否和列表长度匹配 |
TypeError: object of type 'int' has no len() | len(88) | len()只能用在列表 / 字符串等,不能用在单个数字 | 检查传入的对象类型 |
八、本章小结
这一章你解锁了 Python 里最强的"重复干活"神器:
- ✅
for 变量 in 可迭代对象:— 循环基本语法 - ✅
range(n)/range(a, b)/range(a, b, step)— 三种生成数字的方式 - ✅ 遍历字符串、列表 — 一次取一个元素
- ✅
break立刻跳出、continue跳过本次 - ✅ 循环 +
if组合 — 批量处理数据的标准姿势 - ✅ 循环里累加计数 — 求和、计数、找最值的通用套路
有了for循环,你写 Python 从"一行一行做"进化到"一次说一遍规则,机器自己执行 N 次"——这是编程真正开始省力的分水岭。
往期回顾:
《Python 零基础入门:从积木到代码》专栏序
零基础学 Python 第1章 | 全平台装环境 + VS Code 配置 + 第一个 Hello World
零基础学 Python 第2章 | print 输出 + 变量赋值 + input 交互输入
零基础学 Python 第3章 | 条件判断:if / elif / else
下一章(第 5 章)会讲:
第 5 章 | while 循环与循环嵌套
for循环适合"次数已知"的场景,while循环适合"条件满足就一直做"的场景。附一个综合案例:猜数字小游戏——让程序陪你玩一把。
从"数着做"到"看条件做",你的程序会更有"随机应变"的能力。
文末资源区
| 资源 | 说明 |
|---|---|
Python 官方文档 ·for语句 | https://docs.python.org/zh-cn/3/tutorial/controlflow.html#for-statements |
Python 官方文档 ·range()函数 | https://docs.python.org/zh-cn/3/library/stdtypes.html#range |
| 本章配套源码 · chapter4_all.py | 关注梅雅达编程笔记,评论领资料 |
每节课都配套课后练习题与完整源码。代码报错、看不懂知识点,可在评论区粘贴问题,逐一解答!
欢迎关注梅雅达编程笔记,持续分享Python零基础学习内容