Функции

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

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

Введение

def add(a, b):
    return a + b

Для определения функции нужно всего лишь написать ключевое слово def перед ее именем, а после — поставить двоеточие. Следом идет блок инструкций.

Cтрока в блоке инструкций может начинаться с return, если нужно вернуть какое-то значение. Если инструкции return нет, тогда по умолчанию функция будет возвращать объект None.

Вызов

Для вызова функции нужно написать название функции и её аргументы в круглых скобках.

print("arg1", "arg2")

Если функция возвращает какое то значение, то его можно использовать как отправив сразу как аргумент другой функции так и запомнить в переменной.

summa = add(1, add(1, 2)) # add(1, add(1, 2)) => add(1, 3) => 4
print(summa) # 4

Инструкция return

Возврат простого значения

Аргументы можно использовать для изменения ввода и таким образом получать вывод функции. Но куда удобнее использовать инструкцию return, примеры которой уже встречались ранее. Если ее не написать, функция вернет значение None.

Эта инструкция может встречаться несколько раз в одной функции и не обязательно в её конце.

Возврат нескольких значений

Пока что функция возвращала только одно значение или не возвращала ничего (объект None). А как насчет нескольких значений? Этого можно добиться с помощью массива или кортежа. Технически, это все еще один объект. Например:

def stats(data):
    """данные должны быть списком"""
    total = sum(data)
    mean = total / len(data)
    return total, mean # возвращаем x, y — кортеж!

m, v = stats([1, 2, 1])

Рекурсивные функции

Рекурсия — это не особенность Python. Это общепринятая и часто используемая техника в Computer Science, когда функция вызывает сама себя. Самый известный пример — вычисление факториала n! = n * (n - 1) * (n - 2) * … * 1. Зная, что 0! = 1, факториал можно записать следующим образом:

def factorial(n):
    if n != 0:
        return n * factorial(n-1)
    else:
        return 1

Анонимная функция: лямбда

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

square = lambda a: a**2
print(square(3))