Python 的 `truthy` 和 `falsy`
本文解释了 Python 的 truthy 和 falsy。
YouTube Video
Python 的 truthy 和 falsy
truthy 和 falsy 的定义
在 Python 中,在条件表达式中评估的对象会被认为是 'True' 或 'False'。truthy 指评估为 'True' 的对象,falsy 指评估为 'False' 的对象。这些评估通常用于如 if 语句或 while 循环中的条件分支。另外,bool() 函数可以接收任何对象并返回其布尔值。
Falsy(评估为 False 的对象)
在 Python 中,以下对象被认为是 falsy:。
-
False -
None -
数值零值
- 例如:
0,0.0
- 例如:
-
空序列类型(例如空列表、元组或字符串)
- 例如:
[],(),""
- 例如:
-
空字典
- 例如:
{}
- 例如:
-
空集合
- 例如:
set()
- 例如:
这些对象在 if 语句条件中会被评估为“假值”(falsy)。例如,您可以像这样编写代码。
1if not []:
2 print("The list is falsy.")- 在此代码中,列表
[]是空的,因此被评估为“假值”(falsy),并执行print语句。
Truthy(评估为 True 的对象)
不被认为是 falsy 的对象则被视为 truthy。
-
非零数字(整数,浮点数)
- 示例:
1,3.14,-100
- 示例:
-
非空序列类型(列表,元组,字符串等)
- 示例:
[1, 2, 3],(1, 2),"Hello"
- 示例:
-
非空字典
- 示例:
{"key": "value"}
- 示例:
-
非空集合
- 示例:
{1, 2, 3}
- 示例:
被认为是 truthy 的对象在 if 语句的条件中会被判断为 'True'。例如,您可以像这样编写代码。
1if [1, 2, 3]:
2 print("The list is truthy.")- 在上面的代码中,由于列表
[1, 2, 3]不是空的,它被判断为truthy,因此会执行print语句。
使用 bool() 函数判断布尔值
你可以使用 bool() 函数判断对象的布尔值。
1# Examples of falsy values
2print("False is", "truthy" if bool(False) else "falsy")
3print("0 is", "truthy" if bool(0) else "falsy")
4print('"" is', "truthy" if bool("") else "falsy")
5print("None is", "truthy" if bool(None) else "falsy")
6print("[] is", "truthy" if bool([]) else "falsy")
7
8# Examples of truthy values
9print("1 is", "truthy" if bool(1) else "falsy")
10print('"hello" is', "truthy" if bool("hello") else "falsy")
11print('" " (space) is', "truthy" if bool(" ") else "falsy")
12print('"0" is', "truthy" if bool("0") else "falsy")- 此代码演示了如何评估各种值的真值。例如,数值
0和空字符串被视为False,而空格或字符串"0"被视为True。
利用“真值”(truthy)和“假值”(falsy)
通过利用“真值”和“假值”,代码可以写得更加简洁和直观。尤其是,if 语句通常可以在不进行显式比较的情况下评估,从而使代码更短。例如,下面的两段代码行为类似,但第一段代码更加简洁。
1my_list = [1]
2
3# Explicit comparison
4if my_list != []:
5 print("The list is not empty.")
6
7# Using truthy/falsy
8if my_list:
9 print("The list is not empty.")在上述示例中,你可以看到,只要 my_list 不是空列表,它就会被评估为“真值”(truthy),从而无需显式比较。
用“真值”和“假值”设计
通过有效利用“真值”和“假值”的概念,你可以提高代码的可读性和效率。它们特别适用于设置默认值、检查变量有效性和输入验证。例如,如果您期望传递None或一个空列表作为参数,您可以像这样编写代码。
1def process_data(data=None):
2 data = data or []
3 print(data)
4
5process_data() # An empty list is used by default.- 在这段代码中,如果
data是None,则会将一个空列表[]作为默认值。通过这种方式,使用truthy和falsy可以简洁地设置默认值。
为了避免意外行为需要注意的要点
然而,虽然使用 truthy 和 falsy 的代码可以简洁方便,但也要注意这可能导致意外行为。例如,在这段代码中,不仅仅当 data 为 None 时,任何被判断为 False 的值,如空字符串或 0,也会被替换成默认的空列表 []。因此,当需要更严格的条件,如只在值为 None 时初始化,建议使用如 value is None: 这种显式条件。根据具体情况,设计代码时需在简洁与严谨之间取得平衡。
1def process_data(data=None):
2 if data is None:
3 data = []
4 print(data)
5
6process_data() # An empty list is used by default.
7process_data(0) # 0 is printed because it's not None.- 在此代码中,只有当
data为None时才会被初始化为空列表,而其他如0这样的假值将保持不变。
在自定义对象中控制布尔值
即使在你自己的类中,也可以通过定义 __bool__() 或 __len__() 来控制实例的布尔值。
1class MyContainer:
2 def __init__(self, items):
3 self.items = items
4
5 def __len__(self):
6 return len(self.items)
7
8box = MyContainer([])
9print(bool(box)) # False
10
11box.items.append("item")
12print(bool(box)) # True- 在这段代码中,
__len__()方法让容器在为空时被判断为False,有元素时为True。
结论
在 Python 中,truthy 和 falsy 的概念对于编写简洁的条件表达式以及使代码更直观非常重要。理解并正确使用这些概念可以极大地提高代码的可读性和效率。
您可以在我们的YouTube频道上使用Visual Studio Code跟随上述文章进行学习。 请也查看我们的YouTube频道。