«Нет» нельзя сравнивать с числами. Есть ли другие альтернативы? - PullRequest
0 голосов
/ 07 марта 2020

В Python 2 вы можете сравнивать None с целыми числами и числами с плавающей запятой в решениях как поиск наименьшего числа путем сравнения. Но в Python 3 их невозможно сравнить. У вас есть альтернативные ключевые слова или решения для этого в Python 3?

TypeError: '>' not supported between instances of 'int' and 'NoneType'

Это мой код:

l = None
s = None

while True:
    n = input("Enter a number: ")
    if (n == "done") :
        break
    try:
        num = int(n)
    except:
        print ("Invalid input")
        continue
    if (s is None):
        s = num
    if (num > l) :
        l = num
    elif (num < s) :
        s = num

def done(l,s):
    print ("Maximum is", l)
    print ("Minimum is", s)

done(l,s)

Ответы [ 4 ]

2 голосов
/ 07 марта 2020

Поскольку None эффективно действует как отрицательная бесконечность [*] в Python 2, вы можете использовать (вместо x < y)

False if y is None else True if x is None else x < y

Сначала мы проверяем y, чтобы результат равен False, когда оба значения x и y равны None:

>>> def f(x, y):
...   return False if y is None else True if x is None else x < y
...
>>> f(None, None)
False
>>> f(None, -10000)
True
>>> f(-10000, None)
False

Если вы определяете функцию, вы должны написать ее, используя для ясности операторы if:

def f(x, y):
    if y is None:
        return False
    if x is None:
        return True
    return x < y

[*] Точнее, None действовал как основание для решетки, подразумеваемой <=.

1 голос
/ 07 марта 2020

Вы можете использовать условный (третичный) оператор, ie. вместо:

if x > y:

используйте:

if (0 if x is None else x) > (0 if y is None else y):
0 голосов
/ 07 марта 2020

Вы отфильтровываете значения None перед сравнением, посмотрите, поможет ли это:

>>> l = [None, 2,3,5, None, 10]
>>> for i in l:
...       if i is not None:
...             print(i>5)
...       else:
...             print(None)
...
None
False
False
False
None
True

Добавление

l = None
s = None

def isNone(a):
    if a is not None:
        return True
    else:
        return False

while True:
    n = input("Enter a number: ")
    if (n == "done") :
        break
    try:
        num = int(n)
    except:
        print ("Invalid input")
        continue
    if (s is None):
        s = num
    if isNone(l):
        if (num > l) :
            l = num
    elif (num < s) :
        s = num

def done(l,s):
    print ("Maximum is", l)
    print ("Minimum is", s)

done(l,s)

Поскольку Функция кода довольно расплывчата, пожалуйста, посмотрите, помогает ли это, где вы просто проверяете, является ли элемент None или нет, если нет, то это будет для проверки состояния.

0 голосов
/ 07 марта 2020

В тех полях, где вы разрешаете тип None, вы можете сначала проверить, имеет ли переменная тип none, и, если она не удовлетворяет условию, продолжить проверку с целым числом:

if x is not None:
    if x > y:
        # proceed with the operations  
...