feat(python基础): 新增循环与字符串教学课程

This commit is contained in:
zhiye.sun
2026-07-27 13:38:25 +08:00
parent 84d96caa6e
commit 96e4b696e0
7 changed files with 1535 additions and 5 deletions

View File

@@ -0,0 +1,488 @@
# 第 1-6 课:循环
## 一、本课目标
完成本课后,你应该能够:
1. 解释循环为什么能减少重复代码;
2. 使用 `for` 循环按照指定次数重复执行代码;
3. 使用 `range()` 生成整数序列;
4. 使用 `while` 在条件成立期间重复执行;
5. 使用计数器记录执行次数;
6. 使用累加器汇总一组数据;
7. 在循环中结合 `if` 进行判断;
8. 使用 `break` 提前结束循环;
9. 使用 `continue` 跳过本次循环;
10. 识别并避免常见的死循环。
## 二、前置知识
开始本课前,你应该已经掌握:
- 变量与基础数据类型;
- 数字计算和比较运算;
- `if...elif...else` 条件判断;
- `input()` 和类型转换;
- 代码块需要使用四个空格缩进。
## 三、为什么需要循环
如果要输出五次学习提醒,可以重复写五行:
```python
print("开始学习 Python")
print("开始学习 Python")
print("开始学习 Python")
print("开始学习 Python")
print("开始学习 Python")
```
这种写法存在明显问题:
- 重复代码很多;
- 修改文字时要修改多个位置;
- 执行次数较大时无法手工编写;
- 容易漏写或写错。
循环Loop可以让一段代码重复执行
```python
for count in range(5):
print("开始学习 Python")
```
循环的核心思想是:让计算机负责重复,人只需要描述重复规则。
## 四、`for` 循环
`for` 循环适合处理“已经知道重复次数”或“依次处理一组数据”的场景。
基本结构:
```python
for 循环变量 in 可迭代对象:
重复执行的代码
```
第一次接触“可迭代对象”时,可以先把它理解为能够依次提供数据的对象。字符串、列表和 `range()` 都可以依次提供数据。
示例:
```python
for count in range(3):
print("正在进行 Agent 学习打卡")
```
输出三次相同内容。
每次循环时,`range(3)` 会依次提供一个整数,并临时保存到循环变量 `count` 中。
## 五、认识 `range()`
`range()` 用于表示一个整数范围,经常与 `for` 配合。
### 5.1 `range(结束值)`
```python
for number in range(5):
print(number)
```
输出:
```text
0
1
2
3
4
```
关键规则:从 `0` 开始,包含开始值,不包含结束值。
因此 `range(5)` 提供 5 个整数,但最后一个整数是 `4`。这种“不包含结束值”的规则在 Python 中非常常见。
### 5.2 `range(开始值, 结束值)`
```python
for day in range(1, 6):
print(day)
```
输出 `1``5``6` 仍然不包含在范围中。
如果希望显示“第 1 次”到“第 5 次”,`range(1, 6)` 通常比 `range(5)` 更直观。
### 5.3 `range(开始值, 结束值, 步长)`
步长表示每次增加多少:
```python
for number in range(0, 11, 2):
print(number)
```
输出:
```text
0
2
4
6
8
10
```
步长也可以是负数:
```python
for number in range(5, 0, -1):
print(number)
```
输出从 `5``1`,可用于倒计时。
## 六、使用循环变量
循环变量会在每次循环时保存当前数据:
```python
for day in range(1, 4):
print(f"{day} 天:完成 Python 学习")
```
输出:
```text
第 1 天:完成 Python 学习
第 2 天:完成 Python 学习
第 3 天:完成 Python 学习
```
循环变量应使用有意义的名称,例如 `day``task_number`,避免长期使用难以理解的 `a``x`
## 七、遍历字符串
`for` 也能依次取得字符串中的每个字符:
```python
for character in "Agent":
print(character)
```
输出:
```text
A
g
e
n
t
```
这种“从头到尾依次取出数据”的操作称为遍历Traversal。以后学习列表、字典和文件时会经常使用遍历。
## 八、计数器
计数器Counter是用来记录次数的变量。
```python
completed_count = 0
for task_number in range(1, 6):
completed_count += 1
print(f"已完成 {completed_count} 个任务")
```
执行过程:
1. 循环前把计数器初始化为 `0`
2. 每次循环执行 `completed_count += 1`
3. 循环五次后,计数器变为 `5`
初始化必须写在循环外。如果写在循环内,每次都会重新变回 `0`
## 九、累加器
累加器Accumulator用于把多次产生的数值汇总起来。
```python
total_hours = 0.0
for day in range(1, 6):
daily_hours = float(input(f"请输入第 {day} 天的学习小时数:"))
total_hours += daily_hours
print(f"总学习时间:{total_hours} 小时")
```
`total_hours` 的变化过程可能是:
```text
初始值0.0
第 1 天后2.0
第 2 天后3.5
第 3 天后6.0
```
计数器通常每次增加固定值;累加器通常加入每次得到的实际数据。
## 十、循环与条件判断结合
循环中可以使用 `if`
```python
passed_count = 0
for score in range(55, 101, 15):
if score >= 60:
passed_count += 1
print(f"{score} 分:通过")
else:
print(f"{score} 分:未通过")
print(f"通过数量:{passed_count}")
```
注意缩进层级:
- `for` 内部缩进一级;
- `if` 内部再缩进一级;
- 回到循环外时取消全部循环缩进。
## 十一、`while` 循环
`while` 的中文含义是“当……时”。只要条件为 `True`,循环就会继续。
基本结构:
```python
while 条件:
重复执行的代码
```
示例:
```python
current_day = 1
while current_day <= 3:
print(f"完成第 {current_day} 天学习")
current_day += 1
```
执行过程:
1. `current_day` 初始为 `1`
2. 判断 `current_day <= 3`,成立则执行循环;
3. 输出后把 `current_day` 增加 `1`
4. 回到条件处重新判断;
5.`current_day` 变为 `4` 时,条件为 `False`,循环结束。
## 十二、`for` 和 `while` 如何选择
通常可以这样判断:
- 已知需要重复多少次:优先考虑 `for`
- 不知道次数,只知道结束条件:优先考虑 `while`
示例场景:
```text
依次处理 7 天学习记录 → for
重复询问密码直到输入正确 → while
输出 1 到 100 → for
余额大于 0 时继续扣费 → while
```
两者有时可以互相改写,但应选择更能表达业务意图的方式。
## 十三、避免死循环
死循环Infinite Loop是无法自然结束的循环。
错误示例:
```text
current_day = 1
while current_day <= 3:
print(current_day)
```
循环中没有修改 `current_day`,条件会一直为 `True`,程序不断输出 `1`
编写 `while` 时必须检查:
1. 条件中的变量是否会发生变化;
2. 变化方向是否会逐渐接近结束条件;
3. 是否存在明确的退出方式。
如果程序意外进入死循环,可以在终端中按 `Ctrl + C` 尝试停止。
## 十四、使用 `break` 提前结束循环
`break` 表示立即结束当前循环:
```python
while True:
command = input("请输入命令,输入 exit 结束:")
if command == "exit":
break
print(f"正在处理命令:{command}")
print("程序已结束")
```
`while True` 本身会无限循环,但遇到 `break` 后可以退出。只有存在清晰退出条件时,才应使用这种结构。
`break` 只结束它所在的最近一层循环,不会直接结束整个 Python 程序。
## 十五、使用 `continue` 跳过本次循环
`continue` 表示跳过本次循环剩余代码,直接开始下一次循环:
```python
for day in range(1, 6):
if day == 3:
continue
print(f"记录第 {day} 天学习数据")
```
第 3 天不会输出,其他天正常输出。
可以把两者简单区分为:
- `break`:整个循环到此结束;
- `continue`:只跳过当前这一次,循环还会继续。
## 十六、嵌套循环初步认识
循环内部还可以包含循环:
```python
for week in range(1, 3):
for day in range(1, 4):
print(f"{week} 周,第 {day}")
```
外层循环每执行一次,内层循环都会完整执行三次,因此一共输出 `2 × 3 = 6` 行。
嵌套循环容易增加理解和运行成本。本课只要求看懂简单结构,练习不强制使用。
## 十七、运行本课示例
在 PowerShell 中执行:
```powershell
cd D:\Code\Python\01_python基础\1_6_循环
python loops.py
```
示例会演示:
- `range()` 的三种常见形式;
- 计数和累加;
- 循环结合条件判断;
- `while` 的变量更新;
- `break``continue`
示例不需要用户输入,可以直接运行并对照注释观察结果。
## 十八、常见错误
### 18.1 忘记冒号
`for``while` 行末都必须使用英文冒号 `:`
### 18.2 循环体没有缩进
属于循环的代码必须统一缩进四个空格。
### 18.3 `range()` 结束值理解错误
`range(1, 5)` 提供 `1、2、3、4`,不包含 `5`
### 18.4 把计数器初始化写在循环内
这样每次循环都会重置,无法正确累计。
### 18.5 `while` 忘记更新条件变量
这很可能造成死循环。
### 18.6 混淆 `break` 与 `continue`
`break` 结束循环,`continue` 只跳过当前一次。
### 18.7 循环变量命名没有含义
优先使用 `day``task_number` 等名称,帮助读者理解当前遍历的数据。
## 十九、课堂练习
打开 `practice.py`完成“Agent 学习打卡统计器”。程序需要收集连续多天的学习时长,统计总时长、有效学习天数和达标情况。
运行命令:
```powershell
python practice.py
```
建议先使用以下数据测试:
```text
计划打卡天数5
第 1 天2
第 2 天0
第 3 天1.5
第 4 天:-1
第 5 天3
```
约定:
- `-1` 表示本次数据无效,使用 `continue` 跳过;
- `0` 是有效记录,但不算完成学习;
- 大于 `0` 算一个有效学习日;
- 累计学习时长达到 `5` 小时视为总目标达标。
使用上述数据时,预期总时长为 `6.5` 小时,有效学习日为 `3` 天,无效记录为 `1` 条,总目标达标。
## 二十、思考题
1. `range(5)` 会提供哪些整数?
2. 为什么 `range(1, 6)` 可以表示第 1 到第 5 次?
3. 计数器与累加器有什么区别?
4. 哪些场景更适合使用 `while`
5. `break``continue` 有什么区别?
6. `while` 循环为什么容易出现死循环?
7. 循环中的 `if` 为什么通常会比循环多一级缩进?
## 二十一、本课小结
- 循环用于重复执行代码;
- `for` 适合已知次数或依次处理数据的场景;
- `range()` 包含开始值,不包含结束值;
- 计数器记录次数,累加器汇总数值;
- `while` 在条件为真时持续执行;
- `while` 中必须确保条件最终能够变为假;
- `break` 提前结束循环;
- `continue` 跳过当前一次循环;
- 循环可以与条件判断结合,实现更真实的业务逻辑。
## 二十二、验收标准
- [ ] 能使用 `for``range()` 重复执行代码;
- [ ] 能解释 `range()` 为什么不包含结束值;
- [ ] 能使用计数器和累加器;
- [ ] 能在循环中使用条件判断;
- [ ] 能编写可以正常结束的 `while` 循环;
- [ ] 能区分 `break``continue`
- [ ] 能完成并运行 `practice.py`
- [ ] 能使用建议数据得到正确统计结果;
- [ ] 能回答七道思考题。

