语法、示例和用例

在Python中,当处理可迭代对象时,获取其包含元素的数量是一项常见的操作。本文将深入探讨如何使用Python的内置函数len()来获取可迭代对象的长度,并介绍其相关应用。

Python提供了一系列内置的数据结构以及操作这些数据结构的方法。同时,还有一些内置函数在处理这些数据结构时非常有用。len()函数就是其中之一,它可以返回可迭代对象中元素的个数。

本教程将详细讲解如何将len()函数应用于列表、元组、字符串等不同的可迭代对象。此外,我们还会探讨一些常见的应用场景。

让我们开始吧!👩‍🏫

Python len()函数的语法

len()函数在Python中的语法如下:

len(iterable)

如你所见,len()函数接收一个参数,该参数必须是一个有效的可迭代对象。可迭代对象通常是列表、元组或字符串,但也包括其他有效类型。

len()函数的语法十分简洁。接下来,我们将通过一些例子来进一步了解它的用法。

📑 为了方便学习,你可以在Python REPL中运行本教程中的代码示例。

len()函数应用于可迭代对象

序列类型

你可以使用len()函数来获取序列类型可迭代对象的长度,例如列表、元组和字符串。

以下是一些示例:

>>> nums = [9,3,6,1,2]
>>> len(nums)
5

>>> nums_tup = (9,3,6,1,2)
>>> len(nums_tup)
5

对于这些存储序列的数据结构,通常会使用索引来访问元素或获取子序列。

其他集合类型

len()函数同样适用于其他Python集合类型,如集合和字典。

这些数据结构是无序集合。尽管你可能不关心元素的顺序,但了解集合中元素的总数仍然很有帮助。

>>> nums_set = set(nums)
>>> len(nums_set)
5

>>> prices = {'Notebook':5,'Pencil case':7,'Bookmarks':3,'Pens':1,'Markers':8}
>>> len(prices)
5

len()函数的常见应用

目前为止,我们已经了解了如何使用len()函数来获取可迭代对象中元素的数量。接下来,我们将探讨一些实际应用场景。

#1. 在for循环中进行迭代

Python的for循环提供了一种便捷的方式来遍历可迭代对象,语法为for item in iterable。然而,如果你需要访问每个元素的索引,或者同时访问索引和元素,可以使用range()函数,如下所示:

>>> nums = [9,2,4,7,8]
>>> for i in range(len(nums)):
...      print(f"Index {i}: {nums[i]}")

因为range(N)生成一个从0到N-1的整数序列,使用range(len(nums))可以得到一组有效的索引用于循环。

# 输出
Index 0: 9
Index 1: 2
Index 2: 4
Index 3: 7
Index 4: 8

然而,Python推荐使用enumerate函数来访问索引和元素,这是一种更简洁的方式:

>>> nums = [9,2,4,7,8]
>>> for idx,num in enumerate(nums):
...     print(f"Index {idx}: {num}")
# 输出
Index 0: 9
Index 1: 2
Index 2: 4
Index 3: 7
Index 4: 8

#2. 在while循环中作为条件

假设你有一个数字列表nums。列表的pop()方法可以删除列表中的最后一个元素并返回该元素。

只要nums列表的长度(len(nums))大于零,就表示列表中至少有一个元素可以被删除。

>>> nums = [9,2,4,7,8]
>>> while len(nums) > 0:
...     nums.pop()
# 输出
8
7
4
2
9

上述示例等价于以下更简洁的写法:

>>> nums = [9,2,4,7,8]
>>> while nums:
...     nums.pop()

while nums:的含义是“当nums列表不为空时执行循环”。

#3. 检查和验证可迭代对象的长度

len()函数的另一个常见用途是检查和验证某些可迭代对象的长度。

例如,我们可以使用len()函数来检查用户名是否满足长度要求:

>>> username = "another-random-user"
>>> if len(username) > 10:
...     print("用户名过长,最多允许10个字符。")
... elif len(username) < 5:
...     print("用户名过短,至少需要5个字符。")
... else:
...     print("用户名有效!")
用户名过长,最多允许10个字符。

#4. 在列表和字典推导式中使用

Python中的推导式提供了一种简洁的语法,可以从现有可迭代对象构建新的可迭代对象。我们可以在推导式中使用内置函数。

列表推导式

在此列表推导式中,我们使用len()函数来获取语言列表中每个字符串的长度。

