ZetCode

Python bool 函数

上次修改时间:2025 年 4 月 11 日

本综合指南探讨了 Python 的 bool 函数,该函数返回对象的真值。我们将介绍真值/假值、自定义对象以及布尔转换的实际示例。

基本定义

bool 函数根据参数的真值返回 TrueFalse。它遵循 Python 的真值测试规则。

主要特征:适用于任何 Python 对象,遵循标准真值测试规则,并且是 bool 类型的构造函数。

标准类型的基本用法

以下是不同 Python 类型的简单用法,展示了 bool 如何评估常见值。

basic_bool.py
# With numbers
print(bool(0))      # False
print(bool(42))     # True
print(bool(0.0))    # False
print(bool(3.14))   # True

# With sequences
print(bool(""))     # False
print(bool("hi"))   # True
print(bool([]))     # False
print(bool([1,2]))  # True

此示例展示了 bool 与不同标准类型的用法。数值零和空序列为假值。所有其他值为真值。

该函数遵循 Python 的标准真值测试规则,该规则在整个语言中是一致的(在 if 语句、while 循环等中)。

具有 __bool__ 的自定义对象

您可以通过实现 __bool__ 特殊方法,使自定义对象与 bool 一起使用。此示例创建一个 Box 类。

custom_bool.py
class Box:
    def __init__(self, items):
        self.items = items
    
    def __bool__(self):
        return len(self.items) > 0
    
    def __repr__(self):
        return f"Box({self.items})"

empty_box = Box([])
full_box = Box(["apple", "banana"])

print(bool(empty_box))  # False
print(bool(full_box))   # True

Box 类实现了 __bool__,以便在其包含项目时返回 True。当我们在 Box 实例上调用 bool 时,Python 会使用此方法。

此模式对于创建需要参与真值测试的对象(如容器或包装器)非常有用。

真值和假值

此示例演示了 Python 的假值以及 bool 如何一致地处理它们。

falsy_values.py
falsy_values = [
    None, False, 0, 0.0, 0j, "", (), [], {}, set(), range(0)
]

for value in falsy_values:
    print(f"{repr(value)}: {bool(value)}")

# All print False

这些都是 Python 中的内置假值。bool 函数为每个标准情况返回 False

理解假值对于编写利用真值测试的简洁 Python 代码至关重要。

在条件逻辑中使用 bool

此示例展示了 bool 在条件语句和逻辑运算中的实际用法。

conditionals.py
def process_data(data):
    if not bool(data):
        print("No data to process")
        return
    
    print(f"Processing {len(data)} items")

process_data([])       # No data to process
process_data([1,2,3])  # Processing 3 items

# With logical operators
value = 42
print(bool(value and value > 10))  # True

该示例显示了 bool 在条件语句中的显式使用,尽管通常隐式转换就足够了。它还演示了与逻辑运算符的组合。

当转换不明显时,显式 bool 调用可以使代码更具可读性。

性能注意事项

此示例将 bool 性能与隐式真值测试和替代方法进行比较。

performance.py
import timeit

def test_bool():
    return bool([1,2,3])

def test_implicit():
    if [1,2,3]:
        return True
    return False

def test_len():
    return len([1,2,3]) > 0

print("bool():", timeit.timeit(test_bool, number=1000000))
print("Implicit:", timeit.timeit(test_implicit, number=1000000))
print("len():", timeit.timeit(test_len, number=1000000))

此基准测试不同的真值测试方法。对于内置类型,bool 通常是最快的。隐式测试的速度几乎相同。

len() 方法通常是不必要的且速度较慢,这表明了为什么首选直接真值测试。

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我在编程教学方面拥有超过十年的经验。

列出所有 Python 教程