Почему программа по нахождению медианы не работает?

def midnumber(a,b,c):
    def more_or_less(a1,b1,c1):
        if a1 < b1 and a1 > c1:
            return(a1)
        if a1 > b1 and a1 < b1:
            return(a1)
    a2 = more_or_less(a,b,c)
    b2 = more_or_less(b,a,c)
    c2 = more_or_less(c,b,a)
    if a2 > c2 and a2 > b2:
        return(a2)
    if b2 > c2 and b2 > a2:
        return(b2)
    if c2 > a2 and c2 > b2:
        return(c2)
print(midnumber(1,5,3))

Почему программа не работает? Выдаёт в консоли '>' not supported between instances of 'NoneType' and 'int' на 10 строчке


Ответы (2 шт):

Автор решения: Эникейщик

Потому что есть только два варианта, в которых more_or_less() вернет число (из которых один вообще невозможен, что оставляет вообще только один вариант), и куча вариантов, в которых эта функция не вернет ничего (т.е. вернет None) и именно это и происходит. Поэтому у вас как миниму две переменные из a2, b2, c2 содержат None.

→ Ссылка
Автор решения: passant

Потому что ваша программа вообще непонятно что делает. Ладно, медианой вы обозвали среднее из трех чисел, но вот это - что???

if a1 > b1 and a1 < b1:

Все намного проще:

def midnumber(a,b,c):  
    return {a,b,c}.difference({min(a,b,c),max(a,b,c) }).pop()                                
print(midnumber(1,5,3))

или так

def midnumber1(a,b,c): 
    return sorted([a,b,c])[1]
print(midnumber1(1,5,3))

Но если вдруг вы еще не учили ни наборы ни даже списки, то пишем в лоб:

def midnumber2(a,b,c):  
    if (a>c and c>b) or (b>c and c>a):
        return c
    elif (a>b and b>c) or (c>b and b>a):
        return b
    elif (c>a and a>b) or (b>a and a>c):
        return a
print(midnumber2(3,5,1))
→ Ссылка