Как использовать 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]
Ответы
Ответ 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