跳至主要内容

Python len():Python 中统计元素数量的入门指南

了解如何使用 Python 的 len() 函数,快速获取字符串、列表、字典及其他数据结构的大小。通过实用示例掌握要点,并避开在自己代码中使用 len() 时的常见误区。
· 6分钟 阅读

使用 AI 探索

len() 函数是 Python 程序员用来检查数据的首选工具之一。如果您正在学习我们的 Introduction to Python for Developers 课程或 Python Programming Fundamentals 技能路径,您一定见过 len()。

在本文中,我将向您展示 len() 在 Python 中如何作用于各种常见数据类型,并提醒您在出错时需要注意什么。

Python 的 len() 函数做什么?

每当您需要检查某个对象包含多少项时,都可以使用 Python 内置的 len() 函数。我这里说的是统计列表中的元素数量,或统计字符串中的字符数。您也可以用它来统计字典中的键数。用途非常广泛。

最基本的用法如下:

len(object)

只需把您想要测量的对象(如上面列举的那些)放在 object 的位置即可。

在常见 Python 数据类型上使用 len()

我上面列出了一些常见用例,但都比较抽象。下面通过具体示例来直观展示使用 len() 的价值。

统计字符串中的字符数

假设您想知道一段文本的精确长度,包括所有空格和标点符号:

word = "Josef"
print(len(word))

这将打印 5,因为单词 "Josef"(以 "f" 结尾)由五个字符组成。

检查列表中的项目数量

如果您想知道列表包含多少项,可以这样用:

numbers = [10, 20, 30, 40, 50]
print(len(numbers))

输出将是 5。

获取元组的大小

元组与列表类似,都用于将项目分组,但元组是不可变的,创建后无法更改。len() 在这里同样适用:

dimensions = (1920, 1080)
print(len(dimensions))

这会得到 2,因为该元组存储了两个元素。

统计字典中的键数

Python 字典由键值对构成。当您对字典使用 len() 时,它只统计键的数量:

person = {"name": "Alice", "age": 30, "city": "Paris"}
print(len(person))

因此您会得到 3(每个键各算一个)。

检查集合中的唯一元素数

当您只想存储唯一项时,集合很有用。len() 会告诉您结果:

colors = {"red", "green", "blue", "red"}
print(len(colors))

这会返回 3,因为 "red" 出现了两次但只计算一次。

len() 的底层工作原理

您可能和我一样好奇,len() 实际上如何确定大小。

在底层,当您对某个对象调用 len() 时,Python 会查找该对象的 __len__ 方法。内置类型如列表、字符串和字典都实现了这个方法。

了解这一点意味着,如果我们创建自己的类并希望 len() 适用于它,就必须自行定义一个 __len__ 方法:

class Box:
    def __init__(self, items):
        self.items = items

    def __len__(self):
        return len(self.items)

my_box = Box(["apple", "banana", "orange"])
print(len(my_box))

这里,len() 返回 3,因为这个盒子装了三个物品。就像对列表和字符串所做的那样,只要对象提供了 __len__ 方法,len() 就能适配。

当 len() 不起作用时会发生什么?

当然,并非所有 Python 对象都有长度。如果您尝试在不支持的对象上使用 len()(稍后我会用 int 数据类型演示),Python 会抛出 TypeError。这很常见,尤其在处理混合数据类型时。例如:

num = 42 
print(len(num))

这会触发如下错误:

TypeError: object of type 'int' has no len()

每当您看到这种错误,请再次确认您要测量的对象实际上是容器或序列(字符串、列表或字典),而不是整数或浮点数这类单个值。

一些实用的 len() 用法

我们把例子提升到更贴近真实编程场景的程度。

结合 range 进行循环

当您需要按索引遍历列表时,len() 可以帮助您设置合适的循环范围:

fruits = ["apple", "banana", "cherry"]

for i in range(len(fruits)):
    print(f"Index {i}: {fruits[i]}")

这会打印每个水果及其索引,同时给出顺序与上下文。

Index 0: apple
Index 1: banana
Index 2: cherry

检查容器是否为空

很多时候,您会在继续处理前想知道容器(如列表或字典)是否为空:

cart = []

if len(cart) == 0:
    print("Your shopping cart is empty.")

这种模式可帮助您在没有可处理内容时避免错误或不必要的计算。

截断过长的字符串

处理用户输入或显示标签时,您可能希望限制字符串长度。len() 能帮助您实施这些限制:

username = "superlongusername"

if len(username) > 10:
    username = username[:10]
    print(username)

这里,任何长度超过 10 个字符的用户名都会被裁剪。

len() 的常见误区

len() 即使对有一定 Python 经验的人也可能造成困扰:

  • 尝试对整数或浮点数使用 len():数字不是集合,没有长度。

  • 忽略了 len() 统计的是“项”,不是“值”:在字典中,len 统计的是键的数量——即使多个键指向同一个值。

  • 以为 len() 对所有对象都适用:自定义类需要实现 __len__ 方法,否则 len() 不知道如何处理。

记住这些规则,可以为您节省调试时间。

使用 len() 的错误处理

鉴于误用 len() 可能会引发 TypeError,在处理不可预知数据时,预先为此做好准备是明智的。try-except 代码块是优雅处理此类错误的简单方式:

data = 123

try:
    print(len(data))
except TypeError:
    print("Object has no length.")

程序不会崩溃,而是打印一条友好的提示。想要熟练掌握这类技巧,我们的 Object-Oriented Programming in Python 课程是很好的资源。

在自定义类中使用 len()

回到自定义类。自定义类是指您使用 class 关键字自行定义的任何类——比如在程序中建模某个特定对象,如 Team、Box 或 Library。前面您已经看到,len() 之所以能用于列表和字典等内置类型,是因为它们实现了一个名为 __len__() 的特殊方法。自定义类同样如此。如果您希望 len() 适用于它们,就需要自己定义 __len__()。

我并不是想用技术细节拖慢您的阅读节奏。我之所以强调这一点,是因为当您构建应当像 Python 原生集合那样行为的自定义数据容器时,这非常重要。支持 len() 能让您的对象更自然地融入 Python 生态,与其他函数和库良好协作。

下面是一个快速回顾:

class Team:
    def __init__(self, players):
        self.players = players

    def __len__(self):
        return len(self.players)

my_team = Team(["Alice", "Bob", "Cathy"])
print(len(my_team))

同样,len() 返回 3,这是正确的答案,因为您的队伍中有三名队员。

结语

下次当您需要在 Python 中计数、测量或验证某个对象的大小时,请记住 len() 是一个很好的选择。

不过既然已经读到最后,我还想提一件很重要的事。我们专注于一个函数,但在 Python 中几乎总有多种方法可以完成某个任务。我们有一篇文章展示了多种获取列表长度的方法,而 len() 只是其中一种:Python List Size: 8 Different Methods for Finding the Length of a List in Python。

持续练习新方法。这样一定能让您成为更强的程序员。别忘了报名我们的 Python Programming 技能路径,它将教您如何优化代码、编写函数与测试等等。

Josef Waples

作者

Josef Waples

我是数据科学编辑,曾为科学期刊发表的研究论文撰稿。我的兴趣领域包括线性代数、统计学、R 等相关主题。

主题