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

时间:2018-06-19 04:26:37

标签: python-2.7 function parameters function-calls cmp

以下代码块提供 [' AAB',' BBC',' EFM',' CNN',&# 39; ESPN',' ITN',' XYZ'] 作为输出。但是sort()方法中的MyCmp()函数没有任何参数。如果我创建了一个只接受一个参数并在sort()方法中调用它的函数,它会给出一条错误消息告诉&#34 ; 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

1 个答案:

答案 0 :(得分:1)

当您执行A.sort(MyCmp)时,您将MyCmp作为参数传递给A.sort。你自己根本没有打电话给MyCmp。相反,sort的实现会在运行时执行。由于list.sort的工作原理,它会在进行实际调用时提供两个参数。

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

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

在很多情况下,能够传递函数(回调,装饰器)是很方便的。如果你刚刚开始学习Python,你可能不会立即需要这些东西,但是希望你迟早能够了解它们。

请注意,不建议使用cmp函数进行排序。在Python 3中,自定义排序的唯一方法是使用key函数(只接受一个参数)。您还可以在更新版本的Python 2中使用key函数,因此如果您想要编写前向兼容代码,则应该使用该路径。从Python 3.2开始,您可以使用functools.cmp_to_key从较旧的cmp函数创建关键函数。 The docs提供了可在旧版Python中使用的函数的实现。但我在新代码中远离cmp