feat: 初始化 Python 零基础教学课程

This commit is contained in:
zhiye.sun
2026-07-22 16:42:56 +08:00
commit 84d96caa6e
18 changed files with 3156 additions and 0 deletions

View File

@@ -0,0 +1,472 @@
# 第 1-5 课:条件判断
## 一、本课目标
完成本课后,你应该能够:
1. 解释条件判断为什么能让程序作出不同选择;
2. 使用 `if` 在条件成立时执行代码;
3. 使用 `if...else` 处理两种互斥情况;
4. 使用 `if...elif...else` 处理多个分支;
5. 正确书写英文冒号和四个空格缩进;
6. 使用比较运算符和逻辑运算符组成条件;
7. 理解条件顺序为什么会影响最终结果;
8. 使用嵌套条件处理有先后依赖的判断;
9. 编写一个能够根据输入给出不同结论的程序。
## 二、前置知识
开始本课前,你应该已经掌握:
- 使用 `input()` 接收用户输入;
- 使用 `int()``float()` 转换数据;
- 使用比较运算符得到 `True``False`
- 使用 `and``or``not` 组合条件;
- 使用 f-string 输出变量。
## 三、为什么需要条件判断
前面的程序会从上到下执行每一行代码。即使我们计算出了布尔结果,程序也只是把它显示出来:
```python
score = 80
is_passed = score >= 60
print(is_passed)
```
真实程序通常需要根据结果执行不同操作,例如:
- 分数达到 60 分时显示“通过”;
- 密码正确时允许登录;
- 库存不足时拒绝下单;
- 学习任务完成后进入下一课;
- 接口调用失败时显示错误信息。
条件判断让程序拥有“如果发生某种情况,就执行某段代码”的能力。
## 四、最简单的 `if`
`if` 的中文含义是“如果”。基本结构如下:
```python
if 条件:
条件成立时执行的代码
```
示例:
```python
score = 80
if score >= 60:
print("本次考核通过。")
```
执行过程:
1. Python 计算 `score >= 60`
2. 结果为 `True`,因此执行缩进的 `print()`
3. 如果结果为 `False`,缩进代码会被跳过;
4. 程序继续执行条件结构后面的代码。
## 五、冒号与缩进
Python 使用缩进表示哪些代码属于某个条件分支。
正确写法:
```python
if score >= 60:
print("通过")
print("可以继续下一阶段")
print("评估结束")
```
两条缩进的 `print()` 都属于 `if`。最后一条没有缩进,因此无论条件是否成立都会执行。
### 5.1 冒号
条件末尾必须使用英文半角冒号 `:`
```python
if score >= 60:
```
不能使用中文冒号 ``,也不能漏写冒号。
### 5.2 四个空格
Python 官方风格通常使用四个空格作为一级缩进。PyCharm 按下 Tab 键时,一般会自动生成合适的缩进。
同一个代码块中的代码必须保持相同缩进:
```text
if score >= 60:
print("通过")
print("缩进不一致")
```
这会产生 `IndentationError`,中文可以理解为“缩进错误”。
## 六、使用 `if...else` 处理两种情况
`else` 表示“否则”。当 `if` 条件不成立时,执行 `else` 分支:
```python
score = 55
if score >= 60:
print("本次考核通过。")
else:
print("本次考核未通过。")
```
`if``else` 只会执行其中一个分支,不会同时执行。
执行逻辑可以表示为:
```text
条件是否成立?
├── 是 → 执行 if 分支
└── 否 → 执行 else 分支
```
## 七、使用 `if...elif...else` 处理多个分支
`elif` 是 else if 的缩写,表示“否则如果”。
```python
score = 85
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 60:
print("合格")
else:
print("需要继续练习")
```
Python 会从上到下检查条件:
1. 检查 `score >= 90`,结果为 `False`
2. 检查 `score >= 80`,结果为 `True`
3. 执行“良好”;
4. 跳过后面的其他分支。
整组结构最多执行一个分支。
## 八、条件顺序非常重要
错误顺序示例:
```python
score = 95
if score >= 60:
print("合格")
elif score >= 90:
print("优秀")
```
虽然 95 分符合“优秀”,但第一个条件 `score >= 60` 已经成立,后面的分支不会再检查,最终只会输出“合格”。
处理分数区间时,通常从要求最高、范围最窄的条件开始:
```python
if score >= 90:
print("优秀")
elif score >= 60:
print("合格")
else:
print("未通过")
```
## 九、条件可以直接使用布尔变量
如果变量本身已经是布尔值,可以直接作为条件:
```python
practice_finished = True
if practice_finished:
print("练习已完成。")
else:
print("请先完成练习。")
```
不推荐重复比较:
```python
if practice_finished == True:
```
直接写 `if practice_finished:` 更简洁,也符合 Python 常见风格。
判断布尔值为假时,可以使用 `not`
```python
if not practice_finished:
print("请先完成练习。")
```
## 十、组合多个条件
### 10.1 使用 `and`
只有课程和练习都完成时,才能进入下一课:
```python
course_finished = True
practice_finished = True
if course_finished and practice_finished:
print("可以进入下一课。")
else:
print("当前课程尚未完成。")
```
### 10.2 使用 `or`
允许使用 PyCharm 或 VS Code
```python
uses_pycharm = True
uses_vscode = False
if uses_pycharm or uses_vscode:
print("已经具备代码编辑器。")
else:
print("请先安装代码编辑器。")
```
### 10.3 使用括号提高可读性
```python
if (score >= 60) and practice_finished:
print("考核通过。")
```
简单比较周围的括号可以省略,但条件较长时,括号能帮助读者快速理解组合关系。
## 十一、连续区间判断
判断一个数字是否处于某个范围,可以使用 `and`
```python
age = 20
if age >= 18 and age <= 60:
print("年龄在 18 到 60 之间。")
```
Python 还支持更接近数学写法的链式比较:
```python
if 18 <= age <= 60:
print("年龄在 18 到 60 之间。")
```
两种写法表达相同含义。链式比较是 Python 中常见且清晰的写法。
## 十二、嵌套条件判断
一个条件分支内部还可以包含另一个条件判断这称为嵌套Nesting
```python
account_enabled = True
password_correct = True
if account_enabled:
if password_correct:
print("登录成功。")
else:
print("密码错误。")
else:
print("账户已停用。")
```
这里必须先确认账户可用,才有必要继续检查密码。
嵌套层级过多会让代码难以阅读。只有当第二个判断确实依赖第一个判断时才使用嵌套;能够清晰地用 `and``elif` 表达时,不必强行嵌套。
## 十三、输入与条件判断
一个完整的交互判断程序:
```python
score_text = input("请输入考核分数:")
score = float(score_text)
if score >= 60:
print("考核通过。")
else:
print("考核未通过。")
```
输入数据参与数字比较前,仍然需要先完成类型转换。
## 十四、输入范围校验
分数通常应处于 0 到 100 之间。可以先检查输入范围:
```python
if score < 0 or score > 100:
print("分数必须在 0 到 100 之间。")
elif score >= 60:
print("考核通过。")
else:
print("考核未通过。")
```
无效数据的判断应放在前面。否则 `score = 120` 可能被错误地归为“通过”。
当前程序仍要求用户输入能够转换为数字的内容。如何处理“abc”等完全不能转换的数据会在异常处理课程中学习。
## 十五、哪些值会被当作假
条件不一定必须写比较表达式。Python 会把某些空值当作 `False`
- `False`
- 数字 `0``0.0`
- 空字符串 `""`
例如:
```python
user_name = input("请输入姓名:")
if user_name:
print(f"你好,{user_name}")
else:
print("姓名不能为空。")
```
如果用户直接按回车,`user_name` 是空字符串,程序会执行 `else`
这种根据值判断真假的规则称为真值Truth Value。列表、字典等容器的真值将在学到对应数据类型后继续介绍。
## 十六、运行本课示例
在 PowerShell 中执行:
```powershell
cd D:\Code\Python\01_python基础\1_5_条件判断
python conditions.py
```
示例会要求输入:
1. 考核分数;
2. 是否完成练习,用 `yes``no` 表示。
建议至少运行以下几组数据:
| 分数 | 是否完成练习 | 重点观察 |
| --- | --- | --- |
| `95` | `yes` | 优秀且允许进入下一课 |
| `75` | `no` | 合格但不能进入下一课 |
| `50` | `yes` | 未通过 |
| `120` | `yes` | 输入范围无效 |
## 十七、常见错误
### 17.1 漏写冒号
```text
if score >= 60
print("通过")
```
条件末尾必须有英文冒号 `:`
### 17.2 缩进不正确
属于分支的代码必须统一缩进四个空格。不要混用不一致的空格数量。
### 17.3 使用 `=` 进行比较
```text
if score = 60:
```
比较是否相等应使用 `==`
### 17.4 条件顺序错误
多个分数等级应从高到低判断,否则宽泛条件会提前拦截更精确的分支。
### 17.5 把多个独立 `if` 当成互斥分支
```python
if score >= 60:
print("合格")
if score >= 90:
print("优秀")
```
95 分会同时输出“合格”和“优秀”。如果等级只能选择一个,应使用 `if...elif...else`
### 17.6 忘记转换输入类型
`input()` 返回字符串。数字范围判断前应使用 `int()``float()` 转换。
## 十八、课堂练习
打开 `practice.py`完成“Agent 学习状态评估器”。程序需要根据学习时长、练习完成情况和测验成绩,输出不同等级与下一步建议。
运行命令:
```powershell
python practice.py
```
完成后至少使用以下测试数据检查不同分支:
| 每天学习小时 | 已完成练习 | 测验成绩 | 预期核心结果 |
| --- | --- | --- | --- |
| `2.5` | `yes` | `95` | 优秀,可以继续 |
| `1.5` | `yes` | `75` | 合格,可以继续 |
| `0.5` | `yes` | `75` | 时长不足,暂不能继续 |
| `2` | `no` | `80` | 练习未完成,暂不能继续 |
| `2` | `yes` | `50` | 成绩未通过 |
| `2` | `yes` | `120` | 输入无效 |
## 十九、思考题
1. `if` 条件为 `False` 时,缩进代码会怎样?
2. `if...elif...else` 最多会执行几个分支?
3. 为什么分数等级通常从高分向低分判断?
4. 多个独立 `if` 与一组 `if...elif...else` 有什么区别?
5. 为什么输入范围校验应该放在成绩等级判断之前?
6. `if practice_finished:` 为什么不必写成 `if practice_finished == True:`
7. 空字符串在条件中会被当作真还是假?
## 二十、本课小结
- `if` 在条件为真时执行对应代码;
- `else` 处理前面条件都不成立的情况;
- `elif` 用于增加互斥分支;
- 分支末尾需要英文冒号,分支内部需要统一缩进;
- 一组 `if...elif...else` 最多执行一个分支;
- 条件顺序会影响最终结果;
- 布尔变量可以直接作为条件;
- `and``or``not` 可以组成更完整的判断;
- 嵌套条件适合表达有先后依赖的判断;
- 空字符串、数字零等值在条件中会被当作假。
## 二十一、验收标准
- [ ] 能正确书写 `if`
- [ ] 能正确书写 `if...else`
- [ ] 能正确书写 `if...elif...else`
- [ ] 能使用四个空格表示分支代码;
- [ ] 能解释条件顺序的重要性;
- [ ] 能组合比较运算符与逻辑运算符;
- [ ] 能完成简单的输入范围校验;
- [ ] 能完成并运行 `practice.py`
- [ ] 能使用多组测试数据覆盖所有主要分支;
- [ ] 能回答七道思考题。

