Функции в Python: определение, параметры и возвращение значений
Функции в Python — это блоки кода, которые выполняют определенные задачи и делают программу более модульной и читаемой. Функции позволяют избежать повторения кода и упрощают его тестирование и поддержку.
Как создать функцию в Python
Функции в Python определяются с помощью ключевого слова def, за которым следует имя функции, параметры в круглых скобках и двоеточие. Тело функции обязательно должно быть с отступами:
def function_name(parameters):
# тело функции
pass
Пример простейшей функции:
def greet(name):
print(f"Hello, {name}!")
greet("Alice") # Hello, Alice!
Параметры и аргументы функций
Функции могут принимать различные типы параметров, что делает их гибкими и универсальными.
Обязательные параметры
def add(a, b):
return a + b
result = add(3, 5)
print(result) # 8
Параметры по умолчанию
Если аргумент не передан, используется заранее определенное значение:
def greet(name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # Hello, Alice!
greet("Bob", "Hi") # Hi, Bob!
Именованные аргументы
Аргументы можно передавать по имени, что делает код более понятным:
def describe_pet(pet_name, animal_type="собака"):
print(f"У меня есть {animal_type} по имени {pet_name}.")
describe_pet(pet_name="Вилли") # У меня есть собака по имени Вилли.
describe_pet(animal_type="кот", pet_name="Whiskers") # У меня есть кот по имени Whiskers.
Аргументы переменной длины
*argsдля позиционных аргументов переменной длины**kwargsдля именованных аргументов переменной длины
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)
# {'first_name': 'albert', 'last_name': 'einstein', 'location': 'princeton', 'field': 'physics'}
Возвращение значений из функций
Функция может возвращать значение с помощью оператора return:
def square(x):
return x ** 2
result = square(4)
print(result) # 16
Документация функций (docstrings)
Строки документации используются для описания назначения функции:
def greet(name):
"""Выводит приветственное сообщение с именем."""
print(f"Hello, {name}!")
print(greet.__doc__) # Выводит приветственное сообщение с именем.
Рекурсия в Python: принципы и примеры
Рекурсия — это метод программирования, при котором функция вызывает саму себя. Каждая рекурсивная функция должна иметь базовый случай и рекурсивный случай.
Факториал числа
Факториал числа n (n!) — это произведение всех положительных целых чисел от 1 до n:
def factorial(n):
"""Возвращает факториал числа n."""
if n == 0 or n == 1:
return 1
else:
return n * factorial(n - 1)
print(factorial(5)) # 120
Числа Фибоначчи
Последовательность Фибоначчи — каждое число равно сумме двух предыдущих:
def fibonacci(n):
"""Возвращает n-ное число Фибоначчи."""
if n <= 1:
return n
else:
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(6)) # 8
Ограничения рекурсии
Python имеет ограничение на глубину рекурсии (обычно 1000 вызовов):
import sys
print(sys.getrecursionlimit()) # 1000
sys.setrecursionlimit(1500)
Хвостовая рекурсия
Хвостовая рекурсия — это рекурсия, где рекурсивный вызов является последним действием:
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)) # 120
Альтернативы рекурсии: итеративные подходы
Итеративный факториал
def factorial_iterative(n):
"""Вычисляет факториал итеративным способом."""
result = 1
for i in range(1, n + 1):
result *= i
return result
print(factorial_iterative(5)) # 120
Итеративные числа Фибоначчи
def fibonacci_iterative(n):
"""Вычисляет число Фибоначчи итеративным способом."""
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
return a
print(fibonacci_iterative(6)) # 8
Продвинутые техники работы с функциями
Lambda-функции
Lambda-функции — это анонимные функции для простых операций:
square = lambda x: x ** 2
print(square(5)) # 25
sum_two = lambda a, b: a + b
print(sum_two(3, 4)) # 7
Функции высшего порядка
Функции, которые принимают другие функции в качестве аргументов:
def apply_function(func, value):
"""Применяет функцию к значению."""
return func(value)
print(apply_function(square, 5)) # 25
Декораторы
Декораторы позволяют обернуть одну функцию в другую, изменяя её поведение:
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)) # 15
Когда использовать рекурсию
Рекурсия особенно полезна для:
- Обработки древовидных структур данных
- Решения задач, которые можно разделить на подзадачи
- Реализации алгоритмов типа "разделяй и властвуй"
- Работы с математическими последовательностями
Рекомендации по использованию
- Используйте функции для избежания дублирования кода
- Выбирайте итерацию вместо рекурсии для простых задач
- Применяйте рекурсию для сложных структур данных
- Документируйте функции с помощью docstrings
- Тестируйте функции изолированно для лучшей отладки
Понимание функций и рекурсии — это основа для написания эффективного и читаемого кода на Python. Эти инструменты помогают создавать модульные программы, которые легко поддерживать и расширять.