Python 为什么sorted()和reversed()是内置函数而不是序列方法?

Python 为什么sorted()和reversed()是内置函数而不是序列方法?,python,python-3.3,Python,Python 3.3,我现在正在深入研究Python3.3,我想知道为什么有些用于管理集合/iterable的函数(例如,sorted(),reversed())是内置的,但有些函数是作为集合对象的方法实现的?我可以使用方法append()将项追加到列表中,但要获得它的长度,我应该使用内置函数len()。对我来说,这似乎不一致,但我认为我在新语言中遗漏了一些要点。简单的回答是,这些决定是出于人为原因而不是技术原因做出的 len()与obj.length()的对比理由是(Python的仁慈的终身独裁者): 首先,出于H

我现在正在深入研究Python3.3,我想知道为什么有些用于管理集合/iterable的函数(例如,
sorted()
reversed()
)是内置的,但有些函数是作为集合对象的方法实现的?我可以使用方法
append()
将项追加到列表中,但要获得它的长度,我应该使用内置函数
len()
。对我来说,这似乎不一致,但我认为我在新语言中遗漏了一些要点。

简单的回答是,这些决定是出于人为原因而不是技术原因做出的

len()
obj.length()
的对比理由是(Python的仁慈的终身独裁者):

首先,出于HCI的原因,我选择了len(x)而不是x.len()(def
\uu len\uu()
来得晚得多)。实际上有两个相互交织的原因,都是HCI:

(a) 对于某些运算来说,前缀表示法的可读性比后缀表示法要好——前缀(和中缀!)运算在数学中有着悠久的传统,它喜欢在视觉上帮助数学家思考问题的表示法。将我们将x*(a+b)这样的公式改写为x*a+x*b的简单方法与使用原始OO符号做同样事情的笨拙方法相比较

(b) 当我读到len(x)的代码时,我知道它是在询问某个东西的长度。这告诉我两件事:结果是一个整数,参数是某种容器。相反,当我阅读x.len()时,我必须知道x是某种容器,它实现了一个接口或继承了一个具有标准len()的类。当一个没有实现映射的类有一个get()或keys()方法,或者一个不是文件的类有一个write()方法时,我们偶尔会遇到困惑

他还解释了为什么
sorted()
reversed()
不是方法:

还要注意,许多功能是根据非正式接口定义的;例如,reversed适用于任何支持对项目进行随机访问且长度已知的对象。在实践中,将max、sum、map、any、In和其他东西实现为内置函数和运算符实际上比将它们实现为支持它们的每种类型的方法要少


sorted
将任何iterable作为其第一个参数。与列表方法
sort
相比,我应该先阅读常见问题解答::)最后一段关于
sorted()
reversed()
的内容很好,但为什么他们不使用mixin之类的东西,甚至不使用抽象方法呢?我只是想澄清一下:我来自C#,在C#,集合类和接口语言本身并没有内置到语言中。@artvolk:这是语言设计的决定。mixin和abstract方法在C#和Java中运行良好,但Python更依赖于duck类型。如果希望新集合以某种方式运行,只需添加一些方法和实例,即可供各种内置函数使用。至少在做出这些设计决策时是这样。既然我们有了ABC,
reverse()
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu<代码>已排序
仍然没有自定义点。可能是因为如果设置了
参数,那么容器基本上不会对流程做出任何贡献。