Code Basics logo

Python: Возврат по умолчанию

Рассмотрим немного модифицированную функцию из предыдущего урока:

def sub(a, b):
    # Полученный результат никак не используется
    # и не возвращается наружу
    answer = a - b

result = sub(10, 7)
print(result)

Этот код не содержит синтаксических ошибок, и интерпретатор выполнит его. Но на экран выведется строка None! В функции нет return, но несмотря на это, код отработал и в переменную result записалось что-то.

Держитесь, мы снова повторяем мантру: вызов функции — это выражение, а выражения всегда возвращают результат своего выполнения. Значит, функция всегда возвращает что-то.

Во многих языках программирования есть специальный тип данных с единственным значением: None (или null, nil — названия типа и значения в разных языках различаются). Этот тип используется в ситуациях, когда значение чего-либо не определено.

Так вот, если в функции нет инструкции return, то интерпретатор Python автоматически возвращает None. Поэтому в переменную result записался None.

Но, конечно, смысла в этой программе нет — функция сейчас не делает ничего полезного. Давайте добавим return:

def sub(a, b):
    answer = a - b
    return answer

result = sub(10, 7)
print(result)

Теперь всё работает как надо.

Забыть инструкцию return — частая ошибка новичка. Мы в обучении каждый день сталкиваемся с просьбами о помощи типа «функция правильная, но почему-то не работает». И почти всегда оказывается, что забыт return, а результат, вместо возврата, просто печатается на экран.

Кстати, вы можете сами написать return None в теле функции. Функция будет возвращать None, как если бы в ней не было return.

Вопрос для самопроверки. Что возвращает функция print()?

Задание

Это немного странное задание, но для тренировки будет полезным. Реализуйте функцию get_none(), не имеющую параметров и всегда возвращающую None. Больше функция ничего делать не должна — вот такая она странная! И возвращайте None самостоятельно, не ждите, что Python это сделает за вас — в этом и суть данной тренировки!

Вам не нужно вызывать свою функцию, только определить её.


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе