根据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/

10-12 20:59