512 lines
11 KiB
Markdown
512 lines
11 KiB
Markdown
# 第 1-4 课:运算符
|
||
|
||
## 一、本课目标
|
||
|
||
完成本课后,你应该能够:
|
||
|
||
1. 解释运算符和操作数是什么;
|
||
2. 使用算术运算符完成基础计算;
|
||
3. 区分普通除法、整除和取余;
|
||
4. 使用比较运算符得到布尔值;
|
||
5. 使用复合赋值运算符更新变量;
|
||
6. 使用 `and`、`or` 和 `not` 组合或反转条件;
|
||
7. 使用括号明确计算顺序;
|
||
8. 编写一个包含输入、计算和判断结果的学习进度程序。
|
||
|
||
## 二、前置知识
|
||
|
||
开始本课前,你应该已经掌握:
|
||
|
||
- 创建和使用变量;
|
||
- 区分字符串、整数、浮点数和布尔值;
|
||
- 使用 `input()` 接收输入;
|
||
- 使用 `int()` 和 `float()` 转换输入;
|
||
- 使用 f-string 输出变量和计算结果。
|
||
|
||
## 三、运算符与操作数
|
||
|
||
运算符(Operator)是告诉 Python 执行某种运算的符号或关键字。
|
||
|
||
观察下面的代码:
|
||
|
||
```python
|
||
total_hours = daily_hours * learning_days
|
||
```
|
||
|
||
其中:
|
||
|
||
- `*` 是乘法运算符;
|
||
- `daily_hours` 和 `learning_days` 是参与运算的数据,称为操作数(Operand);
|
||
- 计算结果赋值给 `total_hours`。
|
||
|
||
运算不只是数学计算。比较两个数据、组合两个条件,也需要使用运算符。
|
||
|
||
## 四、算术运算符
|
||
|
||
算术运算符主要用于数字计算。
|
||
|
||
| 运算符 | 含义 | 示例 | 结果 |
|
||
| --- | --- | --- | --- |
|
||
| `+` | 加法 | `10 + 3` | `13` |
|
||
| `-` | 减法 | `10 - 3` | `7` |
|
||
| `*` | 乘法 | `10 * 3` | `30` |
|
||
| `/` | 普通除法 | `10 / 3` | `3.333...` |
|
||
| `//` | 整除 | `10 // 3` | `3` |
|
||
| `%` | 取余 | `10 % 3` | `1` |
|
||
| `**` | 幂运算 | `10 ** 3` | `1000` |
|
||
|
||
### 4.1 加、减、乘
|
||
|
||
```python
|
||
completed_tasks = 5
|
||
new_tasks = 3
|
||
|
||
total_tasks = completed_tasks + new_tasks
|
||
remaining_tasks = total_tasks - completed_tasks
|
||
estimated_minutes = total_tasks * 20
|
||
```
|
||
|
||
这些运算与日常数学中的含义基本一致。
|
||
|
||
### 4.2 普通除法 `/`
|
||
|
||
```python
|
||
average_hours = 10 / 4
|
||
print(average_hours)
|
||
```
|
||
|
||
输出:
|
||
|
||
```text
|
||
2.5
|
||
```
|
||
|
||
Python 3 中,普通除法 `/` 的结果通常是浮点数。即使能够整除,结果也会带小数:
|
||
|
||
```python
|
||
print(10 / 2)
|
||
```
|
||
|
||
输出:
|
||
|
||
```text
|
||
5.0
|
||
```
|
||
|
||
### 4.3 整除 `//`
|
||
|
||
整除会得到向下取整后的商:
|
||
|
||
```python
|
||
full_weeks = 17 // 7
|
||
print(full_weeks)
|
||
```
|
||
|
||
输出:
|
||
|
||
```text
|
||
2
|
||
```
|
||
|
||
这表示 17 天中包含 2 个完整的 7 天周期。
|
||
|
||
对于正数,可以暂时理解为“只保留能完整分出的份数”。负数整除存在额外规则,将来遇到实际场景时再详细学习。
|
||
|
||
### 4.4 取余 `%`
|
||
|
||
取余得到除法中没有被完整分掉的余数:
|
||
|
||
```python
|
||
remaining_days = 17 % 7
|
||
print(remaining_days)
|
||
```
|
||
|
||
输出:
|
||
|
||
```text
|
||
3
|
||
```
|
||
|
||
因此 17 天可以表示为 2 个完整星期加 3 天。
|
||
|
||
取余还常用于判断一个整数是奇数还是偶数:
|
||
|
||
```python
|
||
remainder = 8 % 2
|
||
print(remainder)
|
||
```
|
||
|
||
结果为 `0`,说明 8 可以被 2 整除。
|
||
|
||
### 4.5 幂运算 `**`
|
||
|
||
```python
|
||
result = 2 ** 3
|
||
print(result)
|
||
```
|
||
|
||
输出为 `8`,表示 2 的 3 次方,即 `2 × 2 × 2`。
|
||
|
||
注意:Python 的幂运算不是 `^`。符号 `^` 在 Python 中有其他含义,当前阶段不要用它表示乘方。
|
||
|
||
## 五、字符串也能使用部分算术运算符
|
||
|
||
### 5.1 字符串拼接
|
||
|
||
两个字符串可以使用 `+` 连接:
|
||
|
||
```python
|
||
first_name = "Agent"
|
||
second_name = "开发者"
|
||
role_name = first_name + second_name
|
||
|
||
print(role_name)
|
||
```
|
||
|
||
输出:
|
||
|
||
```text
|
||
Agent开发者
|
||
```
|
||
|
||
如果需要空格或其他符号,必须明确写入字符串:
|
||
|
||
```python
|
||
role_name = first_name + " " + second_name
|
||
```
|
||
|
||
### 5.2 重复字符串
|
||
|
||
字符串乘以整数可以重复多次:
|
||
|
||
```python
|
||
separator = "=" * 20
|
||
print(separator)
|
||
```
|
||
|
||
这会输出 20 个等号。
|
||
|
||
字符串不能与整数直接相加:
|
||
|
||
```text
|
||
"学习天数:" + 3
|
||
```
|
||
|
||
如果确实要拼接,需要先使用 `str(3)` 转换;不过通常推荐使用更清晰的 f-string。
|
||
|
||
## 六、比较运算符
|
||
|
||
比较运算符用于比较两个数据,结果一定是布尔值 `True` 或 `False`。
|
||
|
||
| 运算符 | 含义 | 示例 |
|
||
| --- | --- | --- |
|
||
| `==` | 等于 | `score == 100` |
|
||
| `!=` | 不等于 | `score != 0` |
|
||
| `>` | 大于 | `score > 60` |
|
||
| `<` | 小于 | `score < 60` |
|
||
| `>=` | 大于或等于 | `score >= 60` |
|
||
| `<=` | 小于或等于 | `score <= 100` |
|
||
|
||
示例:
|
||
|
||
```python
|
||
completed_hours = 12
|
||
target_hours = 10
|
||
|
||
is_target_reached = completed_hours >= target_hours
|
||
print(is_target_reached)
|
||
```
|
||
|
||
输出:
|
||
|
||
```text
|
||
True
|
||
```
|
||
|
||
### 6.1 `=` 与 `==` 的区别
|
||
|
||
这是初学者必须掌握的区别:
|
||
|
||
- `=` 表示赋值,把右边的数据交给左边的变量;
|
||
- `==` 表示比较,判断左右两边是否相等。
|
||
|
||
```python
|
||
learning_days = 4
|
||
is_four_days = learning_days == 4
|
||
```
|
||
|
||
第一行创建或更新变量,第二行得到布尔值 `True`。
|
||
|
||
### 6.2 不要把布尔结果写成字符串
|
||
|
||
```python
|
||
is_finished = completed_tasks == total_tasks
|
||
```
|
||
|
||
这里的 `is_finished` 保存真正的布尔值。
|
||
|
||
下面写法只是保存普通文字:
|
||
|
||
```python
|
||
is_finished = "True"
|
||
```
|
||
|
||
两者的数据类型和用途不同。
|
||
|
||
## 七、赋值运算符与复合赋值
|
||
|
||
普通赋值使用 `=`:
|
||
|
||
```python
|
||
completed_tasks = 3
|
||
```
|
||
|
||
如果完成了一个新任务,可以这样更新:
|
||
|
||
```python
|
||
completed_tasks = completed_tasks + 1
|
||
```
|
||
|
||
Python 提供了更简洁的复合赋值写法:
|
||
|
||
```python
|
||
completed_tasks += 1
|
||
```
|
||
|
||
两种写法在这个场景中作用相同。
|
||
|
||
常见复合赋值运算符:
|
||
|
||
| 运算符 | 示例 | 等价写法 |
|
||
| --- | --- | --- |
|
||
| `+=` | `value += 2` | `value = value + 2` |
|
||
| `-=` | `value -= 2` | `value = value - 2` |
|
||
| `*=` | `value *= 2` | `value = value * 2` |
|
||
| `/=` | `value /= 2` | `value = value / 2` |
|
||
| `//=` | `value //= 2` | `value = value // 2` |
|
||
| `%=` | `value %= 2` | `value = value % 2` |
|
||
|
||
复合赋值会更新变量本身,因此执行前变量必须已经存在。
|
||
|
||
## 八、逻辑运算符
|
||
|
||
逻辑运算符用于组合或反转布尔条件。
|
||
|
||
Python 中最常用的三个逻辑运算符是:
|
||
|
||
- `and`:并且;
|
||
- `or`:或者;
|
||
- `not`:取反。
|
||
|
||
### 8.1 `and`
|
||
|
||
`and` 两边的条件都为 `True` 时,整体才为 `True`。
|
||
|
||
```python
|
||
has_completed_course = True
|
||
has_finished_practice = True
|
||
|
||
can_start_next_course = has_completed_course and has_finished_practice
|
||
print(can_start_next_course)
|
||
```
|
||
|
||
输出为 `True`。
|
||
|
||
如果其中任何一个条件为 `False`,整体就是 `False`。
|
||
|
||
### 8.2 `or`
|
||
|
||
`or` 两边至少有一个条件为 `True` 时,整体就是 `True`。
|
||
|
||
```python
|
||
uses_pycharm = True
|
||
uses_vscode = False
|
||
|
||
has_code_editor = uses_pycharm or uses_vscode
|
||
print(has_code_editor)
|
||
```
|
||
|
||
输出为 `True`。
|
||
|
||
### 8.3 `not`
|
||
|
||
`not` 会反转布尔值:
|
||
|
||
```python
|
||
is_finished = False
|
||
is_still_learning = not is_finished
|
||
|
||
print(is_still_learning)
|
||
```
|
||
|
||
输出为 `True`。
|
||
|
||
### 8.4 组合比较条件
|
||
|
||
```python
|
||
daily_hours = 2.5
|
||
completed_tasks = 4
|
||
|
||
is_plan_healthy = daily_hours >= 1 and completed_tasks >= 3
|
||
```
|
||
|
||
这个结果表示“每天至少学习 1 小时,并且至少完成 3 个任务”是否同时成立。
|
||
|
||
本课只计算并输出布尔结果。下一课学习条件判断后,程序可以根据结果执行不同代码。
|
||
|
||
## 九、运算优先级
|
||
|
||
Python 会按照一定优先级计算表达式。
|
||
|
||
最基础的规则与数学类似:
|
||
|
||
1. 先计算括号;
|
||
2. 再计算幂运算;
|
||
3. 再计算乘、除、整除和取余;
|
||
4. 最后计算加减。
|
||
|
||
```python
|
||
result = 2 + 3 * 4
|
||
print(result)
|
||
```
|
||
|
||
结果是 `14`,因为先计算 `3 * 4`。
|
||
|
||
加入括号:
|
||
|
||
```python
|
||
result = (2 + 3) * 4
|
||
print(result)
|
||
```
|
||
|
||
结果是 `20`。
|
||
|
||
比较和逻辑运算组合时也有优先级规则,但不要依赖记忆复杂规则。推荐使用括号明确表达意图:
|
||
|
||
```python
|
||
can_continue = (score >= 60) and (practice_finished == True)
|
||
```
|
||
|
||
上面代码中的 `== True` 可以省略,写成下面这样更自然:
|
||
|
||
```python
|
||
can_continue = (score >= 60) and practice_finished
|
||
```
|
||
|
||
括号不仅影响运算顺序,也能帮助人更快读懂代码。
|
||
|
||
## 十、浮点数精度现象
|
||
|
||
运行下面代码:
|
||
|
||
```python
|
||
print(0.1 + 0.2)
|
||
```
|
||
|
||
你可能看到:
|
||
|
||
```text
|
||
0.30000000000000004
|
||
```
|
||
|
||
这不是 Python 随意算错,而是计算机使用二进制保存部分小数时产生的精度限制。
|
||
|
||
现阶段知道这种现象即可。涉及金额等要求精确的业务数据时,不能随意使用普通浮点数直接计算,后续数据库和项目课程会介绍合适的处理方式。
|
||
|
||
## 十一、运行本课示例
|
||
|
||
在 PowerShell 中执行:
|
||
|
||
```powershell
|
||
cd D:\Code\Python\01_python基础\1_4_运算符
|
||
python operators.py
|
||
```
|
||
|
||
请边看源代码边观察输出,重点比较:
|
||
|
||
- `/`、`//`、`%` 的不同结果;
|
||
- `=` 与 `==` 的不同用途;
|
||
- `and`、`or`、`not` 的布尔结果;
|
||
- 添加括号前后的计算结果。
|
||
|
||
## 十二、常见错误
|
||
|
||
### 12.1 使用 `^` 表示乘方
|
||
|
||
Python 使用 `**` 进行幂运算,不使用 `^`。
|
||
|
||
### 12.2 混淆 `=` 和 `==`
|
||
|
||
需要比较时使用 `==`,需要给变量保存数据时使用 `=`。
|
||
|
||
### 12.3 除数为零
|
||
|
||
```text
|
||
10 / 0
|
||
```
|
||
|
||
会产生 `ZeroDivisionError`,因为普通数字不能除以零。
|
||
|
||
### 12.4 字符串与数字直接相加
|
||
|
||
```text
|
||
"总数:" + 10
|
||
```
|
||
|
||
会产生 `TypeError`。推荐使用 f-string:
|
||
|
||
```python
|
||
print(f"总数:{10}")
|
||
```
|
||
|
||
### 12.5 复杂表达式没有括号
|
||
|
||
即使程序结果正确,难以阅读的表达式也容易在维护时产生问题。优先使用括号和含义清晰的中间变量。
|
||
|
||
## 十三、课堂练习
|
||
|
||
打开 `practice.py`,完成“Agent 学习进度计算器”。它会接收计划数据,计算完成率相关信息,并输出多个布尔判断结果。
|
||
|
||
运行命令:
|
||
|
||
```powershell
|
||
python practice.py
|
||
```
|
||
|
||
本课重点是自己选择正确的运算符。请先不要参考示例文件逐行照抄。
|
||
|
||
## 十四、思考题
|
||
|
||
1. `17 / 7`、`17 // 7`、`17 % 7` 分别表示什么?
|
||
2. `score = 80` 与 `score == 80` 有什么区别?
|
||
3. `True and False` 的结果是什么?
|
||
4. `True or False` 的结果是什么?
|
||
5. `not True` 的结果是什么?
|
||
6. 为什么复杂表达式推荐使用括号?
|
||
7. `2 + 3 * 4` 和 `(2 + 3) * 4` 为什么结果不同?
|
||
|
||
## 十五、本课小结
|
||
|
||
- 算术运算符用于数字计算;
|
||
- `/` 是普通除法,`//` 是整除,`%` 用于取得余数;
|
||
- `**` 用于幂运算;
|
||
- 比较运算的结果是布尔值;
|
||
- `=` 表示赋值,`==` 表示比较是否相等;
|
||
- 复合赋值可以简洁地更新已有变量;
|
||
- `and` 要求两个条件都成立;
|
||
- `or` 要求至少一个条件成立;
|
||
- `not` 用于反转布尔结果;
|
||
- 括号可以改变或明确运算顺序。
|
||
|
||
## 十六、验收标准
|
||
|
||
- [ ] 能正确使用七种基础算术运算符;
|
||
- [ ] 能解释 `/`、`//` 和 `%` 的区别;
|
||
- [ ] 能使用比较运算符得到布尔值;
|
||
- [ ] 能区分赋值与相等比较;
|
||
- [ ] 能使用至少一种复合赋值运算符;
|
||
- [ ] 能使用 `and`、`or` 和 `not`;
|
||
- [ ] 能使用括号明确计算顺序;
|
||
- [ ] 能完成并运行 `practice.py`;
|
||
- [ ] 能回答七道思考题。
|