View File

@@ -0,0 +1,103 @@
# 第 1-6 课示例:循环
#
# 本文件依次演示 for、range()、计数器、累加器、while、break 和 continue。
# 每段示例都会直接运行,不要求用户输入,便于重复观察结果。
# 一、使用 range(结束值)
# range(3) 依次提供 0、1、2不包含结束值 3。
for number in range(3):
print(f"range(3) 当前数字:{number}")
# 二、指定开始值和结束值
# range(1, 4) 依次提供 1、2、3适合显示自然的次数编号。
for day in range(1, 4):
print(f"{day} 天:完成 Python 学习")
# 三、指定步长
# 从 0 开始,每次增加 2在到达 11 前结束。
for even_number in range(0, 11, 2):
print(f"当前偶数:{even_number}")
# 四、遍历字符串
# for 会依次取得字符串中的每一个字符。
for character in "Agent":
print(f"当前字符:{character}")
# 五、使用计数器
# 计数器必须在循环外初始化,否则每次循环都会重新变为 0。
completed_count = 0
for task_number in range(1, 6):
completed_count += 1
print(f"完成第 {task_number} 个任务")
print(f"任务完成总数:{completed_count}")
# 六、使用累加器
# daily_hours 表示五天的学习时长。
# 列表会在后续课程详细讲解,本例只需知道 for 能依次取得其中的数字。
daily_hours = [2.0, 1.5, 0.0, 2.5, 3.0]
total_hours = 0.0
for hours in daily_hours:
total_hours += hours
print(f"五天总学习时长:{total_hours} 小时")
# 七、循环结合条件判断
# 只有学习时长大于 0 的记录才算有效学习日。
effective_days = 0
for hours in daily_hours:
if hours > 0:
effective_days += 1
print(f"有效学习日:{effective_days}")
# 八、while 循环
# 每次循环末尾增加 current_day确保条件最终会变为 False。
current_day = 1
while current_day <= 3:
print(f"while 正在处理第 {current_day}")
current_day += 1
# 九、使用 continue 跳过无效数据
# -1 表示无效记录;遇到它时跳过本次循环的剩余代码。
learning_records = [2.0, -1.0, 1.5, 0.0]
valid_total_hours = 0.0
for hours in learning_records:
if hours == -1:
print("发现无效记录,本次跳过")
continue
valid_total_hours += hours
print(f"排除无效记录后的总时长:{valid_total_hours} 小时")
# 十、使用 break 提前结束循环
# 当 task_number 等于 4 时结束循环,因此不会处理第 4、5 个任务。
for task_number in range(1, 6):
if task_number == 4:
print("收到停止信号,提前结束任务循环")
break
print(f"正在处理第 {task_number} 个任务")
# 十一、简单嵌套循环
# 外层循环执行两次;每次都会让内层循环完整执行三次。
for week in range(1, 3):
for day in range(1, 4):
print(f"{week} 周,第 {day}")

View File

@@ -0,0 +1,96 @@
# 第 1-6 课课堂练习Agent 学习打卡统计器
#
# 完成要求:
# 1. 根据注释使用 for、range()、if、continue、计数器和累加器。
# 2. 输入内容需要转换为正确的数字类型。
# 3. 使用有意义的英文蛇形变量名。
# 4. 注意冒号和四个空格缩进。
# 5. 不要删除题目注释。
# 6. 完成后使用题目提供的数据检查结果。
# 练习一:接收计划打卡天数。
# 使用 int() 转换,并保存到 planned_days。
# 练习二:在循环开始前创建三个统计变量:
# 1. total_hours总学习时长初始值为 0.0
# 2. effective_days有效学习日数量初始值为 0
# 3. invalid_records无效记录数量初始值为 0。
# 练习三:使用 for 和 range() 循环 planned_days 次。
# 建议让循环变量 day 从 1 开始,这样提示语可以直接显示“第几天”。
# 注意range() 的结束值不包含在结果中,需要自行计算正确结束值。
# 练习四:在循环中接收当天学习小时数。
# 提示语应包含当前 day例如“请输入第 1 天的学习小时数”。
# 使用 float() 转换,并保存到 daily_hours。
# 练习五:在循环中判断 daily_hours 是否等于 -1。
# 如果等于 -1
# 1. invalid_records 增加 1
# 2. 输出“本条记录无效,已跳过”;
# 3. 使用 continue 跳过本次循环剩余代码。
# 练习六:对于没有被 continue 跳过的有效记录:
# 1. 把 daily_hours 累加到 total_hours
# 2. 如果 daily_hours 大于 0让 effective_days 增加 1
# 3. 如果 daily_hours 等于 0输出“今天没有完成学习”。
# 练习七:循环结束后,判断总目标是否达标。
# total_hours 大于或等于 5 时target_reached 为 True否则为 False。
# 请直接使用比较运算生成布尔值,不必使用 if 分别赋值。
# 练习八:使用字符串乘法输出 30 个等号,再使用 f-string 输出统计报告:
# 1. 计划打卡天数 planned_days
# 2. 总学习时长 total_hours
# 3. 有效学习日 effective_days
# 4. 无效记录 invalid_records
# 5. 总目标是否达标 target_reached。
# 练习九:使用 if...else 输出最终建议:
# - target_reached 为 True输出“学习总时长已达标请保持节奏。”
# - target_reached 为 False输出“学习总时长尚未达标请继续努力。”
# 练习十:额外完成一个独立的 while 循环。
# 1. 创建 review_count初始值为 1
# 2. 当 review_count 小于或等于 3 时,输出“正在进行第几次复习”;
# 3. 每次循环末尾让 review_count 增加 1
# 4. 确保循环能够正常结束。
# 第一次运行请使用以下数据:
# 计划打卡天数5
# 第 1 天2
# 第 2 天0
# 第 3 天1.5
# 第 4 天:-1
# 第 5 天3
#
# 预期结果:
# total_hours = 6.5
# effective_days = 3
# invalid_records = 1
# target_reached = True
# while 循环依次输出第 1、2、3 次复习,然后正常结束。
# 第二次运行可以测试未达标情况:
# 计划打卡天数3
# 第 1 天1
# 第 2 天0
# 第 3 天2
#
# 预期结果:
# total_hours = 3.0
# effective_days = 2
# invalid_records = 0
# target_reached = False
# 完成后进行自查:
# 1. for 循环是否正好执行 planned_days 次;
# 2. -1 是否只增加无效记录,没有加入总时长;
# 3. 0 是否加入总时长,但没有增加有效学习日;
# 4. continue 是否位于无效数据分支中;
# 5. 统计变量是否都在循环外初始化;
# 6. while 循环是否能够在三次后正常结束。