我现在正在深入研究Python 3.3,我想知道为什么一些用于管理集合/可迭代的函数(例如,sorted()
,reversed()
)是内置的,但有些函数是作为集合的方法实现的对象?我可以使用方法append()
将项目追加到列表中,但为了得到它的长度,我应该使用内置函数len()
。这对我来说似乎不一致,但我想我只是错过了一些新语言的观点。
答案 0 :(得分:5)
简短的回答是,这些决定是出于人为原因而非技术原因。
len()
与obj.length()
的推理是explained by Guido van Rossum(Python's仁慈的独裁者):
首先,由于HCI的原因,我选择了len(x)而不是x.len()(def
__len__()
来得更晚)。实际上有两个相互交织的原因,都是HCI:(a)对于某些操作,前缀表示法只读取比后缀更好 - 前缀(和中缀!)操作在数学中有悠久的传统,它喜欢视觉效果帮助数学家思考问题的符号。比较我们将x *(a + b)这样的公式重写为x * a + x * b的简单性,以及使用原始OO表示法做同样事情的笨拙。
(b)当我阅读说len(x)的代码时,我知道它要求的东西长度。这告诉我两件事:结果是一个整数,参数是某种容器。相反,当我读取x.len()时,我必须知道x是某种实现接口的容器,或者是从具有标准len()的类继承的。当没有实现映射的类具有get()或keys()方法,或者不是文件的类具有write()方法时,见证我们偶尔会遇到的混淆。
他还解释了为什么sorted()
和reversed()
不是方法:
另请注意,许多功能都是根据非正式接口定义的;例如,reverse适用于任何支持随机访问项目且具有已知长度的内容。在实践中,实现诸如max,sum,map,any,in等内容作为内置函数和运算符实际上比将它们实现为需要支持它们的每种类型的方法的代码更少。