首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么cmp( )有用?

为什么cmp( )有用?
EN

Stack Overflow用户
提问于 2013-03-21 19:54:34
回答 5查看 41.9K关注 0票数 23

根据文档教程的说法,

cmp() returns -1 if x < y

cmp() returns 0 if x == y

cmp() returns 1 if x > y

该教程还说,

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

我不太明白两个数字的差异意味着什么。这不意味着当数字符号不相等时,它返回一个值吗?因为..。

代码语言:javascript
复制
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( )函数有什么隐藏的用法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-10-22 19:09:43

为什么cmp( )是有用的?

它不是很有用,这就是为什么它被废弃了(内置的cmp已经消失了,并且内置分类不再接受Python3中的一个)。丰富比较法取代了它:

代码语言:javascript
复制
object.__lt__(self, other)
object.__le__(self, other)
object.__eq__(self, other)
object.__ne__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)

这允许<符号(和其他符号)重载比较运算符,例如启用集合对象的子集和超集比较。

代码语言:javascript
复制
>>> 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不允许这样做:

代码语言:javascript
复制
>>> set('abc') == set('bcd')
False
>>> set('abc') >= set('bcd')
False
>>> set('abc') <= set('bcd')
False

cmp玩具的使用

下面是一个有趣的用法,它将其结果用作索引(如果第一项小于第二项,则返回1,如果等于则为0,如果大于1,则返回1):

代码语言:javascript
复制
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,等效操作

但您可以使用它作为等效的:

代码语言:javascript
复制
(a > b) - (a < b)

在我们的小玩具功能中,这就是:

代码语言:javascript
复制
def cmp_to_symbol(val, other_val):
    '''returns the symbol representing the relationship between two values'''
    return '=><'[(val > other_val) - (val < other_val)]
票数 29
EN

Stack Overflow用户

发布于 2013-03-21 19:56:15

我不太明白这两个数字的区别是什么意思。

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

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

有关三方比较的更多信息,请参见维基百科

票数 11
EN

Stack Overflow用户

发布于 2013-03-21 19:57:16

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15556813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档