Files
PythonLearn/01_python基础/1_4_运算符/README.md
2026-07-22 16:42:56 +08:00

512 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第 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`
- [ ] 能回答七道思考题。