Как правильно объявлять функции в Python
Основы определения функций в Python
Функция в Python это именованный блок кода, который выполняет определённое действие. Определение функции начинается с ключевого слова def, за которым следует имя функции, круглые скобки с параметрами (если они нужны) и двоеточие. Тело функции записывается с отступом. После определения функцию можно вызвать по имени.
Самый распространённый способ задания функции:
def greet():
print("Привет, мир!")
greet() # Вызов функциизадание функции в python (задание на функции в python)
Здесь greet – имя функции, она не принимает аргументов и ничего не возвращает (возвращает None). Вызов происходит простым указанием имени со скобками.
Типичная ошибка: забыть двоеточие после заголовка функции или нарушить отступы. Интерпретатор выдаст SyntaxError.
Как создать функцию без параметров и без возврата?
Такие функции используются для выполнения повторяющихся действий, например, вывода сообщения.
def show_menu():
print("1. Начать игру")
print("2. Загрузить")
print("3. Выход")
show_menu()Проблема: функция не принимает данные извне, поэтому её поведение нельзя изменить без редактирования кода.
Как задать функцию с параметрами?
Параметры позволяют передавать данные в функцию. Аргументы подставляются на место параметров при вызове.
def greet_user(name):
print(f"Привет, {name}!")
greet_user("Анна")Параметр name – это переменная, которая получает значение переданного аргумента.
Ошибка: вызов функции без обязательного аргумента приводит к TypeError. Например, greet_user() вызовет ошибку.
Как определить функцию с возвратом значения?
Инструкция return завершает выполнение функции и отправляет результат обратно в вызывающий код.
def add(a, b):
return a + b
result = add(5, 3)
print(result) # 8Возвращаемое значение можно присвоить переменной или использовать в выражении.
Частая ошибка: забыть написать return. Функция вернёт None, что может быть неожиданно.
Как задать функцию с параметрами по умолчанию?
Значения по умолчанию делают некоторые параметры необязательными.
def greet_user(name="Гость"):
print(f"Привет, {name}!")
greet_user() # Привет, Гость!
greet_user("Мария") # Привет, Мария!Если аргумент не передан, используется значение по умолчанию.
Запомнить: значения по умолчанию вычисляются один раз при определении функции. Не стоит использовать изменяемые объекты (списки, словари) как значения по умолчанию – это может привести к неожиданному поведению.
Как определить функцию с произвольным числом позиционных аргументов (*args)?
Звёздочка перед параметром упаковывает все переданные позиционные аргументы в кортеж.
def sum_all(*args):
return sum(args)
print(sum_all(1, 2, 3)) # 6
print(sum_all(10, 20)) # 30Имя args – общепринятое, но можно использовать любое.
Ошибка: если смешивать обычные параметры и *args, сначала указываются обычные, иначе возникает синтаксическая ошибка.
Как задать функцию с произвольным числом именованных аргументов (**kwargs)?
Две звёздочки упаковывают все переданные именованные аргументы в словарь.
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Иван", age=25, city="Москва")Проблема: если ожидаются определённые ключи, их отсутствие не вызовет ошибки – это нужно проверять вручную.
Как задать функцию с аннотациями типов?
Аннотации (подсказки типов) улучшают читаемость и помогают статическим анализаторам, но не влияют на выполнение.
def multiply(x: int, y: int) -> int:
return x * y
result = multiply(4, 5) # 20Стрелка -> указывает тип возвращаемого значения.
Замечание: Python не проверяет типы при вызове. Если передать строку, код выполнится.
Как создать вложенную функцию (замыкание)?
Функцию можно определить внутри другой функции. Она может захватывать переменные из внешней области видимости.
def outer(x):
def inner(y):
return x + y
return inner
add_five = outer(5)
print(add_five(3)) # 8Типичная ошибка: путаница с областью видимости переменных. Внутренняя функция видит переменные внешней, но не наоборот.
Как задать лямбда-функцию (анонимную)?
Лямбда – это короткая функция, состоящая из одного выражения. Её можно использовать там, где нужна простая функция на один раз.
square = lambda x: x ** 2
print(square(4)) # 16Лямбды часто применяются с функциями sorted, filter, map.
Ограничение: в лямбде нельзя использовать инструкции, только выражения.
Расширенные примеры определения функций
Функция с комбинированием *args и **kwargs
Можно одновременно принимать произвольные позиционные и именованные аргументы. Это часто используется в декораторах и обёртках.
def flexible_func(*args, **kwargs):
print("Позиционные:", args)
print("Именованные:", kwargs)
flexible_func(1, 2, 3, name="Alex", age=30)Позиционные: (1, 2, 3)
Именованные: {'name': 'Alex', 'age': 30}
Порядок важен: сначала *args, затем **kwargs. Иначе синтаксическая ошибка.
Рекурсивная функция (факториал)
Функция может вызывать саму себя. Необходимо определить базовый случай, чтобы избежать бесконечной рекурсии.
def factorial(n):
if n <= 1:
return 1
else:
return n * factorial(n - 1)
print(factorial(5))120
Внимание: глубокая рекурсия может превысить лимит стека вызовов (RecursionError). Для больших n лучше использовать итеративный подход.
Проблема изменяемого объекта по умолчанию
Если в качестве значения по умолчанию задан изменяемый объект, он будет общим для всех вызовов функции. Рассмотрим классический пример:
def append_to_list(value, lst=[]):
lst.append(value)
return lst
print(append_to_list(1)) # [1]
print(append_to_list(2)) # [1, 2] – неожиданно[1]
[1, 2]
Решение – использовать None в качестве значения по умолчанию и создавать новый список внутри функции:
def append_to_list_fixed(value, lst=None):
if lst is None:
lst = []
lst.append(value)
return lst
print(append_to_list_fixed(1)) # [1]
print(append_to_list_fixed(2)) # [2][1]
[2]
Функция, возвращающая несколько значений (кортеж)
В Python функция может вернуть несколько значений через запятую – они упаковываются в кортеж.
def min_max(lst):
return min(lst), max(lst)
low, high = min_max([3, 1, 7, 2])
print(f"Минимум: {low}, Максимум: {high}")Минимум: 1, Максимум: 7
Распаковка кортежа упрощает присваивание.
Лямбда-функция в сочетании с sorted()
Лямбды удобны для задания ключа сортировки.
students = [("Иван", 22), ("Мария", 19), ("Петр", 25)]
students_sorted = sorted(students, key=lambda s: s[1])
print(students_sorted)[('Мария', 19), ('Иван', 22), ('Петр', 25)]Анонимная функция извлекает возраст для сравнения.
Функция-декоратор (обёртка) – базовый пример
Декоратор – это функция, которая принимает другую функцию и расширяет её поведение без изменения исходного кода.
def decorator(func):
def wrapper(*args, **kwargs):
print("До вызова функции")
result = func(*args, **kwargs)
print("После вызова функции")
return result
return wrapper
@decorator
def say_hello(name):
print(f"Привет, {name}!")
say_hello("Аня")До вызова функции
Привет, Аня!
После вызова функции
Синтаксис @decorator – это сахар для say_hello = decorator(say_hello).