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 教程。