Функции

Рекомендуем предварительно ознакомиться с разделом про лямбда-выражения.

Функции в Питоне — по сути многокомандные лямбда-выражения:

  • лямбда-выражение содержит одну формулу
  • функция содержит последовательность команд

Поскольку в рамках используемой Питоном модели программа — это последовательность команд, то функции в рамках такой модели (и сходных с ней) часто называют подпрограммами.

Также можно встретить ещё синонимы процедура, операция, преобразование, отображение (хотя последние два обычно применяются только к функциям, не имеющим побочных эффектов).

Синтаксис

Чтобы создать функцию, нужно воспользваться командой определения функции:

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()  ## ОШИБКА ВЫПОЛНЕНИЯ

Последний пример особо показателен: наличие в определении функции хоть где-то привязывающей команды полностью меняет процедуру вычисления переменной, упомянутой в этой команде.

А именно, такая переменная вычисляется при помощи локальной привязки, а если локальная привязка ещё не создана — вычисление завершается ошибкой.