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