从零到熟悉,带你掌握Pythonlen()函数的使⽤摘要:本⽂为你带来如何到长度内置数据类型的使⽤len() 使⽤len()与第三⽅数据类型提供⽤于⽀持len()与⽤户定义的类。
本⽂分享⾃华为云社区《》,作者:Yuchuan 。
在许多情况下,您需要到存储在数据结构中的项⽬数。Python 的内置函数len()是帮助您完成此任务的⼯具。
在某些情况下,的使⽤len()很简单。但是,有时您需要更详细地了解此函数的⼯作原理以及如何将其应⽤于不同的数据类型。
在本教程中,您将学习如何:
到的长度内置数据类型的使⽤len()
使⽤len()与第三⽅数据类型
提供⽤于⽀持len()与⽤户定义的类
在本⽂结束时,您将知道何时使⽤len()Python 函数以及如何有效地使⽤它。您将知道哪些内置数据类型
是有效参数len(),哪些不能使⽤。您还可以了解如何使⽤len()第三⽅类型,如ndarray在与NumPy和DataFrame在⼤熊猫,并⽤⾃⼰的类。
Python ⼊门 len()
该函数len()是 Python 的内置函数之⼀。它返回对象的长度。例如,它可以返回列表中的项⽬数。您可以将该函数⽤于许多不同的数据类型。但是,并⾮所有数据类型都是的有效参数len()。
您可以从查看此功能的帮助开始:
>>>
>>> help(len)
Help on built-in function len in module builtins:
len(obj, /)
Return the number of items in a container.
该函数将⼀个对象作为参数并返回该对象的长度。该⽂件对len()去远⼀点:
返回对象的长度(项⽬数)。参数可以是序列(例如字符串、字节、元组、列表或范围)或集合(例如字典、集合或冻结集合)。(来源)
当您使⽤内置数据类型和许多带有的第三⽅类型时len(),该函数不需要遍历数据结构。容器对象的长度存储为对象的属性。每次在数据结构中添加或删除项⽬时,都会修改此属性len()的值,并返回长度属性的值。这确保了len()有效地⼯作。
在以下部分中,您将了解如何使⽤len()序列和集合。您还将了解⼀些不能⽤作len()Python 函数参数的数据类型。
使⽤len()内置序列
⼀个序列是订购物品的容器。列表、元组和字符串是 Python 中的三个基本内置序列。您可以通过调⽤到序列的长度len():
>>>
>>> greeting = "Good Day!"
>>> len(greeting)
9
>>> office_days = ["Tuesday", "Thursday", "Friday"]
>>> len(office_days)
3
>>> london_coordinates = (51.50722, -0.1275)
>>> len(london_coordinates)
2
在查 string greeting、 listoffice_days和 tuple的长度时london_coordinates,您len()以相同的⽅式使⽤。所有三种数据类型都是的有效参数len()。
该函数len()始终返回⼀个整数,因为它正在计算您传递给它的对象中的项⽬数。0如果参数是空序列,则函数返回:
菜鸟教程python如何用函数将长度不同的数列相加>>>
>>> len("")
>>> len([])
>>> len(())
在上⾯的例⼦中,你到了⼀个空字符串、⼀个空列表和⼀个空元组的长度。该函数0在每种情况下都返回。
⼀个range对象也可以创建使⽤序列range()。⼀个range对象不存储所有的值,但它们产⽣在需要时他们。但是,您仍然可以range使⽤len()以下⽅法到对象的长度:
>>> len("")
>>> len([])
>>> len(())
此数字范围包括从1到19增量为的整数2。range对象的长度可以通过开始、停⽌和步长值来确定。
在本节中,您已将len()Python 函数⽤于字符串、列表、元组和range对象。但是,您也可以将该函数
与任何其他内置序列⼀起使⽤。
使⽤len()带内置集合
在某些时候,您可能需要在列表或其他序列中查唯⼀项的数量。您可以使⽤集和len()来实现这⼀点:
>>>
>>> import random
>>> numbers = [random.randint(1, 20) for _ in range(20)]
>>> numbers
[3, 8, 19, 1, 17, 14, 6, 19, 14, 7, 6, 1, 17, 10, 8, 14, 17, 10, 2, 5]
>>> unique_numbers = set(numbers)
{1, 2, 3, 5, 6, 7, 8, 10, 14, 17, 19}
>>> len(unique_numbers)
11
您numbers使⽤列表推导式⽣成列表,它包含 20 个介于1和之间的随机数20。由于您⽣成的是随机数,因此每次运⾏代码时输出都会不同。在这个特定的运⾏中,有 20 个随机⽣成的数字列表中有 11 个唯⼀数字。
您将经常使⽤的另⼀种内置数据类型是dictionary。在字典中,每⼀项都由⼀个键值对组成。当您使⽤字典作为的参数时len(),该函数返回字典中的项⽬数:
>>>
>>> len({"James": 10, "Mary": 12, "Robert": 11})
3
>>> len({})
第⼀个⽰例的输出显⽰此字典中有三个键值对。与序列的情况⼀样,当参数是空字典或空集时len()将返回0。这导致空字典和空集为假。
探索len()其他内置数据类型
您不能使⽤所有内置数据类型作为len(). 对于其中不存储多个项⽬的数据类型,长度的概念不相关。这是数字和布尔类型的情况:
>>>
>>> len(5)
Traceback (most recent call last):
...
TypeError: object of type 'int' has no len()
>>> len(5.5)
Traceback (most recent call last):
...
TypeError: object of type 'float' has no len()
>>> len(True)
Traceback (most recent call last):
...
TypeError: object of type 'bool' has no len()
>>> len(5 + 2j)
Traceback (most recent call last):
...
TypeError: object of type 'complex' has no len()
该整数,浮点数,布尔,以及复杂类型的内置数据类型,你不能使⽤⽰例len()。TypeError当参数是没有长度的数据类型的对象时,该函数会引发 a 。
您还可以探索是否可以使⽤迭代器和⽣成器作为参数len():
>>>
>>> import random
>>> numbers = [random.randint(1, 20) for _ in range(20)]
>>> len(numbers)
>>> numbers_iterator = iter(numbers)
>>> len(numbers_iterator)
Traceback (most recent call last):
...
TypeError: object of type 'list_iterator' has no len()
>>> numbers_generator = (random.randint(1, 20) for _ in range(20))
>>> len(numbers_generator)
Traceback (most recent call last):
...
TypeError: object of type 'generator' has no len()
您已经看到列表具有长度,这意味着您可以将其⽤作len(). 您可以使⽤内置函数从列表中创建⼀个迭代器iter()。在迭代器中,只要需要,就会获取每个项⽬,例如在使⽤函数next()或在循环中时。但是,您不能在len().
你得到了TypeError,当您尝试使⽤⼀个迭代器作为⼀个参数len()。由于迭代器在需要时获取每个项⽬,因此测量其长度的唯⼀⽅法是耗尽迭代器。迭代器也可以是⽆限的,例如由返回的迭代器le(),因此它的长度⽆法定义。
不能使⽤发电机与len()出于同样的原因。如果不使⽤它们,就⽆法测量这些物体的长度。
len()⽤⼀些例⼦进⼀步探索
在本节中,您将了解len(). 这些⽰例将帮助您更好地了解何时使⽤此功能以及如何有效地使⽤它。在某些⽰例中,您还将看到len()可能的解决⽅案但可能有更多 Pythonic ⽅法来实现相同输出的情况。
验证⽤户输⼊的长度
的⼀个常见⽤例len()是验证⽤户输⼊的序列的长度:
# username.py
username = input("Choose a username: [4-10 characters] ")
if4 <= len(username) <= 10:
print(f"Thank you. The username {username} is valid")
else:
print("The username must be between 4 and 10 characters long")
在此⽰例中,您使⽤if语句来检查返回的整数len()是否⼤于或等于4且⼩于或等于10。你可以运⾏这个脚本,你会得到⼀个类似于下⾯的输出:
$ python username.py
Choose a username: [4-10 characters] stephen_g
Thank you. The username stephen_g is valid
在这种情况下,⽤户名的长度为 9 个字符,因此if语句中的条件计算结果为True。您可以再次运⾏脚本并输⼊⽆效的⽤户名:
$ python username.py
Choose a username: [4-10 characters] sg
The username must be between 4 and 10 characters long
在这种情况下,len(username)返回2,并且if语句中的条件计算结果为False。
根据对象的长度结束循环
len()如果您需要检查可变序列(例如列表)的长度何时达到特定数字,您将使⽤。在以下⽰例中,您要求⽤户输⼊三个⽤户名选项,并将它们存储在列表中:
# username.py
usernames = []
print("Enter three options for your username")
while len(usernames) < 3:
username = input("Choose a username: [4-10 characters] ")
if4 <= len(username) <= 10:
print(f"Thank you. The username {username} is valid")
usernames.append(username)
else:
print("The username must be between 4 and 10 characters long")
print(usernames)
您现在使⽤的从结果len()的while声明。如果⽤户输⼊了⽆效的⽤户名,您不会保留输⼊。当⽤户输⼊有效字符串时,您将其附加到列表中usernames。循环重复,直到列表中有三个项⽬。
您甚⾄可以len()⽤来检查序列何时为空:
>>>
>>> colors = ["red", "green", "blue", "yellow", "pink"]
>>> while len(colors) > 0:
... print(f"The next color is {colors.pop(0)}")
...
The next color is red
The next color is green
The next color is blue
The next color is yellow
The next color is pink
您使⽤ list ⽅法.pop()在每次迭代中从列表中删除第⼀项,直到列表为空。如果您在⼤型列表上使⽤此⽅法,则应从列表末尾删除项⽬,因为这样效率更⾼。您还可以使⽤内置模块中的deque数据类型collections,它允许您有效地从左侧弹出。
通过使⽤序列的真实性,有⼀种更 Pythonic 的⽅式来实现相同的输出:
>>>
>>> colors = ["red", "green", "blue", "yellow", "pink"]
>>> while colors:
... print(f"The next color is {colors.pop(0)}")
...
The next color is red
The next color is green
The next color is blue
The next color is yellow
The next color is pink
空列表是假的。这意味着该while语句将空列表解释为False。⾮空列表是真实的,while语句将其视为True. 返回的值len()决定了序列的真实性。⼀个序列是truthy当len()返回任何⾮零整数,并且当falsylen()返回0。
查序列最后⼀项的索引
想象⼀下,您想要⽣成⼀个范围1为的随机数序列,10并且您希望不断向该序列添加数字,直到所有数字的总和超过21。以下代码创建⼀个空列表并使⽤while循环填充列表:
>>>
>>> import random
>>> numbers = []
>>> while sum(numbers) <= 21:
... numbers.append(random.randint(1, 10))
>>> numbers
[3, 10, 4, 7]
>>> numbers[len(numbers) - 1]
7
>>> numbers[-1] # A more Pythonic way to retrieve the last item
7
>>> numbers.pop(len(numbers) - 1) # You can use numbers.pop(-1)
7
>>> numbers
[3, 10, 4]
您将随机数附加到列表中,直到总和超过21。当您⽣成随机数时,您将获得的输出会有所不同。要显⽰列表中的最后⼀个数字,请使⽤它len(numbers)并1从中减去,因为列表的第⼀个索引是0。Python 中的索引允许您使⽤索引-1来获取列表中的最后⼀项。因此,虽然您可以len()在这种情况下使⽤,但
您不需要。
您想删除列表中的最后⼀个数字,以便列表中所有数字的总和不超过21。您len()再次使⽤来计算列表中最后⼀项的索引,您将其⽤作列表⽅法的参数.pop()。即使在这种情况下,您也可以将其-1⽤作.pop()从列表中删除最后⼀项并返回它的参数。
将列表分成两半
如果需要将序列分成两半,则需要使⽤表⽰序列中点的索引。您可以使⽤len()来查此值。在以下⽰例中,您将创建⼀个随机数列表,然后将其拆分为两个较⼩的列表:
>>>
>>> import random
>>> numbers = [random.randint(1, 10) for _ in range(10)]
>>> numbers
[9, 1, 1, 2, 8, 10, 8, 6, 8, 5]
>>> first_half = numbers[: len(numbers) // 2]
>>> second_half = numbers[len(numbers) // 2 :]
>>> first_half
[9, 1, 1, 2, 8]
>>> second_half
[10, 8, 6, 8, 5]
在定义的赋值语句中first_half,使⽤表⽰从开头numbers到中点的项⽬的切⽚。您可以通过分解切⽚表达式中使⽤的步骤来计算切⽚表⽰的内容:
1. ⾸先,len(numbers)返回整数10。
2. 接下来,10 // 2在5使⽤整数除法运算符时返回整数。
3. 最后,0:5是⼀个切⽚,表⽰前五个项⽬,其索引0为4。请注意,端点被排除在外。
在下⼀个定义中second_half,在切⽚中使⽤相同的表达式。但是,在这种情况下,整数5表⽰范围的开始。切⽚现在5:代表从索引5到列表末尾的项⽬。
如果您的原始列表包含奇数个项⽬,则其长度的⼀半将不再是整数。当您使⽤整数除法时,您将获得数字的下限。该列表first_half现在将⽐少⼀项second_half。
您可以通过创建⼀个包含 11 个数字⽽不是 10 个数字的初始列表来尝试这⼀点。结果列表将不再是⼀半,但它们将代表最接近拆分奇数序列的替代⽅法。
将len()函数与第三⽅库⼀起使⽤
您还可以将 Pythonlen()与来⾃第三⽅库的多种⾃定义数据类型结合使⽤。在本教程的最后⼀节中,您将了解的⾏为如何len()取决于类定义。在本节中,您将查看使⽤len()来⾃两个流⾏的第三⽅库的数据类型的⽰例。
NumPy 的 ndarray
该NumPy的模块是在Python编程的所有定量应⽤的基⽯。该模块介绍了numpy.ndarray数据类型。这种数据类型以及 NumPy 中的函数⾮常适合数值计算,并且是其他模块中数据类型的构建块。
在开始使⽤ NumPy 之前,您需要安装该库。您可以使⽤ Python 的标准包管理器pip,并在控制台中运⾏以下命令:
$ python -m pip install numpy
您已经安装了 NumPy,现在您可以从列表中创建⼀个 NumPy 数组并len()在该数组上使⽤:
>>>
>>> import numpy as np
>>> numbers = np.array([4, 7, 9, 23, 10, 6])
>>> type(numbers)
<class'numpy.ndarray'>
>>> len(numbers)
6
NumPy 函数从您作为参数传递的列表中np.array()创建⼀个类型的对象numpy.ndarray。
但是,NumPy 数组可以有多个维度。您可以通过将列表列表转换为数组来创建⼆维数组:
>>>
>>> import numpy as np
>>> numbers = [
[11, 1, 10, 10, 15],
[14, 9, 16, 4, 4],
]
>>> numbers_array = np.array(numbers)
>>> numbers_array
array([[11, 1, 10, 10, 15],
[14, 9, 16, 4, 4]])
>>> len(numbers_array)
2
>>> numbers_array.shape
(2, 5)
>>> len(numbers_array.shape)
2
>>> numbers_array.ndim
2
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论