Python3.5版本中已经移除了Python2内置的cmp函数,因此在Python3.5中无法直接调用内置的cmp函数来实现两个对象的比较。如果需要实现类似cmp函数的比较逻辑,需要通过自定义函数或者使用标准库提供的工具来实现。

Python2中cmp函数的作用
在Python2里,cmp是一个内置函数,接收两个参数,返回负数、0、正数分别表示第一个参数小于、等于、大于第二个参数,示例代码如下:
# Python2环境示例代码 result1 = cmp(1, 2) print(result1) # 输出 -1 result2 = cmp(2, 2) print(result2) # 输出 0 result3 = cmp(3, 2) print(result3) # 输出 1
Python3.5中无法直接使用cmp的原因
Python3的设计调整中,移除了内置的cmp函数,同时很多内置函数比如sorted、list.sort不再支持cmp参数,而是改用key参数来指定比较的键。如果直接在Python3.5中调用cmp函数,会直接抛出NameError异常,提示cmp没有定义。
如果需要兼容旧的cmp风格的比较逻辑,可以使用functools模块中的cmp_to_key工具,将cmp风格的比较函数转换为key函数使用。
Python3.5中实现cmp逻辑的方法
自定义cmp风格的比较函数
首先可以自定义一个和Python2中cmp逻辑一致的函数,示例代码如下:
def cmp(a, b):
if a < b:
return -1
elif a == b:
return 0
else:
return 1
使用cmp_to_key适配排序场景
在Python3.5的排序场景中,如果需要使用自定义的比较逻辑,可以将自定义的cmp函数通过cmp_to_key转换后作为key参数传入,示例代码如下:
from functools import cmp_to_key
def custom_cmp(a, b):
# 自定义比较逻辑,先比较长度,长度相同再比较内容
if len(a) < len(b):
return -1
elif len(a) == len(b):
if a < b:
return -1
elif a == b:
return 0
else:
return 1
else:
return 1
data = ["apple", "banana", "pear", "grape"]
# 使用cmp_to_key转换比较函数后排序
sorted_data = sorted(data, key=cmp_to_key(custom_cmp))
print(sorted_data)
上述代码的输出结果是["pear", "grape", "apple", "banana"],符合先按长度排序,长度相同再按字典序排序的预期。
注意事项
在自定义cmp函数时,需要确保函数的返回值严格符合规范,即返回负数、0、正数三种情况,否则可能导致排序结果不符合预期。另外,cmp_to_key返回的是一个可调用的对象,只能作为key参数使用,不能直接作为比较函数单独调用。
如果需要比较两个对象的大小,也可以直接使用Python3内置的比较运算符<、>、==等,这些运算符在Python3.5中已经足够处理大部分比较场景,不需要额外实现cmp函数。
Python3.5cmp比较函数functools_cmp_to_key排序修改时间:2026-06-27 15:00:37