为什么 cmp( ) 有用?
它不是很有用,这就是它被弃用的原因(内置cmp
函数消失了,内置排序不再接受 Python 3 中的一个)。丰富的比较方法取代了它:
object.__lt__(self, other)
object.__le__(self, other)
object.__eq__(self, other)
object.__ne__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)
这允许<
符号(和其他符号)被重载比较运算符,例如,启用集合对象的子集和超集比较。
>>> set('abc') < set('cba')
False
>>> set('abc') <= set('cba')
True
>>> set('abc') == set('cba')
True
>>> set('abc') >= set('cba')
True
>>> set('abc') > set('cba')
False
虽然它可以启用上述功能,cmp
但不允许以下功能:
>>> set('abc') == set('bcd')
False
>>> set('abc') >= set('bcd')
False
>>> set('abc') <= set('bcd')
False
玩具用途cmp
这是一个有趣的用法,它使用其结果作为索引(如果第一个小于第二个,则返回 -1,如果相等则返回 0,如果大于则返回 1):
def cmp_to_symbol(val, other_val):
'''returns the symbol representing the relationship between two values'''
return '=><'[cmp(val, other_val)]
>>> cmp_to_symbol(0, 1)
'<'
>>> cmp_to_symbol(1, 1)
'='
>>> cmp_to_symbol(1, 0)
'>'
根据文档,您应该将 cmp 视为不存在:
https://docs.python.org/3/whatsnew/3.0.html#ordering-comparisons
cmp
删除,等效操作
但是您可以将其用作等效项:
(a > b) - (a < b)
在我们的小玩具函数中,就是这样:
def cmp_to_symbol(val, other_val):
'''returns the symbol representing the relationship between two values'''
return '=><'[(val > other_val) - (val < other_val)]