# 第 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`; - [ ] 能回答七道思考题。