Как правильно объявлять функции в Python

Раздел: Основы 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).

Задание на функции в Python - comments

En
задание функции в python (python)