Подтвердить что ты не робот

Как использовать cmp() в Python 3?

Я не могу заставить команду cmp() работать.

Вот код:

a = [1,2,3]
b = [1,2,3]
c = cmp(a,b)
print (c)

Я получаю ошибку:

Traceback (most recent call last):
  File "G:\Dropbox\Code\a = [1,2,3]", line 3, in <module>
    c = cmp(a,b)
 NameError: name 'cmp' is not defined
[Finished in 0.1s]
4b9b3361

Ответ 1

Как упоминалось в комментариях, cmp не существует в Python 3. Если вы действительно этого хотите, вы можете определить его самостоятельно:

def cmp(a, b):
    return (a > b) - (a < b) 

который взят из оригинального What New in Python 3.0. Это довольно редко, хотя и не неслыханно, что это действительно необходимо, поэтому, возможно, вы захотите подумать над тем, действительно ли это лучший способ сделать то, что вы делаете.

Ответ 2

В Python 3.x вы можете import operator и использовать операторный модуль eq(), lt() и т. Д... вместо cmp()

Ответ 3

Если a или b является объектом класса, то приведенные выше ответы будут иметь ошибку компиляции, как показано ниже: Например: a is Class Clock: Файл "01_ClockClass_lab16.py", строка 14, в cmp return (a> b) - (a <b) TypeError: '>' не поддерживается между экземплярами 'Clock' и 'Clock'

Измените тип с помощью int(), чтобы устранить ошибку:

def cmp (a, b): return (int (a)> int (b)) - (int (a) <int (b))

Ответ 4

Когда требуется знак, вероятно, наиболее безопасным вариантом является использование math.copysign:

import math
ang = -2
# alternative for cmp(ang, 0):
math.copysign(1, ang)

# Result: -1

В частности, если ang имеет тип np.float64 из-за обесценения оператора '-'. Пример:

import numpy as np

def cmp_0(a, b):
    return (a > b) - (a < b)

ang = np.float64(-2)
cmp_0(ang, 0)

# Result:
# DeprecationWarning: numpy boolean subtract, the '-' operator, is deprecated, 
# use the bitwise_xor, the '^' operator, or the logical_xor function instead.

вместо этого можно использовать:

def cmp_0(a, b):
    return bool(a > b) - bool(a < b)

ang = np.float64(-2)
cmp(ang, 0)
# Result: -1