2024-03-28 10:10:45 发布
网友
在Python中,以下是获取元素数量的唯一方法吗?
arr.__len__()
如果是,为什么会有奇怪的语法?
Python使用duck typing:它不关心对象是什么,只要它有适合当前情况的接口。在对象上调用内置函数len()时,实际上是在调用其内部的len方法。自定义对象可以实现此接口,len()将返回答案,即使该对象在概念上不是序列。
有关接口的完整列表,请查看此处:http://docs.python.org/reference/datamodel.html#basic-customization
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
正是由于intentionally done this way,所以列表、元组和其他容器类型并不都需要显式实现公共的.length()方法,相反,您只需检查实现“magic”__len__()方法的任何对象的len()。
.length()
__len__()
len()
当然,这看起来是多余的,但是长度检查的实现可以有很大的不同,即使在同一种语言中也是如此。一个集合类型使用.length()方法,而另一个类型使用.length属性,而另一个使用.count()方法并不少见。有一个语言级关键字统一了所有这些类型的入口点。因此,即使您可能不认为是元素列表的对象也可以进行长度检查。这包括字符串、队列、树等
.length
.count()
len()的函数性质也很适合于函数式编程。
lengths = map(len, list_of_containers)
对任何有意义的东西(列表、字典、元组、字符串,…)取一个长度的方法是对它调用len。
len
l = [1,2,3,4] s = 'abcde' len(l) #returns 4 len(s) #returns 5
“奇怪”语法的原因是python在内部将len(object)转换为object.__len__()。这适用于任何对象。所以,如果您正在定义某个类,并且它有一个长度是有意义的,那么只需在它上定义一个__len__()方法,然后就可以在这些实例上调用len。
len(object)
object.__len__()
Python使用duck typing:它不关心对象是什么,只要它有适合当前情况的接口。在对象上调用内置函数len()时,实际上是在调用其内部的len方法。自定义对象可以实现此接口,len()将返回答案,即使该对象在概念上不是序列。
有关接口的完整列表,请查看此处:http://docs.python.org/reference/datamodel.html#basic-customization
对于元组也是这样:
字符串,实际上只是字符数组:
正是由于intentionally done this way,所以列表、元组和其他容器类型并不都需要显式实现公共的
.length()
方法,相反,您只需检查实现“magic”__len__()
方法的任何对象的len()
。当然,这看起来是多余的,但是长度检查的实现可以有很大的不同,即使在同一种语言中也是如此。一个集合类型使用
.length()
方法,而另一个类型使用.length
属性,而另一个使用.count()
方法并不少见。有一个语言级关键字统一了所有这些类型的入口点。因此,即使您可能不认为是元素列表的对象也可以进行长度检查。这包括字符串、队列、树等len()
的函数性质也很适合于函数式编程。对任何有意义的东西(列表、字典、元组、字符串,…)取一个长度的方法是对它调用
len
。“奇怪”语法的原因是python在内部将
len(object)
转换为object.__len__()
。这适用于任何对象。所以,如果您正在定义某个类,并且它有一个长度是有意义的,那么只需在它上定义一个__len__()
方法,然后就可以在这些实例上调用len
。相关问题 更多 >
编程相关推荐