GEEK
← 返回首页

Truthy / Falsy、逻辑运算符(and、or、not)与短路求值

#随笔

在 Python 中,任何值都可以参与条件判断,并自动转换为 True 或 False。这种特性称为 Truthy(真值) 和 Falsy(假值)。Python 提供了三个逻辑运算符:and(且)、or(或)和 not(非),用于组合多个条件。and 和 or 还具有**短路求值(Short-circuit Evaluation)**机制,当结果已经确定时,不会继续计算后面的表达式,从而提高运行效率并避免一些错误。

上一节我们学习了:

  • 比较运算符(>、<、== 等)
  • 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 程序的重要基础。