ZetCode

Python len 函数

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

这个全面的指南探讨了 Python 的 len 函数,它返回容器中元素的数量。 我们将涵盖内置类型、自定义对象以及在各种数据结构中计数元素的实际示例。

基本定义

len 函数返回对象的长度(元素数量)。它适用于序列(字符串、列表、元组)和集合(字典、集合)。参数必须是序列或集合。

关键特征:返回元素的整数计数,对于非序列类型引发 TypeError,并为自定义对象调用 __len__ 方法。 它是容器类型的基本操作。

基本序列用法

以下是不同序列类型的简单用法,展示了 len 如何计算字符串、列表和元组中的元素。

basic_len.py
# With strings
print(len("hello"))    # 5 (characters)
print(len(""))         # 0 (empty string)

# With lists
print(len([1, 2, 3])) # 3 (elements)
print(len([]))         # 0 (empty list)

# With tuples
print(len((1, 2)))     # 2 (elements)
print(len(()))         # 0 (empty tuple)

此示例展示了 len 与不同序列类型的使用。 对于字符串,它计算字符。 对于列表和元组,它计算元素。 空序列返回 0。

该函数提供了一种一致的方式来获取不同序列类型的大小信息,使代码更通用和可重用。

字典和集合用法

len 也适用于映射和集合类型。 此示例演示了与字典和集合的用法。

dict_set_len.py
# With dictionaries
print(len({"a": 1, "b": 2}))  # 2 (key-value pairs)
print(len({}))                 # 0 (empty dict)

# With sets
print(len({1, 2, 3}))         # 3 (elements)
print(len(set()))             # 0 (empty set)

# With frozen sets
print(len(frozenset([1, 2]))) # 2 (elements)

对于字典,len 计算键值对。 对于集合,它计算唯一元素。 不可变集合的行为与常规集合类似,用于长度计算。

这演示了 len 在 Python 标准库中不同集合类型中的多功能性。

带有 __len__ 的自定义对象

通过实现 __len__ 特殊方法,您可以使自定义对象与 len 一起使用。 此示例创建一个自定义容器。

custom_len.py
class ShoppingCart:
    def __init__(self):
        self.items = []
    
    def add_item(self, item):
        self.items.append(item)
    
    def __len__(self):
        return len(self.items)
    
    def __repr__(self):
        return f"ShoppingCart({self.items})"

cart = ShoppingCart()
cart.add_item("Apple")
cart.add_item("Banana")
print(len(cart))  # 2

ShoppingCart 类实现了 __len__ 以返回其商品数量。 当我们在 ShoppingCart 实例上调用 len 时,Python 使用此方法。

这种模式对于应用大小或长度概念的自定义容器类(集合、缓冲区等)很常见。

错误处理

len 函数与非序列类型一起使用时,会引发 TypeError。 此示例显示了正确的错误处理。

errors.py
try:
    print(len(42))
except TypeError as e:
    print(f"Error: {e}")  # object of type 'int' has no len()

class NoLen:
    pass

try:
    print(len(NoLen()))
except TypeError as e:
    print(f"Error: {e}")  # object of type 'NoLen' has no len()

这些示例演示了 len 对不支持类型的行为。 数字和没有 __len__ 的对象会引发 TypeError

要使类与 len 一起使用,请如上一个示例所示实现 __len__

性能注意事项

此示例比较了 len 性能与用于获取容器大小的替代方法。

performance.py
import timeit

def test_len():
    return len([1, 2, 3, 4, 5])

def test_count():
    return [1, 2, 3, 4, 5].count(None)

def test_loop():
    count = 0
    for _ in [1, 2, 3, 4, 5]:
        count += 1
    return count

print("len():", timeit.timeit(test_len, number=1000000))
print("count():", timeit.timeit(test_count, number=1000000))
print("Loop:", timeit.timeit(test_loop, number=1000000))

这基准测试了不同的尺寸检查方法。 len 针对内置类型进行了优化,速度最快。 计数或循环速度较慢且不必要。

结果表明为什么首选 len 来获取 Python 中的容器大小。

最佳实践

资料来源

作者

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

列出所有 Python 教程