>>> languages = ['Python','C','Rust','JavaScript']
>>> len_langs = [len(lang) for lang in languages]
>>> len_langs
[6, 1, 4, 10]

字典推导式

在此字典推导式中,我们使用语言列表和len()函数来构建一个字典,其中键是语言名称,值是语言名称的长度:

>>> languages = ['Python','C','Rust','JavaScript']
>>> lang_len = {lang:len(lang) for lang in languages}
>>> lang_len
{'Python': 6, 'C': 1, 'Rust': 4, 'JavaScript': 10}

这里,键和值分别是语言字符串及其长度。

#5. 自定义排序的key参数

Python提供了内置的sort()方法用于就地排序列表,以及sorted()函数用于排序列表和其他可迭代对象。

在这两种情况下,都可以使用key参数来自定义排序规则。

例如,我们可以根据字符串的长度对语言列表进行排序。

>>> languages = ['Python','C','Rust','JavaScript']
>>> languages.sort(key=len)
>>> languages
['C', 'Rust', 'Python', 'JavaScript']

在下面的代码片段中,我们使用sorted()函数来获取排序后的列表。

>>> languages = ['Hindi','English','German','French']
>>> sorted(languages,key=len)
['Hindi', 'German', 'French', 'English']

在这个例子中,“German”和“French”的长度都为6。由于sorted()函数执行稳定排序,所以保留了它们在原始列表中的顺序。

#6. 获取NumPy数组的长度

len()函数也可以用于获取其他数据结构的长度,例如NumPy数组

>>> import numpy as np
>>> np_array = np.array([3,4,6,9])
>>> type(np_array)
<class 'numpy.ndarray'>
>>> len(np_array)
4

在这个例子中,np_array是一个包含4个元素的一维数组,因此len(np_array)返回4,即数组中元素的数量。

矩阵是二维数组。

以下面的例子为例,len(np_array)返回2,即行数。

>>> matrix = [[1,2,3],[4,5,6]]
>>> np_array = np.array(matrix)
>>> np_array
array([[1, 2, 3],
       [4, 5, 6]])
>>> len(np_array)
2

为了更好地理解,让我们回到矩阵的概念。我们有一个嵌套的列表结构,其中外部列表包含两个嵌套列表。len()函数返回容器中元素的数量,这里指的是两个列表。

>>> help(len)
Help on built-in function len in module builtins:

len(obj, /)
    Return the number of items in a container.

然而,当处理多维数组时,建议使用shape属性来获取数组的维度信息。

>>> np_array.shape
(2, 3)

使用len()函数时需要避免的常见错误

在结束讨论之前,让我们回顾一下在Python中使用len()函数时应该避免的一些常见错误。

len()函数用于不可迭代的数据类型

我们知道len()函数只接受有效的可迭代对象作为参数。这意味着如果你尝试使用不可迭代的无效数据类型调用len()函数,将会引发错误。

这些无效类型包括整数、浮点数和布尔值等基本数据类型:

>>> len(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()

>>> len(True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'bool' has no len()

>>> len(3.14)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'float' has no len()

在Python中,生成器是一种节省内存的选择,尤其是在需要生成序列的场景下。生成器对象根据需要逐个返回序列的元素。但生成器对象没有长度。

因此,如果你尝试计算生成器对象的长度,将会引发错误:

>>> nums_sq = (i*i for i in range(10))
>>> nums_sq
<generator object <genexpr> at 0x0157DBC0>
>>> len(nums_sq)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()

len()函数用于长度为1的元组

如果仅将一个元素放入元组中,Python会将其视为一个单独的元素,而不是一个元组。

这是一个示例:

>>> nums = (1)
>>> len(nums)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()

因此,当你的元组只有一个元素时,需要按照如下格式初始化它:tuple_name = (elt, ),才能将其解释为一个元组:

>>> nums = (1,)
>>> len(nums)
1

总结

以下是本教程的主要内容总结:

  • 你可以使用Python中的len()函数来获取任意可迭代对象中元素的数量。 len()函数的语法是:len(任何有效的可迭代对象)
  • 这包括列表、元组、字符串等序列,以及字典和集合等集合类型。
  • len()函数常用于循环和推导式中。
  • len()函数还可以作为自定义排序的key参数。例如,根据字符串的长度对字符串列表进行排序。

接下来,你可以学习如何使用Python的sum()函数。