Python len 函数
上次修改时间:2025 年 4 月 11 日
这个全面的指南探讨了 Python 的 len
函数,它返回容器中元素的数量。 我们将涵盖内置类型、自定义对象以及在各种数据结构中计数元素的实际示例。
基本定义
len
函数返回对象的长度(元素数量)。它适用于序列(字符串、列表、元组)和集合(字典、集合)。参数必须是序列或集合。
关键特征:返回元素的整数计数,对于非序列类型引发 TypeError,并为自定义对象调用 __len__
方法。 它是容器类型的基本操作。
基本序列用法
以下是不同序列类型的简单用法,展示了 len
如何计算字符串、列表和元组中的元素。
# 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
也适用于映射和集合类型。 此示例演示了与字典和集合的用法。
# 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
一起使用。 此示例创建一个自定义容器。
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
。 此示例显示了正确的错误处理。
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
性能与用于获取容器大小的替代方法。
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 中的容器大小。
最佳实践
- 用于提高可读性: 首选
len
而不是手动计数 - 实现 __len__: 对于自定义容器类型
- 检查是否为空: 使用
if not container
而不是len(container) == 0
- 处理错误: 当输入类型不确定时捕获 TypeError
- 记录行为: 清楚地记录 __len__ 实现
资料来源
作者
列出所有 Python 教程。