/
Вопросы и ответы
/
Python
/

Почему функция выводит none в Python?

Почему функция выводит none в Python?

4 года назад

Andrey Moshkov

Ответы

1

Достаточно часто возникают вопросы: "почему моя функция ничего не возвращает?!", "почему из функции возвращается None?", "не могу понять откуда появляется None...".

Для начала необходимо понимать и помнить, что любая функция в Python всегда что-то возвращает и если не используется оператор return для возврата значения (такие случаи бывают, но об этом позднее), то функция возвращает объект None. В случае если return используется, но после него ничего не указывается явно, то по умолчанию считается, что там стоит объект None.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Не используем оператор 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.

1
2
3
4
5
6
7
8
9
10
def func(x):
    return print(x * x)

a = 5
b = func(a)  # Присваиваем результат функции переменной b
# Результат работы функции выводится на экран, благодаря print() в теле функции.
#=> 25
# Но при этом данный результат не присваивается переменной b.
print(b)
#=> None

Если дальше по коду проводятся манипуляции с переменной b, например сложение, то возникнет ошибка TypeError:

1
2
3
c = b + 1  # Пытаемся сложить None и 1
print(c)
# => TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

Возможен вариант, когда функция и не должна ничего возвращать, она производит какие-либо действия с объектами в глобальной зоне видимости и на этом ее функционал заканчивается. В таком случае return может и не использоваться, но необходимо помнить, что в этом случае функция возвращает None.

1
2
3
4
5
6
7
8
9
10
11
12
# Бесполезная функция необходимая только в качестве примера.
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() и необходимо понимать, что метод изменяет объект, к которому применен, а не возвращает результат изменения объекта.

1
2
3
list3 = extend_list(list1, list2)
print(list3)
# =>  None

4 года назад

Дмитрий Ибрагимов

0

Функция возвращает None, если в ней нет return или return не сработал. Чаще всего print() внутри функции путают с return:

1
2
3
4
5
def add(a, b):
    print(a + b)   # выводит на экран, но ничего не возвращает

result = add(2, 3)  # на экране: 5
print(result)       # на экране: None

print() показывает значение, а функция без return возвращает None. Исправление — вернуть результат:

1
2
3
4
def add(a, b):
    return a + b

print(add(2, 3))  # => 5

Частые причины

print от функции, которая сама печатает. print(add(2, 3)) выведет сначала 5 изнутри функции, затем None — результат функции.

return только в одной ветке:

1
2
3
4
5
6
7
8
def sign(n):
    if n > 0:
        return "плюс"
    elif n < 0:
        return "минус"
    # для n == 0 return не выполнится

print(sign(0))  # => None

Добавьте return для всех случаев.

Методы, которые меняют объект на месте:

1
2
3
numbers = [3, 1, 2]
numbers = numbers.sort()
print(numbers)  # => None

sort(), append(), reverse(), update() меняют список или словарь и возвращают None. Не присваивайте их результат. Если нужен новый отсортированный список — sorted(numbers).

Рекурсия без return:

1
2
3
4
5
6
def factorial(n):
    if n == 1:
        return 1
    n * factorial(n - 1)   # забыли return

print(factorial(2))  # => None

Для factorial(3) будет уже ошибка TypeError: unsupported operand type(s) for *: 'int' and 'NoneType': внутренний вызов вернул None, и его попытались умножить на число. Такая ошибка — частый признак забытого return.

Как найти место

Добавьте print перед каждым return или пройдите функцию отладчиком. Если программа дошла до конца функции, а return не встретился, Python вернёт None.

Функции и возврат значений разбирают в бесплатном курсе «Основы Python».

10 дней назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845