Функции
Рекомендуем предварительно ознакомиться с разделом про лямбда-выражения.
Функции в Питоне — по сути многокомандные лямбда-выражения:
- лямбда-выражение содержит одну формулу
- функция содержит последовательность команд
Поскольку в рамках используемой Питоном модели программа — это последовательность команд, то функции в рамках такой модели (и сходных с ней) часто называют подпрограммами.
Также можно встретить ещё синонимы процедура, операция, преобразование, отображение (хотя последние два обычно применяются только к функциям, не имеющим побочных эффектов).
Синтаксис
Чтобы создать функцию, нужно воспользваться командой определения функции:
def ПЕРЕМЕННАЯ(ПЕРЕМЕННАЯ, ПЕРЕМЕННАЯ, ...):
КОМАНДА
КОМАНДА
...
КОМАНДА
Последовательность переменных внутри скобок может быть пустой.
Последовательность команд пустой быть не может (если хочется
аналог пустой последовательности — можно
воспользоваться командой :pass
).
Такая команда создаёт новую функцию и привязывает её к переменной, указанной
между словом def
и открывающей скобкой.
Поскольку поведение функций повторяет поведение лямбда-выражений, остановимся только на тех моментах, когда семантика команд не совсем очевидна.
Выход из функции
Для завершения работы функции используется команда
return ФОРМУЛА
Значение формулы становится при этом значением оператора применения, в результате вычисления которого произошёл вызов функции.
Если формулу не написать, то считается, что формула None
.
Если вообще не написать нигде return
в определении функции,
то считается, что последней командой функции является return None
.
Привязки внутри функции
Привязывающие команды (=
и def
) внутри функции работают несколько
необычно: если в определении функции хоть где-то встречается
такая команда, то, независимо от наличия привязки упомянутой в
этой команде переменной, такая команда создаёт новую привязку,
причём временную — на время работы функции.
Примеры:
x = 1
def foo():
print(x)
foo() ## 1
def foo():
x = 2
print(x)
foo() ## 2
print(x) ## 1
def foo():
print(x)
x = 2
foo() ## ОШИБКА ВЫПОЛНЕНИЯ
Последний пример особо показателен: наличие в определении функции хоть где-то привязывающей команды полностью меняет процедуру вычисления переменной, упомянутой в этой команде.
А именно, такая переменная вычисляется при помощи локальной привязки, а если локальная привязка ещё не создана — вычисление завершается ошибкой.