Menu
Русский

Функции в Python: def, return, значения по умолчанию и keyword-аргументы

Как определять и использовать функции в Python — параметры, возвращаемые значения, значения по умолчанию, keyword-аргументы и привычки именования, сохраняющие код читаемым.

Функция — это именованный блок шагов

Каждый раз, когда ты обнаруживаешь, что пишешь одни и те же пару строк больше одного раза — или хочешь дать маленькому кусочку логики имя, — ты готов писать функцию. Функции — первый реальный инструмент управления сложностью в Python-программе.

Базовая форма:

main.py
Output
Click Run to see the output here.

Разбираем:

  • def — ключевое слово, открывающее определение функции.
  • greet — имя функции.
  • (name) — список параметров, входов функции.
  • Двоеточие заканчивает заголовок; блок с отступом ниже — тело.
  • greet("Ada")вызов. Python выполняет тело, связав name с "Ada".

Функции дремлют, пока их не вызвали. Определение не запускает функцию. Запускает — вызов greet("Ada").

Параметры и аргументы

Слово параметр — это имя внутри определения функции. Слово аргумент — значение, переданное при вызове. В повседневном разговоре разница невелика, но она помогает при чтении сообщений об ошибках.

main.py
Output
Click Run to see the output here.

Здесь base и exponent — параметры. 2 и 10 — аргументы. Python связывает их по порядку: первый аргумент с первым параметром и так далее.

return: возврат значения

print пишет на экран. return возвращает значение вызывающему, чтобы тот мог им воспользоваться:

main.py
Output
Click Run to see the output here.

Без return функция по умолчанию возвращает None:

main.py
Output
Click Run to see the output here.

return также немедленно выходит из функции. Часто видишь ранние return-ы, которыми отбрасывают краевые случаи до основной логики:

main.py
Output
Click Run to see the output here.

Ранние return-ы держат основное тело неглубоким, без гор if/else.

Значения по умолчанию

У параметра может быть значение по умолчанию, используемое, если вызывающий его не передал:

main.py
Output
Click Run to see the output here.

Все параметры со значениями по умолчанию должны идти после параметров без них. def f(a, b=1, c): — это SyntaxError.

Ловушка изменяемого default-а

Это самая знаменитая гоча Python. Смотри:

main.py
Output
Click Run to see the output here.

Казалось бы, каждый вызов должен стартовать с пустого списка. Но один и тот же список по умолчанию делится между вызовами, и элементы накапливаются. Python вычисляет значение по умолчанию один раз, при определении функции, и потом всё время переиспользует один и тот же список.

Безопасный паттерн — использовать None как значение по умолчанию и создавать список внутри функции:

main.py
Output
Click Run to see the output here.

Теперь каждый вызов без items получает свежий список. Это правило относится к спискам, словарям, множествам — всему изменяемому.

Keyword-аргументы

Аргументы можно передавать по имени, а не по позиции. Это позволяет пропускать средние параметры и делать длинные вызовы читаемыми:

main.py
Output
Click Run to see the output here.

Позиционные и keyword-аргументы можно смешивать, но позиционные — первыми:

main.py
Output
Click Run to see the output here.

Как только у функции больше трёх-четырёх параметров, keyword-аргументы сильно облегчают чтение вызовов.

Только-позиционные и только-keyword параметры

Python позволяет пометить некоторые параметры как вызываемые только по позиции (через /) или только по ключу (через *):

main.py
Output
Click Run to see the output here.

В первый день это не нужно. Полезно, когда ты проектируешь API и хочешь зафиксировать, как его вызывают.

Docstring-и и именование

Первая строка внутри функции может быть docstring-ом — строкой в тройных кавычках, которую Python воспринимает как документацию:

main.py
Output
Click Run to see the output here.

Инструменты вроде help(), подсказок IDE и генераторов документации читают docstring автоматически. Однострочник гораздо лучше, чем ничего.

И, пожалуйста, подумай об именах:

  • Имена функций — глаголы: fetch_profile, compute_total, is_valid.
  • Используй lower_snake_case.
  • Функции, возвращающие булев, часто начинаются с is_, has_ или can_.

Хорошее имя делает место вызова самодостаточным без всякого комментария.

Чистые функции легче осмысливать

Чистая функция возвращает одно и то же для одного и того же входа и не имеет побочных эффектов — не меняет глобальное состояние, не пишет в stdout (кроме отладки), не пишет в файлы.

main.py
Output
Click Run to see the output here.

У обоих есть место, но в коде, который ты хочешь переиспользовать и тестировать, тяни в сторону чистых функций насколько можешь.

Небольшой рабочий пример

Короткая функция, совмещающая значения по умолчанию, keyword-аргументы и return:

main.py
Output
Click Run to see the output here.

Дальше: гибкие списки аргументов

Иногда ты не знаешь, со сколькими аргументами функцию вызовут — или хочешь пробросить любые пришедшие аргументы другой функции. С этим разбираются *args и **kwargs. Об этом — следующая страница.

Часто задаваемые вопросы

Как определить функцию в Python?

Используй ключевое слово def, имя функции, круглые скобки с параметрами и двоеточие. Блок с отступом ниже — тело функции. Пример: def greet(name): print(f'Hi, {name}').

Что делает return в Python?

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

Что такое значения по умолчанию в Python?

Значение по умолчанию позволяет параметру иметь предустановленное значение, которое используется, если вызывающий ничего не передал. def greet(name='friend'): означает, что greet() без аргументов использует 'friend'. Никогда не используй изменяемые значения по умолчанию вроде [] — об этом ниже.

Учитесь программировать с Coddy

НАЧАТЬ