Открыть сервисСервис

Функция def в Python

def — ключевое слово языка программирования Python, служащее для объявления пользовательской функции. Оно открывает блок кода, который выполняется при обращении к функции по имени, и позволяет выделить повторяемую логику в отдельную именованную единицу. Вместе с class и lambda относится к инструкциям определения объектов; в отличие от lambda, def поддерживает произвольное количество параметров, многострочные тела, аннотации типов и оператор return.

Синтаксис

Минимальное объявление функции выглядит так:

``python def greet(): print("Привет") ``

Инструкция def сопровождается идентификатором, круглыми скобками со списком параметров и двоеточием; тело функции записывается с отступом (обычно 4 пробела). Возвращать значение можно оператором return — если он отсутствует, функция возвращает None.

``python def add(a, b): return a + b ``

Вызов функции выполняется обращением к имени со скобками: add(2, 3) вернёт 5.

Параметры и аргументы

Список параметров в объявлении задаёт, какие значения функция принимает. Python поддерживает несколько форм параметров:

ФормаПримерНазначение
Позиционныеdef f(a, b)Обязательные, передаются по порядку
С именемdef f(a=1)Значение по умолчанию
*argsdef f(*args)Сбор произвольного числа позиционных аргументов в кортеж
**kwargsdef f(**kwargs)Сбор именованных аргументов в словарь
Позиционно-ключевыеdef f(a, /, b)a можно передать только позиционно (Python 3.8+)
Только ключевыеdef f(a, *, b)b только по имени

Значения по умолчанию вычисляются один раз — в момент объявления функции, что является распространённой ловушкой при использовании изменяемых объектов (списков, словарей) в качестве дефолтных значений.

Область видимости и замыкания

Переменные, определённые внутри функции, локальны и не видны снаружи. Для чтения переменных внешней области используется инструкция global, для чтения из ближайшей внешней функции — nonlocal. Функция в Python — объект первого класса: она может быть присвоена переменной, передана как аргумент или возвращена другой функцией. Если внутренняя функция обращается к переменным внешней, возникает замыкание (closure).

Аннотации типов и docstring

Начиная с Python 3, параметры и возвращаемое значение можно аннотировать:

``python def total(items: list[int]) -> int: return sum(items) ``

Аннотации хранятся в атрибуте __annotations__ и не проверяются интерпретатором автоматически — для проверки используются сторонние инструменты (mypy, pydantic). Первый строковый литерал в теле функции становится docstring и доступен через __doc__.

Декораторы

Механизм декораторов тесно связан с def: декоратор — это функция, принимающая другую функцию и возвращающая замещающий объект. Синтаксис @decorator над объявлением def эквивалентен присваиванию func = decorator(func).

```python def log_calls(func): def wrapper(*args, **kwargs): print(f"Вызов {func.__name__}") return func(*args, **kwargs) return wrapper

@log_calls def work(): pass ```

Асинхронные функции

Инструкция async def объявляет корутину — асинхронную функцию, которая выполняется под управлением event loop (asyncio, aiohttp и др.). Внутри корутины используются await для ожидания других асинхронных операций.

``python async def fetch(url): ... ``

Вызов fetch(url) не запускает тело немедленно, а создаёт coroutine-объект, который нужно передать в asyncio.run или await-контекст.

Особенности реализации

Каждое выполнение инструкции def создаёт новый объект функции (тип function), хранящий ссылку на код, словарь globals модуля и closure. Декларативность Python означает, что тело функции исполняется не в момент объявления, а при вызове. Рекурсия допустима: функция может вызывать себя, хотя глубина рекурсии по умолчанию ограничена (обычно 1000 кадров).

История

Инструкция def присутствует в Python с самого появления языка (1991, Гвидо ван Россум). Синтаксис с двоеточием и отступами унаследован от ABC и Modula-3. Аннотации типов добавлены в Python 3.0 (2008), позиционно-ключевые параметры — в 3.8 (2019), async def — в Python 3.5 (2015).

Источники

Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru