问题:arr .__ len __()是在Python中获取数组长度的首选方法吗?
回答 0
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)
回答 1
取任何有意义的长度(列表,字典,元组,字符串等)的方法是调用len
它。
l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5
使用“奇怪”语法的原因是python在内部翻译len(object)
成object.__len__()
。这适用于任何对象。因此,如果您正在定义某个类,并且让它具有长度是有意义的,则只需__len__()
在其上定义一个方法,然后人们便可以调用len
这些实例。
回答 2
Python使用鸭子类型:它不在乎对象是什么,只要它具有适合当前情况的适当接口即可。当您在对象上调用内置函数len()时,实际上是在调用其内部__len__方法。自定义对象可以实现此接口,并且len()将返回答案,即使该对象在概念上不是序列。
有关接口的完整列表,请在此处查看:http : //docs.python.org/reference/datamodel.html#basic-customization
回答 3
获取任何python对象长度的首选方法是将其作为参数传递给len
函数。然后在内部,python将尝试调用__len__
所传递对象的特殊方法。
回答 4
只需使用len(arr)
:
>>> import array
>>> arr = array.array('i')
>>> arr.append('2')
>>> arr.__len__()
1
>>> len(arr)
1
回答 5
您可以len(arr)
按照前面的答案中的建议使用,以获取数组的长度。如果需要二维数组的尺寸,可以使用arr.shape
返回高度和宽度
回答 6
len(list_name)
函数以list作为参数,并调用list的__len__()
函数。
回答 7
Python建议用户使用len()
而不是__len__()
为了保持一致性,就像其他人所说的那样。但是,还有其他一些好处:
对于一些内置的类型,如list
,str
,bytearray
等等,在用Cython实现len()
需要一个快捷方式。它直接ob_size
以C结构返回,比调用更快__len__()
。
如果您对这样的细节感兴趣,可以阅读Luciano Ramalho的书“ Fluent Python”。其中包含许多有趣的细节,可能有助于您更深入地了解Python。