Python 2.7 为什么sort()方法中的双参数函数在没有参数的情况下运行,为什么该函数应该有两个参数?

Python 2.7 为什么sort()方法中的双参数函数在没有参数的情况下运行,为什么该函数应该有两个参数?,python-2.7,function,parameters,function-calls,cmp,Python 2.7,Function,Parameters,Function Calls,Cmp,下面的代码块将['AAB','BBC','EFM','CNN','ESPN','ITN','XYZ']作为输出。但是sort()方法中的MyCmp()函数没有任何参数。如果我创建了一个只接受一个参数的函数,并且在sort()方法中调用了该函数,它会给出一条错误消息,告诉“TypeError:MyCmp()只接受1个参数(给定2个)” 有人能解释一下原因吗?为什么MyCmp()函数不需要像在普通函数调用中那样给定任何参数 A = ['ESPN','BBC','AAB','XYZ','CNN','I

下面的代码块将['AAB','BBC','EFM','CNN','ESPN','ITN','XYZ']作为输出。但是sort()方法中的MyCmp()函数没有任何参数。如果我创建了一个只接受一个参数的函数,并且在sort()方法中调用了该函数,它会给出一条错误消息,告诉“TypeError:MyCmp()只接受1个参数(给定2个)

有人能解释一下原因吗?为什么MyCmp()函数不需要像在普通函数调用中那样给定任何参数

A = ['ESPN','BBC','AAB','XYZ','CNN','ITN','EFM']

def MyCmp(a,b):
    return cmp(a[1],b[1])
A.sort(MyCmp)

print A
当我在函数中添加打印a、b行时。它输出

BBC ESPN
AAB BBC
XYZ AAB
XYZ BBC
XYZ ESPN
CNN ESPN
CNN BBC
ITN CNN
ITN XYZ
ITN ESPN
EFM ESPN
EFM BBC
EFM CNN
当您执行
A.sort(MyCmp)
时,您将
MyCmp
作为参数传递给
A.sort
。您自己根本没有在呼叫
MyCmp
。相反,这是
sort
的实现在运行时要做的事情。由于
list.sort
的工作方式,它在实际调用时将提供两个参数

您可以编写自己的代码,将函数视为一级对象。例如,这里有一个函数调用一个函数,您可以将它作为参数传递两次(没有参数):

在很多情况下,传递函数(回调、装饰器)非常方便。如果您刚刚开始学习Python,您可能不需要立即学习这些东西,但请务必期望您迟早会了解它们

请注意,不推荐使用
cmp
函数进行排序。在Python3中,定制排序的唯一方法是使用
函数(只接受一个参数)。在较新版本的Python2中,您还可以使用
函数,因此,如果您想编写向前兼容的代码,应该这样做。从Python 3.2开始,您可以使用
functools.cmp_to_key
从较旧的
cmp
函数创建键函数。提供可在较旧Python版本中使用的函数的实现。但在新代码中,我会远离
cmp

def call_twice(some_function):
    some_function()
    some_function()