23

根据文档和本教程

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 < y 时返回 -1 的值。

功能不是cmp( )很容易实现吗?Python的创建者有什么理由保留cmp( )函数,或者这个Python的cmp( )函数有什么隐藏的用法吗?

4

5 回答 5

29

为什么 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)]
于 2014-10-22T19:09:43.840 回答
11

我真的不明白两个数字的差异是什么意思。

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

  • x < y=>x - y < 0并且函数返回 -1。
  • x == y=>x - y == 0并且函数返回 0。
  • x > y=>x - y > 0并且函数返回 1。

有关三向比较的更多信息,请参阅Wikipedia

于 2013-03-21T19:56:15.763 回答
3

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

于 2013-03-21T19:57:16.337 回答
2

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

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

于 2013-03-21T19:55:55.590 回答
1

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

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

cmp(-123, 0) #returns -1
cmp( 123, 0) #returns  1
于 2017-11-16T18:52:00.107 回答