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