上一节我们学习了:
- 比较运算符(
>、<、==等) if、elif、else条件语句
例如:
age = 20
if age >= 18:
print("成年人")
这里只判断了一个条件。
但实际开发中,经常需要同时判断多个条件。
例如:
- 必须是中国公民,并且年龄大于等于 18 岁。
- 用户必须登录,并且拥有管理员权限。
- 成绩达到 60 分,或者属于补考通过。
如果只使用 if 嵌套:
if is_citizen:
if age >= 18:
print("可以投票")
虽然没有问题,但代码层级越来越深,可读性越来越差。
因此 Python 提供了逻辑运算符(Logical Operators),可以把多个条件组合成一个条件。
不过在学习逻辑运算符之前,需要先了解 Truthy(真值) 和 Falsy(假值)。
什么是 Truthy 和 Falsy?
很多初学者认为:
条件里面只能写:
True
或
False
实际上不是。
Python 会自动把一个值转换成布尔值。
例如:
if 100:
print("Hello")
输出:
Hello
为什么?
因为:
100
不是 True,
但它属于:
Truthy(真值)
也就是:
在需要布尔值时,会被自动当成 True。
同理:
if "":
print("Hello")
不会输出任何内容。
因为:
空字符串属于:
Falsy(假值)
即:
在需要布尔值时,会被自动当成 False。
因此:
Python 并不仅仅判断 True 和 False,
几乎所有对象都可以用于条件判断。
常见的 Falsy(假值)
Python 中只有少数值会被认为是 False。
最常见的是:
| 值 | 含义 |
|---|---|
False |
布尔假 |
None |
空值 |
0 |
整数 0 |
0.0 |
浮点数 0 |
"" |
空字符串 |
[] |
空列表 |
() |
空元组 |
{} |
空字典 |
set() |
空集合 |
例如:
print(bool(False))
print(bool(None))
print(bool(0))
print(bool(""))
print(bool([]))
输出:
False
False
False
False
False
常见的 Truthy(真值)
除了上面的 Falsy,
几乎所有其他对象都属于 Truthy。
例如:
print(bool(True))
print(bool(1))
print(bool(-5))
print(bool(3.14))
print(bool("Hello"))
print(bool([1, 2, 3]))
输出:
True
True
True
True
True
True
可以简单记忆:
空的是 False,有内容的一般都是 True。
例如:
bool("")
↓
False
而:
bool(" ")
↓
True
注意:
字符串里即使只有一个空格,
它仍然不是空字符串。
bool() 函数
如果想知道某个值是真是假,
可以使用:
bool()
语法:
bool(值)
例如:
print(bool(0))
print(bool(100))
print(bool(""))
print(bool("Python"))
输出:
False
True
False
True
bool() 的作用就是:
把任意对象转换成布尔值。
什么是逻辑运算符?
逻辑运算符(Logical Operators)
用于:
把多个条件组合成一个新的条件。
Python 一共有三个逻辑运算符:
| 运算符 | 中文 | 含义 |
|---|---|---|
and |
与(并且) | 所有条件都成立才成立 |
or |
或 | 至少一个条件成立即可 |
not |
非 | 对结果取反 |
and(并且)
and 表示:
两个条件必须同时成立。
例如:
age = 20
is_student = True
print(age >= 18 and is_student)
输出:
True
因为:
20 >= 18
↓
True
并且:
is_student
↓
True
所以:
True and True
↓
True
如果:
age = 15
is_student = True
则:
print(age >= 18 and is_student)
输出:
False
因为:
第一个条件已经失败。
and 常用于多个条件判断
例如:
只有:
- 是公民
- 年龄达到 18 岁
才能投票。
is_citizen = True
age = 25
if is_citizen and age >= 18:
print("可以投票")
else:
print("不能投票")
输出:
可以投票
相比:
if is_citizen:
if age >= 18:
...
使用 and 更简洁,也更容易阅读。
or(或者)
or 表示:
只要有一个条件成立即可。
例如:
age = 19
is_student = True
print(age < 18 or is_student)
输出:
True
因为:
虽然:
age < 18
是假,
但是:
is_student
是真。
所以:
False or True
↓
True
例如:
学生或者未成年人享受优惠:
if age < 18 or is_student:
print("可以享受学生优惠")
只要满足其中一个条件,
就会进入 if。
not(取反)
not
只有一个作用:
把 True 变成 False,把 False 变成 True。
例如:
print(not True)
print(not False)
输出:
False
True
对于 Truthy / Falsy:
print(not "")
print(not "Hello")
print(not 0)
print(not 1)
输出:
True
False
True
False
not 的实际用途
例如:
is_admin = False
如果不是管理员:
if not is_admin:
print("禁止访问")
输出:
禁止访问
可以理解成:
not False
↓
True
因此进入 if。
什么是短路求值(Short-circuit Evaluation)?
and 和 or
都有一个特点:
结果已经确定后,就不会继续计算后面的表达式。
这叫:
短路求值(Short-circuit Evaluation)。
这样做可以:
- 提高运行效率
- 避免一些不必要的错误
and 的短路
例如:
False and print("Hello")
输出:
False
不会打印:
Hello
原因:
对于:
False and ?
无论后面是什么,
结果都一定是:
False
所以:
Python 根本不会执行后面的表达式。
再例如:
0 and 100
结果:
0
因为:
0 属于 Falsy。
后面已经不用再计算。
or 的短路
例如:
True or print("Hello")
输出:
True
不会打印:
Hello
因为:
True or ?
已经一定是真。
所以:
后面的表达式不会执行。
例如:
100 or 200
结果:
100
因为:
第一个值已经是真值。
为什么 and、or 返回的不是 True 或 False?
很多初学者会发现:
print(True and 5)
输出:
5
而不是:
True
再例如:
print("" or "Python")
输出:
Python
这是 Python 的一个重要特性。
and 和 or
返回的是参与运算的对象本身,而不是简单的布尔值。
它们的规则如下:
and
A and B
- 如果 A 是假值,返回 A。
- 如果 A 是真值,返回 B。
例如:
| 表达式 | 返回值 |
|---|---|
0 and 5 |
0 |
5 and 10 |
10 |
"" and "abc" |
"" |
"abc" and 100 |
100 |
or
A or B
- 如果 A 是真值,返回 A。
- 如果 A 是假值,返回 B。
例如:
| 表达式 | 返回值 |
|---|---|
0 or 5 |
5 |
5 or 10 |
5 |
"" or "abc" |
"abc" |
"abc" or 100 |
"abc" |
在 if 条件中,这些返回值会自动转换为 True 或 False,因此大多数时候感觉不到区别。但在普通表达式中,理解这一点非常重要。
真值表(Truth Table)
and
| A | B | A and B |
|---|---|---|
| True | True | True |
| True | False | False |
| False | True | False |
| False | False | False |
or
| A | B | A or B |
|---|---|---|
| True | True | True |
| True | False | True |
| False | True | True |
| False | False | False |
not
| A | not A |
|---|---|
| True | False |
| False | True |
常见错误
❌ 把 and 写成 &
错误:
if age > 18 & is_student:
这里:
&
是按位运算符。
逻辑判断应该使用:
and
❌ 把 or 写成 ||
很多语言:
||
表示:
或。
但是:
Python 中没有:
||
正确写法:
or
❌ 把 not 写成 !
很多语言:
!
表示取反。
Python 使用:
not
常用逻辑运算符速查表
| 运算符 | 含义 | 规则 |
|---|---|---|
and |
与(并且) | 所有条件都成立才成立,返回第一个假值或最后一个真值。 |
or |
或 | 至少一个条件成立即可,返回第一个真值或最后一个假值。 |
not |
非 | 对布尔结果取反,始终返回 True 或 False。 |
学习小结
| 知识点 | 说明 |
|---|---|
| Truthy | 在布尔环境下会被当成 True 的值,如非零数字、非空字符串。 |
| Falsy | 在布尔环境下会被当成 False 的值,如 False、None、0、空字符串、空列表等。 |
bool() |
将任意对象转换为布尔值。 |
and |
所有条件都满足才成立,并具有短路求值。 |
or |
至少一个条件满足即可,并具有短路求值。 |
not |
对条件结果取反。 |
| 短路求值 | 当结果已经确定时,and 或 or 不会继续计算后面的表达式。 |
总结
- Python 中几乎所有对象都可以参与条件判断,会自动转换为
True或False,这就是 Truthy 和 Falsy。 and、or、not可以将多个条件组合起来,使代码更加简洁、易读。and和or不仅支持短路求值,还会返回参与运算的对象本身,而不是简单的布尔值,这也是 Python 逻辑运算的一大特点。- 熟练掌握 Truthy/Falsy、逻辑运算符和短路机制,是编写复杂条件判断和高质量 Python 程序的重要基础。