GEEK
← 返回首页

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

#随笔

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

上一节我们学习了:

  • 比较运算符(>、<、== 等)
  • ifelifelse 条件语句

例如:

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 并不仅仅判断 TrueFalse

几乎所有对象都可以用于条件判断。


常见的 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)?

andor

都有一个特点:

结果已经确定后,就不会继续计算后面的表达式。

这叫:

短路求值(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 的一个重要特性。

andor

返回的是参与运算的对象本身,而不是简单的布尔值。

它们的规则如下:

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 条件中,这些返回值会自动转换为 TrueFalse,因此大多数时候感觉不到区别。但在普通表达式中,理解这一点非常重要。


真值表(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 对布尔结果取反,始终返回 TrueFalse

学习小结

知识点 说明
Truthy 在布尔环境下会被当成 True 的值,如非零数字、非空字符串。
Falsy 在布尔环境下会被当成 False 的值,如 FalseNone0、空字符串、空列表等。
bool() 将任意对象转换为布尔值。
and 所有条件都满足才成立,并具有短路求值。
or 至少一个条件满足即可,并具有短路求值。
not 对条件结果取反。
短路求值 当结果已经确定时,andor 不会继续计算后面的表达式。

总结

  • Python 中几乎所有对象都可以参与条件判断,会自动转换为 TrueFalse,这就是 Truthy 和 Falsy。
  • andornot 可以将多个条件组合起来,使代码更加简洁、易读。
  • andor 不仅支持短路求值,还会返回参与运算的对象本身,而不是简单的布尔值,这也是 Python 逻辑运算的一大特点。
  • 熟练掌握 Truthy/Falsy、逻辑运算符和短路机制,是编写复杂条件判断和高质量 Python 程序的重要基础。