Функция — это именованный блок шагов
Каждый раз, когда ты обнаруживаешь, что пишешь одни и те же пару строк больше одного раза — или хочешь дать маленькому кусочку логики имя, — ты готов писать функцию. Функции — первый реальный инструмент управления сложностью в Python-программе.
Базовая форма:
Разбираем:
def— ключевое слово, открывающее определение функции.greet— имя функции.(name)— список параметров, входов функции.- Двоеточие заканчивает заголовок; блок с отступом ниже — тело.
greet("Ada")— вызов. Python выполняет тело, связавnameс"Ada".
Функции дремлют, пока их не вызвали. Определение не запускает функцию. Запускает — вызов greet("Ada").
Параметры и аргументы
Слово параметр — это имя внутри определения функции. Слово аргумент — значение, переданное при вызове. В повседневном разговоре разница невелика, но она помогает при чтении сообщений об ошибках.
Здесь base и exponent — параметры. 2 и 10 — аргументы. Python связывает их по порядку: первый аргумент с первым параметром и так далее.
return: возврат значения
print пишет на экран. return возвращает значение вызывающему, чтобы тот мог им воспользоваться:
Без return функция по умолчанию возвращает None:
return также немедленно выходит из функции. Часто видишь ранние return-ы, которыми отбрасывают краевые случаи до основной логики:
Ранние return-ы держат основное тело неглубоким, без гор if/else.
Значения по умолчанию
У параметра может быть значение по умолчанию, используемое, если вызывающий его не передал:
Все параметры со значениями по умолчанию должны идти после параметров без них. def f(a, b=1, c): — это SyntaxError.
Ловушка изменяемого default-а
Это самая знаменитая гоча Python. Смотри:
Казалось бы, каждый вызов должен стартовать с пустого списка. Но один и тот же список по умолчанию делится между вызовами, и элементы накапливаются. Python вычисляет значение по умолчанию один раз, при определении функции, и потом всё время переиспользует один и тот же список.
Безопасный паттерн — использовать None как значение по умолчанию и создавать список внутри функции:
Теперь каждый вызов без items получает свежий список. Это правило относится к спискам, словарям, множествам — всему изменяемому.
Keyword-аргументы
Аргументы можно передавать по имени, а не по позиции. Это позволяет пропускать средние параметры и делать длинные вызовы читаемыми:
Позиционные и keyword-аргументы можно смешивать, но позиционные — первыми:
Как только у функции больше трёх-четырёх параметров, keyword-аргументы сильно облегчают чтение вызовов.
Только-позиционные и только-keyword параметры
Python позволяет пометить некоторые параметры как вызываемые только по позиции (через /) или только по ключу (через *):
В первый день это не нужно. Полезно, когда ты проектируешь API и хочешь зафиксировать, как его вызывают.
Docstring-и и именование
Первая строка внутри функции может быть docstring-ом — строкой в тройных кавычках, которую Python воспринимает как документацию:
Инструменты вроде help(), подсказок IDE и генераторов документации читают docstring автоматически. Однострочник гораздо лучше, чем ничего.
И, пожалуйста, подумай об именах:
- Имена функций — глаголы:
fetch_profile,compute_total,is_valid. - Используй
lower_snake_case. - Функции, возвращающие булев, часто начинаются с
is_,has_илиcan_.
Хорошее имя делает место вызова самодостаточным без всякого комментария.
Чистые функции легче осмысливать
Чистая функция возвращает одно и то же для одного и того же входа и не имеет побочных эффектов — не меняет глобальное состояние, не пишет в stdout (кроме отладки), не пишет в файлы.
У обоих есть место, но в коде, который ты хочешь переиспользовать и тестировать, тяни в сторону чистых функций насколько можешь.
Небольшой рабочий пример
Короткая функция, совмещающая значения по умолчанию, keyword-аргументы и return:
Дальше: гибкие списки аргументов
Иногда ты не знаешь, со сколькими аргументами функцию вызовут — или хочешь пробросить любые пришедшие аргументы другой функции. С этим разбираются *args и **kwargs. Об этом — следующая страница.
Часто задаваемые вопросы
Как определить функцию в Python?
Используй ключевое слово def, имя функции, круглые скобки с параметрами и двоеточие. Блок с отступом ниже — тело функции. Пример: def greet(name): print(f'Hi, {name}').
Что делает return в Python?
return отправляет значение обратно тому, кто вызвал функцию. Функция без явного return автоматически возвращает None. Как только return сработал, функция сразу выходит — любой код после него в этом же блоке пропускается.
Что такое значения по умолчанию в Python?
Значение по умолчанию позволяет параметру иметь предустановленное значение, которое используется, если вызывающий ничего не передал. def greet(name='friend'): означает, что greet() без аргументов использует 'friend'. Никогда не используй изменяемые значения по умолчанию вроде [] — об этом ниже.