为什么带有 sort() 方法的两个参数函数在没有参数的情况下运行,为什么该函数应该有两个参数?
Why deos a two parameter funnction within sort() method runs without parameters and why does that function should have two parameters?
下面的代码块给出了['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
当我向函数添加 print 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
的工作方式,它会在进行这些实际调用时提供两个参数。
您可以编写自己的代码,将函数视为 first-class 对象。例如,这里有一个函数调用一个函数,你将它作为参数传递两次(没有参数):
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
。
下面的代码块给出了['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
当我向函数添加 print 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
的工作方式,它会在进行这些实际调用时提供两个参数。
您可以编写自己的代码,将函数视为 first-class 对象。例如,这里有一个函数调用一个函数,你将它作为参数传递两次(没有参数):
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
。