根据doc和此tutorial,cmp() returns -1 if x < y
和cmp() returns 0 if x == y
和cmp() returns 1 if x > y
该教程还说
我真的不明白两个数字之差的含义。这不是意味着当数字的符号不相等时会返回一个值吗?自从...
cmp(80, 100) : -1 # both have positive sign.
cmp(180, 100) : 1 # both also have positive sign.
cmp(-80, 100) : -1
cmp(80, -100) : 1
**注意:本教程中的代码。*
尽管我对符号差异感到困惑,但我无法真正想到为什么当x
cmp( )
函数不是很容易实现吗? Python创建者保留cmp( )
函数的原因是什么,还是该Python的 cmp( )
函数的任何隐藏用法? 最佳答案
它不是很有用,这就是为什么不推荐使用它的原因(内置的cmp
消失了,内置的排序不再在Python 3中接受)。 Rich comparison methods取代了它:
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)]
关于python - 为什么cmp()有用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15556813/