Прямой потомок GOSUB/RETURN из BASIC (глава 06) и процедур/функций Pascal (глава 07) — только с именованными параметрами, возвращаемыми значениями и куда большей гибкостью, чем оба исторических предка.
def начинает определение функции, за ним — имя функции и список параметров в
скобках. Тело функции, как и тело условия или цикла из главы 15, определяется отступом.
Вызов функции — просто её имя со скобками, в которые передаются конкретные значения
(аргументы) для параметров.
return завершает выполнение функции и передаёт указанное значение туда, откуда
функция была вызвана. Функция без явного return (как greet()
выше) автоматически возвращает специальное значение None — "ничего", а не
ошибка.
Параметр со значением по умолчанию можно не указывать при вызове — тогда используется заданное значение; если указать явно — оно переопределяет значение по умолчанию для этого конкретного вызова.
Переменная, созданная внутри функции, существует только внутри неё — попытка обратиться к ней за пределами функции вызовет ошибку, будто такой переменной вообще никогда не было. Это не ограничение, а полезная защита: разные функции могут свободно использовать одинаковые имена переменных внутри себя, не создавая конфликтов друг с другом — каждая живёт в собственном изолированном пространстве.
Особенность Python, которой не было ни в BASIC, ни в классическом Pascal, — функция может
вернуть сразу несколько значений одним return, а вызывающий код — разложить их
сразу в несколько переменных:
Строка в тройных кавычках сразу после def — принятое соглашение для описания
того, что делает функция. Это не просто комментарий (глава 13) — многие инструменты (среды
разработки, автоматическая генерация документации) умеют находить и показывать именно
docstring при наведении на имя функции.
"Не повторяйся" (Don't Repeat Yourself, DRY) — если один и тот же фрагмент логики нужен в нескольких местах программы, разумнее оформить его как функцию один раз и вызывать оттуда, чем копировать один и тот же код в нескольких местах. Изменение логики в будущем тогда потребует правки в одном месте, а не поиска всех скопированных фрагментов по всему файлу.
Позже встретятся и более продвинутые возможности: *args позволяет функции
принимать произвольное число позиционных аргументов, **kwargs — произвольное
число именованных аргументов, а лямбда-функции (lambda x: x ** 2) — короткий
способ определить маленькую безымянную функцию прямо на месте использования. Для
большинства задач в этой книге обычного def с явными параметрами будет более
чем достаточно — эти возможности стоит знать, что они существуют, не обязательно осваивать
прямо сейчас.
Следующая глава — структуры данных: списки, словари, кортежи и множества — то, чем оперируют функции этой главы, когда данных больше, чем одна переменная.
Книга бесплатна для чтения. Автор — Тариел Бежанидзе, компьютерный мастер в Батуми · tariel.ge · все бесплатные книги. Копировать текст целиком на другие сайты — только со ссылкой на источник.