在Python中,下面是获取元素数量的唯一方法吗?
arr.__len__()
如果是这样,为什么会有奇怪的语法?
在Python中,下面是获取元素数量的唯一方法吗?
arr.__len__()
如果是这样,为什么会有奇怪的语法?
my_list = [1,2,3,4,5]
len(my_list)
# 5
这同样适用于元组:
my_tuple = (1,2,3,4,5)
len(my_tuple)
# 5
字符串,实际上就是字符的数组:
my_string = 'hello world'
len(my_string)
# 11
这样做是有意的,以便列表、元组和其他容器类型或可迭代对象都不需要显式地实现一个公共的.length()方法,相反,你可以只检查任何实现“神奇”__len__()方法的len()。
当然,这看起来有些多余,但是长度检查的实现可以有很大的差异,即使在同一种语言中也是如此。一种集合类型使用.length()方法,而另一种类型使用.length属性,而另一种类型使用.count(),这种情况并不少见。拥有语言级关键字可以统一所有这些类型的入口点。因此,即使您认为不是元素列表的对象也可以进行长度检查。这包括字符串、队列、树等。
len()的函数性质也很适合函数式编程风格。
lengths = map(len, list_of_containers)
只需使用len(arr):
>>> import array
>>> arr = array.array('i')
>>> arr.append('2')
>>> arr.__len__()
1
>>> len(arr)
1
你获取任何有意义的东西(列表、字典、元组、字符串……)的长度的方法是对它调用len。
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#basic-customization
Python建议用户使用len()而不是__len__()来保持一致性,就像其他人说的那样。然而,还有其他一些好处:
对于一些内置类型,如list、str、bytearray等,len()的Cython实现采用了一种快捷方式。它直接返回C结构中的ob_size,这比调用__len__()更快。
如果你对这些细节感兴趣,你可以阅读卢西亚诺·拉玛略的《流利的Python》一书。其中有许多有趣的细节,可能有助于您更深入地理解Python。