【问题标题】:Why deos a two parameter funnction within sort() method runs without parameters and why does that function should have two parameters?为什么 sort() 方法中的两个参数函数在没有参数的情况下运行,为什么该函数应该有两个参数?
【发布时间】:2018-06-19 04:26:36
【问题描述】:

以下代码块给出 ['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

【问题讨论】:

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


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 2019-09-18
      • 1970-01-01
      相关资源
      最近更新 更多