Python - Почему cmp() полезен? - программирование

Python - Почему cmp() полезен?

В соответствии с 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

** Примечание: код из учебника. *

Несмотря на мое замешательство в различиях знака, я не могу представить, почему нам нужна встроенная функция для возврата значения -1, когда x < у.

Легко ли реализована функция cmp( )? Есть ли причина, по которой создатели Python сохраняют функцию cmp( ) или есть скрытое использование этой функции Python cmp( )?

4b9b3361

Ответ 1

Почему 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)]

Ответ 2

Я действительно не понимаю, что значит знак различия двух чисел.

Это означает: возьмите разницу, а затем знак этой разницы. Например, если x и y - два числа:

  • x < y = > x - y < 0, и функция возвращает -1.
  • x == y = > x - y == 0, и функция возвращает 0.
  • x > y = > x - y > 0, и функция возвращает 1.

Подробнее о трехсторонних сравнениях см. Wikipedia.

Ответ 3

Для сортировки последовательностей элементов. Когда вы сортируете список предметов, вам нужно знать только один элемент больше или меньше другого.

Дополнительная информация здесь: http://wiki.python.org/moin/HowTo/Sorting/#The_Old_Way_Using_the_cmp_Parameter

Ответ 4

При сортировке очень полезны тривальные компараторы. Вы не просто хотите знать, равны ли два элемента; вы также хотите знать их относительный порядок, чтобы вы знали, как переставить их, чтобы приблизиться к отсортированному списку. Вот почему C (strcmp) и Perl (cmp) имеют одинаковые операции (в тех случаях для строк, но это одна и та же идея).

Ответ 5

Другой вариант использования: Поиск знака (-/+) числа

Если вы хотите узнать, что означает знак (+/-) числа, вы можете легко использовать 0 в качестве второго аргумента функции cmp

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