实际上sort()方法在不传入参数func的时候 默认cmp为None。
调用的是lambda x,y: cmp(x, y),而实际上就是调用cmp函数。即:
numbers = [5,2,9,7]
numbers.sort()
#sort()函数判断cmp为None,则调用`lambda x,y: cmp(x, y)`
numbers.sort(cmp=None) #等效于numbers.sort()
numbers.sort(cmp=cmp)
#sort()判断cmp存在,并且不为None,则通过调用`cmp(x,y)`来排序
#虽然结果是相同的,可实际执行流程是不同的(这里我不确定sort()内部是用匿名函数还是直接用cmp来实现的,不过应该没有多大区别。)
numbers.sort(cmp)
#sort()通过*args来寻找是否存在没有指定变量的传入参数。
#函数判断其是否callalbe,如果是则赋值给cmp
#函数执行`cmp(x,y)`来排序
numbers.sort(custom_sort_method)
#sort()通过*args来寻找是否存在没有指定变量的传入参数。
#函数判断其是否callalbe,即是否是函数,如果是则赋值给cmp = custom_sort_method
# 函数调用`cmp(x,y)`来排序,但此时的cmp实际上已经是custom_sort_method方法了
numbers.sort(cmp = custom_sort_method)
# 此时函数直接发现cmp不为None,则直接执行cmp函数来排序,而此时cmp也已经是custom_sort_method方法了
如果要实现自定义比较函数则需要重新指定cmp为你构造的比较函数,如下:
numbers = [5,2,9,7]
def reverse_numeric(x, y):
return y - x
numbers.sort(cmp = reverse_numeric)
#也可以直接写成
numbers.sort(revers_numeric)
#或者直接传入匿名函数
numbers.sort(lambda x,y: y-x)
另外,在python3.x中取消了cmp参数,也不支持直接往sort()里面传函数了。可以构造排序函数传递给key来实现。