почему условный оператор в питоне себя не так ведёт

Я новичок и мне очень хотелось бы разобраться. Почему условный оператор в Питоне ведет себя не должным образом. Я создаю функцию, которая принимает один параметр. И если он меньше 5, то функция должна возвратить None, а если больше, то само это число. Когда я задаю аргумент этой функции меньше 5, например 3, то все в порядке, функция возвращает None, как и положено. Но, когда аргумент функции я ввожу больше 5, например 8, то в консоли вижу вывод и 8, и None. Почему так происходит?

def xxx(n):
    if n < 5:
        return None
    else:
        print(n)

y = 8
variable = xxx(y)
print(variable)

Out: 8 None


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

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

Чтобы возвратить число, нужно его возвратить, а не напечатать

def xxx(n):
    if n < 5:
        return None
    else:
        return n
→ Ссылка
Автор решения: Александр

Любая функция python неявно возвращает None, если в функции не происходит return, т.е. даже если вы не пишите return, то функция вернет None - по умолчанию.

Разберу ваш код:

Случай первый: вы вводите в функцию число меньше, чем 5.

В таком случае работает первая часть условного оператора:

if n < 5:
    return None

и в результате работы функции выходит None (тот, что вы написали)

Случай второй: на вход подаётся число больше или равное 5. В таком случае работает работает вторая часть условного оператора:

else:
    print(n)

она печатает в консоль введённое значение, и возвращает None (неявно)

после объявления функции следует код, где: вы объявляете входное значение, как число 8,

y = 8

вызываете функцию, и записываете её результат,

variable = xxx(y)

после чего, вы выводите этот результат

print(variable)

в первом случае ничего тривиального, функция выводит ваш None, а потом этот результат сохраняется и выводится, но если происходит второй случай, тогда (как раньше писалось) в консоль выводится входное значение, в коде - 8, а также записывается результат работы функции, т.к. мы ничего не вернули, то результат - стандартный None. После чего вы также выводите этот результат, и получается два вывода - сначала print в функции, а потом вне её.

Мои предложения: во втором случае, вместо вывода в консоль, верните результат:

print(n)

замените на ->

return n

или же

в первом случае выводите ответ в консоль из функции и не сохраняйте результат выполнения функции:

return None

# пропускаю код

y = 8
variable = xxx(y)
print(variable)

замените на ->

print(None)

# пропускаю код

y = 8
xxx(y)

поправка 1: советую воспринимать объявление функции, таким образом:

def some_func(some_inputs):
    # some code

превращается в

def some_func(some_inputs):
    # some code
    return None

(т.к. если в функции python сталкивается с return, он выходит из функции и не выполняет код, который может быть написан после первого return)

если ваш return будет происходить раньше, то вы не наткнётесь на стандартный вывод

поправка 2: можете поиграться со стандартным выводом, например:

def func():
    pass

print(func())
  • функция выполнится, и вернёт стандартный None
→ Ссылка