View File

@@ -0,0 +1,66 @@
# 第 1-5 课示例:条件判断
#
# 本程序根据考核分数和练习完成状态给出不同结果。
# 建议使用讲义中的多组数据反复运行,观察每次进入了哪个分支。
# 一、接收考核分数
# input() 返回字符串,因此先保留原始文本,再转换为浮点数。
score_text = input("请输入考核分数0 到 100")
score = float(score_text)
# 二、接收练习状态
# 本示例约定用户输入 yes 表示已完成,输入其他内容表示未完成。
practice_answer = input("是否完成练习yes/no")
practice_finished = practice_answer == "yes"
# 三、先判断分数范围,再判断成绩等级
# 条件按从特殊到一般、从高分到低分的顺序排列。
if score < 0 or score > 100:
score_level = "输入无效"
elif score >= 90:
score_level = "优秀"
elif score >= 80:
score_level = "良好"
elif score >= 60:
score_level = "合格"
else:
score_level = "未通过"
print(f"成绩等级:{score_level}")
# 四、组合多个条件决定能否继续
# 只有分数处于有效范围、达到 60 分并且完成练习时,才允许继续。
score_is_valid = 0 <= score <= 100
score_is_passed = score >= 60
if score_is_valid and score_is_passed and practice_finished:
print("课程和练习均已通过,可以进入下一课。")
else:
print("当前要求尚未全部完成,暂时不能进入下一课。")
# 五、使用嵌套判断给出更具体的提示
# 先确认分数有效,之后才进一步分析未满足的项目。
if score_is_valid:
if not score_is_passed:
print("改进建议:重新复习知识点并再次完成测验。")
elif not practice_finished:
print("改进建议:成绩已经通过,请继续完成课堂练习。")
else:
print("学习建议:保持当前节奏,继续学习下一课。")
else:
print("输入提示:分数必须位于 0 到 100 之间。")
# 六、演示空字符串的真值
# 如果用户没有输入姓名而直接按回车user_name 是空字符串,条件结果为假。
user_name = input("请输入你的名字或称呼:")
if user_name:
print(f"本次评估学习者:{user_name}")
else:
print("本次评估未填写学习者名称。")

View File

@@ -0,0 +1,89 @@
# 第 1-5 课课堂练习Agent 学习状态评估器
#
# 完成要求:
# 1. 根据注释使用 if、elif 和 else 编写条件分支。
# 2. 注意英文冒号和四个空格缩进。
# 3. 数字输入需要转换为正确类型。
# 4. 布尔状态应使用比较结果生成,不要保存成 "True" 或 "False" 字符串。
# 5. 不要删除题目注释。
# 6. 完成后使用题目末尾提供的多组数据测试程序。
# 练习一:接收用户每天学习的小时数。
# 使用 float() 转换,并保存到 daily_hours。
# 练习二:询问用户是否完成本课练习,约定输入 yes 或 no。
# 将原始输入保存到 practice_answer。
# 使用 == 比较 practice_answer 是否等于 "yes",把布尔结果保存到 practice_finished。
# 练习三:接收测验成绩,成绩范围为 0 到 100。
# 使用 float() 转换,并保存到 score。
# 练习四:使用 if...elif...else 判断成绩等级。
# 必须先判断 score 是否小于 0 或大于 100
# - 范围无效score_level = "输入无效"
# - 90 分及以上score_level = "优秀"
# - 80 分及以上score_level = "良好"
# - 60 分及以上score_level = "合格"
# - 其余有效成绩score_level = "未通过"
# 练习五:创建三个布尔变量。
# 1. score_is_valid成绩是否处于 0 到 100 之间,请使用链式比较;
# 2. score_is_passed成绩是否大于或等于 60
# 3. learning_time_is_enough每天学习时间是否大于或等于 1 小时。
# 练习六:判断是否可以继续下一课。
# 只有以下四个条件全部成立时can_continue 才为 True
# - 成绩范围有效;
# - 成绩通过;
# - 已经完成练习;
# - 每天学习时间达到 1 小时。
# 请使用 and 组合条件,把结果保存到 can_continue。
# 练习七:输出由 30 个等号组成的分隔线,再输出成绩等级。
# 练习八:使用 if...else 根据 can_continue 输出结论。
# - 可以继续:输出“所有要求均已达到,可以进入下一课。”
# - 不可继续:输出“当前仍有要求未达到,请查看具体建议。”
# 练习九:使用一组 if...elif...else 给出一条具体建议。
# 建议按以下优先顺序判断:
# 1. 成绩范围无效:提示输入 0 到 100 之间的分数;
# 2. 成绩未通过:提示复习并重新测验;
# 3. 练习未完成:提示完成课堂练习;
# 4. 学习时间不足:提示每天至少安排 1 小时;
# 5. 以上问题都不存在:提示保持节奏继续学习。
#
# 注意:这里使用 elif 是为了每次只输出当前优先级最高的一条建议。
# 练习十:使用 f-string 输出完整评估数据,至少包括:
# daily_hours、practice_finished、score、score_level 和 can_continue。
# 完成后必须使用以下六组数据分别运行:
#
# 第一组2.5、yes、95
# 预期:优秀,可以继续。
#
# 第二组1.5、yes、75
# 预期:合格,可以继续。
#
# 第三组0.5、yes、75
# 预期:合格,但学习时间不足,不能继续。
#
# 第四组2、no、80
# 预期:良好,但练习未完成,不能继续。
#
# 第五组2、yes、50
# 预期:未通过,不能继续。
#
# 第六组2、yes、120
# 预期:输入无效,不能继续。
# 完成后进行自查:
# 1. 每个 if、elif、else 末尾是否都有英文冒号;
# 2. 同一分支的代码是否统一缩进四个空格;
# 3. 分数范围校验是否早于成绩等级判断;
# 4. 成绩等级条件是否从高分向低分排列;
# 5. can_continue 是否组合了全部四个条件;
# 6. 六组测试数据是否分别进入了正确分支。