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( )
函数是否隐藏用途?
答案 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)
我真的不知道这是什么意思两个数字不同的标志。
这意味着:取出差异,然后是差异的标志。例如,如果x
和y
是两个数字:
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