The Python Programming Guide

Функции

Функция - это блок кода (инструкций), который будет исполнен лишь тогда, когда эта функция будет вызвана. В функцию могут переданы параметры, также называемые аргументами, а также сама функция вернуть какие-либо данные (результаты).

Создание функции

В Python создание функции начинается с ключевого слова def. Далее идёт название функции, а затем в круглых скобках задаются аргументы. Инициализация функции оканчивается привычным символом :, после которой следует тело функции (блок инструкций).

Синтаксис:

def <название>(<аргумент_1>, ..., <аргумент_N>):
    <инструкция 1>
    ...
    <инструкция N>
    return <результат>  
<инструкция M>      # не входит в состав функции

Пример:

def greeting():
    print("Hello world!")

Вызвать функцию после инициализации можно использовав название функции с круглыми скобками:

greeting()

Вывод:

Hello world!

Позиционные аргументы

В функцию могут быть переданы данные в качестве аргументов. Они определяются в круглых скобках после названия функции. Если аргументов несколько, то они разделяются запятой. Рассмотрим пример с использованием одного аргумента:

def greeting(name):
    print("Привет,", name)

greeting("Влад")
greeting("Георгий")
greeting("Дмитрий")
Влад
Георгий
Дмитрий

Предупреждение

Если мы попытаемся вызвать функцию greeting() не указав аргумент, то у нас будет вызвана ошибка:

greeting()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: greeting() missing 1 required positional argument: 'name'

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

Произвольные аргументы

Если вы не знаете, сколько у вас аргументов будет передано в функцию, вы можете использовать символ * перед названием параметра в определении функции. При использовании такого подхода все “лишние” аргументы будут собраны в единый кортеж (tuple), который в дальнейшем можно использовать:

def second_name(*names):
    print("Второе имя:", names[1])

second_name("Влад", "Георгий", "Дмитрий")
Георгий

Также такой подход может быть использован только единожды, т.е. только для одной переменной.

Пример 2:

def print_names(name1, name2, *other):
    print("Первое имя:", name1)
    print("Второе имя:", name2)
    print("Остальные имена:", *other)

print_names("Влад", "Георгий", "Дмитрий", "Александр", "Юрий")
Первое имя: Влад
Второе имя: Георгий
Остальные имена: Дмитрий Александр Юрий

Подсказка

Произвольные аргументы часто называют переменной args.

Аргументы с ключом

Аргументы также могут быть переданы в функцию с использованием синтаксиса ключ = значение (key = value). При таком подходе очередность аргументов становится неважна:

def print_fruits(fruit1, fruit2, fruit3):
    print("Самый вкусный фрукт:", fruit2)

print_fruits(fruit1 = "яблоко", fruit2 = "банан", fruit3 = "апельсин")
Самый вкусный фрукт: банан

Произвольные аргументы с ключом

Аналогично как и с обычными произвольными аргументами, для неизвестного количества аргументов с ключом можно использовать двойной символ **. При таком подходе все “лишние” аргументы с ключом будут собраны в единый словарь, который в дальнейшем можно использовать:

def print_name(**cats):
    print("Кота зовут:", cats["cat2"])

print_name(cat1 = "Кот", cat2 = "Борис", cat3 = "Бродяга")
Кота зовут: Борис

Также такой подход может быть использован только единожды, т.е. только для одной переменной.

Подсказка

Произвольные аргументы c ключом часто называют переменной kwargs.

Значения по умолчанию

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

def print_country(country = "Россия"):
    print("Текущая страна:", country)

print_country()
print_country("Бразилия")
Текущая страна: Россия
Текущая страна: Бразилия

В таком случае не будет вызвана ошибка и будет использовано значение по умолчанию. При передаче аргумента значение для country будет переопределено.

Использование return

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

Пример с возвратом одного значения:

def mul_five(number):
    return number * 5

res = mul_five(7)
print(res)
35

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

def simple_numbers():
    return 1, 3, 7, 11

print(simple_numbers())
(1, 3, 7, 11)

Использование pass

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

def useless_function():
    pass

Рекурсия

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

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

Пример вычисления факториала с использованием рекурсии:

def factorial(n):
    assert n >= 0, "Число должно быть неотрицательным"
    if n == 0:
        return 1
    elif n == 1:
        return n
    else:
        return n * factorial(n - 1)

print("Факториал 5 равен:", factorial(5))
print("Факториал 0 равен:", factorial(0))
Факторил 5 равен: 120
Факториал 0 равен: 1