Функции и рекурсия в Python — это
инструменты для написания модульного и
структурированного кода. Рассмотрим
детально, как создавать, использовать
функции и как реализовать рекурсию.
Функции
Определение функций
Функции в Python определяются с помощью
ключевого слова def
, за
которым следует имя функции, параметры в
круглых скобках и двоеточие. Тело
функции заключается в отступы.
def function_name(parameters):
pass
Пример простейшей
функции:
def greet(name):
print(f"Hello, {name}!")
greet("Alice")
Параметры
и аргументы
Функции могут принимать параметры и
возвращать значения. Далее будут
показаны различные способы передать в
функцию разные типы аргументов.
Обязательные параметры
def add(a, b):
return a + b
result = add(3, 5)
print(result)
Параметры по умолчанию
Если аргумент не передан, используется
значение по умолчанию.
def greet(name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice")
greet("Bob", "Hi")
Именованные аргументы
Аргументы можно передавать по имени.
Если все аргументы передавать таким
способом, то порядок их расположения в
скобках не будет важен.
def describe_pet(pet_name, animal_type="собака"):
print(f"У меня есть {animal_type} по имени {pet_name}.")
describe_pet(pet_name="Вилли")
describe_pet(animal_type="кот", pet_name="Whiskers")
Аргументы переменной
длины
def make_pizza(size, *toppings):
print(f"\nПриготовление пиццы размером {size} дюйма со следующими начинками:")
for topping in toppings:
print(f"- {topping}")
make_pizza(12, "pepperoni", "mushrooms", "green peppers")
def build_profile(first, last, **user_info):
profile = {"first_name": first, "last_name": last}
for key, value in user_info.items():
profile[key] = value
return profile
user_profile = build_profile("albert", "einstein", location="princeton", field="physics")
print(user_profile)
Возвращение значений
Функция может возвращать значение с
помощью оператора return
.
def square(x):
return x ** 2
result = square(4)
print(result)
Документация функций
Строки документации (docstrings)
используются для описания функции. Они
размещаются сразу после определения
функции.
def greet(name):
"""Выводит приветственное сообщение с именем."""
print(f"Hello, {name}!")
print(greet.__doc__)
Рекурсия
Рекурсия — это метод
программирования, при котором функция
вызывает саму себя. Каждая рекурсивная
функция должна иметь
return
.
Факториал числа
Факториал числа n (обозначается как n!)
— это произведение всех
положительных целых чисел, меньших или
равных n.
def factorial(n):
"""Возвращает факториал числа n."""
if n == 0:
return 1
else:
return n * factorial(n - 1)
print(factorial(5))
Числа Фибоначчи
Последовательность чисел Фибоначчи
— это последовательность, в
которой каждое число является суммой
двух предыдущих чисел.
def fibonacci(n):
"""Возвращает n-ное число Фибоначчи."""
if n <= 1:
return n
else:
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(6))
Ограничения рекурсии
Рекурсия может привести к переполнению
стека вызовов, если количество
рекурсивных вызовов слишком велико.
Python имеет ограничение на глубину
рекурсии (обычно 1000 вызовов). Это
можно проверить и изменить с помощью
модуля sys
.
import sys
print(sys.getrecursionlimit())
sys.setrecursionlimit(1500)
Хвостовая рекурсия
Хвостовая рекурсия — это
рекурсия, в которой рекурсивный вызов
является последним действием в функции.
Python не оптимизирует хвостовую
рекурсию, поэтому она может привести к
проблемам с производительностью.
def factorial_tail_recursive(n, accumulator=1):
"""Возвращает факториал числа n, используя хвостовую рекурсию."""
if n == 0:
return accumulator
else:
return factorial_tail_recursive(n - 1, n * accumulator)
print(factorial_tail_recursive(5))
Альтернативы
рекурсии
Для некоторых задач, которые обычно
решаются с помощью рекурсии, можно
использовать итеративные подходы.
Итеративный факториал
def factorial_iterative(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
print(factorial_iterative(5))
Итеративные числа
Фибоначчи
def fibonacci_iterative(n):
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
return a
print(fibonacci_iterative(6))
Полезные
функции и приёмы
Lambda-функции
Lambda-функции — это небольшие
анонимные функции, которые могут
принимать любое количество аргументов,
но содержат только одно выражение. Чаще
всего некоторые функции можно заменить
лямбдой.
square = lambda x: x ** 2
print(square(5))
sum = lambda a, b: a + b
print(sum(3, 4))
Функции высшего
порядка
Функции принимают другие функции в
качестве аргументов или возвращают
функции.
def apply_function(func, value):
return func(value)
print(apply_function(square, 5))
Декораторы
Декораторы позволяют обернуть одну
функцию в другую, изменяя её поведение.
Таким образом можно использовать функцию
внутри функции.
def decorator(func):
def wrapper():
print("Что-то происходит до вызова функции.")
func()
print("Что-то происходит после вызова функции.")
return wrapper
@decorator
def say_hello():
print("Hello!")
say_hello()
Замыкания
Замыкания — это функции, которые
"запоминают" контекст, в котором они
были созданы.
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
closure = outer_function(10)
print(closure(5))