Почему функция выводит none в Python?
Достаточно часто возникают вопросы: "почему моя функция ничего не возвращает?!", "почему из функции возвращается None?", "не могу понять откуда появляется None...".
Для начала необходимо понимать и помнить, что любая функция в Python всегда что-то возвращает и если не используется оператор return
для возврата значения (такие случаи бывают, но об этом позднее), то функция возвращает объект None
. В случае если return
используется, но после него ничего не указывается явно, то по умолчанию считается, что там стоит объект None
.
# Не используем оператор return, поэтому результат не возвращается.
def func(x):
x * x
print(func(10))
#=> None
# Используем оператор return, но не задаем явное значение/используем некорректно
def func(x):
x * x
return
print(func(10))
#=> None
# Корректно возвращаем результат с использованием оператора return
def func(x):
return x * x
print(func(10))
#=> 100
Порой бывает, что по ошибке указывается возврат вместе с функцией print()
. Для информации функция print()
в Python выводит переданные аргументы на стандартное устройство вывода (экран), но при этом не возвращает значений, т.е. можно считать, что возвращает None
.
def func(x):
return print(x * x)
a = 5
b = func(a) # Присваиваем результат функции переменной b
# Результат работы функции выводится на экран, благодаря print() в теле функции.
#=> 25
# Но при этом данный результат не присваивается переменной b.
print(b)
#=> None
Если дальше по коду проводятся манипуляции с переменной b, например сложение, то возникнет ошибка TypeError
:
c = b + 1 # Пытаемся сложить None и 1
print(c)
# => TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
Возможен вариант, когда функция и не должна ничего возвращать, она производит какие-либо действия с объектами в глобальной зоне видимости и на этом ее функционал заканчивается. В таком случае return
может и не использоваться, но необходимо помнить, что в этом случае функция возвращает None
.
# Бесполезная функция необходимая только в качестве примера.
def extend_list(list1, list2):
list1.extend(list2)
list1 = [1, 2]
list2 = [3, 4]
print(extend_list(list1, list2))
# => None
# При этом поставленную задачу функция выполнила - изменила list1
print(list1)
# => [1, 2, 3, 4]
В примере выше использовался метод работы со списками extend()
и необходимо понимать, что метод изменяет объект, к которому применен, а не возвращает результат изменения объекта.
list3 = extend_list(list1, list2)
print(list3)
# => None