以下代码块提供 [' 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
答案 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
。