arr .__ len __()是获取Python数组长度的首选方法吗?

Is arr.__len__() the preferred way to get the length of an array in Python?

在python中,下面是获取元素数量的唯一方法吗?

1
arr.__len__()

如果是这样,为什么要使用奇怪的语法?


1
2
3
my_list = [1,2,3,4,5]
len(my_list)
# 5

同样适用于元组:

1
2
3
my_tuple = (1,2,3,4,5)
len(my_tuple)
# 5

字符串,实际上只是字符数组:

1
2
3
my_string = 'hello world'
len(my_string)
# 11

这样做的目的是为了使列表、元组和其他容器类型不需要显式地实现一个公共的.length()方法,相反,您可以检查len()中实现"magic"__len__()方法的任何内容。

当然,这似乎是多余的,但是长度检查实现可能会有很大的不同,即使在同一种语言中也是如此。一个集合类型使用.length()方法,而另一个类型使用.length属性,而另一个类型使用.count()属性,这并不少见。拥有一个语言级别的关键字可以统一所有这些类型的入口点。因此,即使您不认为是元素列表的对象也可以进行长度检查。这包括字符串、队列、树等。

len()的功能性也很适合于编程的功能风格。

1
lengths = map(len, list_of_containers)


任何有意义的东西(列表、字典、元组、字符串等)的长度都可以在上面调用len

1
2
3
4
l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5

"奇怪"语法的原因是,在内部,python将len(object)转换为object.__len__()。这适用于任何对象。因此,如果您定义了一些类,并且它有一个长度是合理的,那么只需在它上定义一个__len__()方法,然后就可以在这些实例上调用len


python使用duck类型:它不关心对象是什么,只要它有适合当前情况的接口。当您对一个对象调用内置函数len()时,实际上是在调用它的内部 len 方法。自定义对象可以实现这个接口,len()将返回答案,即使对象在概念上不是序列。

有关接口的完整列表,请查看以下内容:http://docs.python.org/reference/datamodel.html基本自定义


获取任何python对象长度的首选方法是将其作为参数传递给len函数。在内部,python将尝试调用所传递对象的特殊__len__方法。


只需使用len(arr):

1
2
3
4
5
6
7
>>> import array
>>> arr = array.array('i')
>>> arr.append('2')
>>> arr.__len__()
1
>>> len(arr)
1


您可以使用len(arr)。如前面的答案中建议的那样,获取数组的长度。如果需要二维数组的尺寸,可以使用arr.shape返回高度和宽度


len(list_name)函数以list为参数,调用list的__len__()函数。


python建议用户使用len()而不是__len__()来保持一致性,就像其他人说的那样。但是,还有一些其他好处:

对于一些内置类型,如liststrbytearray等,len()的cython实现走了一条捷径。它以C结构直接返回ob_size,这比调用__len__()快。

如果你对这些细节感兴趣,你可以读卢西亚诺·拉马尔霍写的《流畅的Python》。其中有许多有趣的细节,可以帮助您更深入地理解Python。