Python - 为什么cmp()有用?

时间:2013-03-21 19:54:35

标签: python

根据doc和此tutorial

cmp() returns -1 if x < y

cmp() returns 0 if x == y

cmp() returns 1 if x > y

教程也说

  

cmp()返回两个数字差异的符号

我真的不知道它是什么意思两个数字差异的标志。这是否意味着当数字符号不相等(正号和负号)时它返回一个值?由于...

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&lt;年。

cmp( ) 功能是否易于实施? Python创建者保留cmp( )函数有什么原因,或者这个Python的 cmp( ) 函数是否隐藏用途?

5 个答案:

答案 0 :(得分:22)

  

为什么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)]

答案 1 :(得分:11)

  

我真的不知道这是什么意思两个数字不同的标志。

这意味着:取出差异,然后是差异的标志。例如,如果xy是两个数字:

  • x < y =&gt; x - y < 0,函数返回-1。
  • x == y =&gt; x - y == 0,函数返回0.
  • x > y =&gt; x - y > 0,函数返回1.

有关三向比较的详细信息,请参阅Wikipedia

答案 2 :(得分:2)

用于排序项目序列。当您对项目列表进行排序时,您只需要知道一个项目大于或小于另一个项目。

此处有更多信息:http://wiki.python.org/moin/HowTo/Sorting/#The_Old_Way_Using_the_cmp_Parameter

答案 3 :(得分:2)

Trivalued比较器在排序时非常有用。你不只是想知道两个元素是否相等;您还想知道它们的相对顺序,以便您知道如何重新排列它们以更接近排序列表。这就是为什么C(strcmp)和Perl(cmp)都有类似的操作(在这种情况下对于字符串,但它是相同的想法)。

答案 4 :(得分:1)

  

另一个用例:查找数字的符号( - / +)

如果你想知道一个数字的符号(+/-)是什么,你可以轻松地使用0作为cmp函数的第二个参数

cmp(-123, 0) #returns -1
cmp( 123, 0) #returns  1