在Python中获取数组的长度
在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
。
l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5
“奇怪”语法的原因是内部python将len(object)
转换为object.__len__()
。 这适用于任何对象。 所以,如果你正在定义一些类,并且它有一个长度是有意义的,只需在其上定义一个__len__()
方法,然后可以在这些实例上调用len
。
Python使用鸭子打字:它不关心对象是什么,只要它具有适合当前情况的适当界面即可。 在对象上调用内置函数len()时,实际上正在调用其内部__len__方法。 自定义对象可以实现此接口,并且len()将返回答案,即使对象在概念上不是序列。
有关接口的完整列表,请看这里:http://docs.python.org/reference/datamodel.html#basic-customization
链接地址: http://www.djcxy.com/p/28337.html