Этап 2 из 11 · ≈ 6 ч

Функции, декораторы и замыкания

Основа с Junior

Аргументы, замыкания, декораторы с параметрами и functools.

Что важно знать

  • Функции — объекты первого класса.
  • Замыкание запоминает переменные внешней функции; nonlocal.
  • Декоратор — функция, возвращающая обёртку; functools.wraps сохраняет имя и документацию.

Критерии освоения

Junior ≈ 6 ч

  • Использует позиционные, именованные, *args и **kwargs
  • Пишет декоратор и объясняет замыкание

Практика. Написать декоратор замера времени и декоратор повторов.

Middle ≈ 4 ч

  • Пишет декоратор с параметрами и functools.wraps
  • Использует functools — lru_cache, partial, singledispatch

Практика. Написать декоратор повторов с параметрами (число попыток, исключения, пауза), работающий и для async-функций.

Проверка знаний

Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.

Вопросы с собеседований

Смотреть все
Что такое *args и **kwargs?Junior

args собирает лишние позиционные аргументы в кортеж, kwargs — лишние именованные в словарь.

Полный разбор
Как написать декоратор с параметрами и зачем нужен functools.wraps?Middle

Декоратор с параметрами — фабрика декораторов: функция принимает параметры и возвращает обычный декоратор, т. е. три уровня вложенности. functools.wraps копирует в обёртку __name__, __doc__, __module__, __qualname__ и ставит __wrapped__ — иначе логи…

Полный разбор
Как передаются аргументы в функцию — по значению или по ссылке?Junior

Ни то ни другое в классическом смысле: передаётся ссылка на объект (call by sharing).

Полный разбор
Что полезного есть в functools — lru_cache, cache, partial, singledispatch?Middle

lru_cache(maxsize) — мемоизация с вытеснением давно неиспользуемых; cache (3.9) — без ограничения. Аргументы должны быть хешируемыми. partial — зафиксировать часть аргументов. singledispatch — перегрузка по типу первого аргумента. cached_property — вычислить…

Полный разбор
Что такое замыкание?Junior

Замыкание — вложенная функция, которая помнит переменные внешней функции после её завершения.

Полный разбор
Почему лямбды, созданные в цикле, возвращают одно и то же значение?Middle

Замыкание захватывает переменную, а не её значение: значение читается в момент вызова. К моменту вызова цикл закончился, и все лямбды видят последнее значение i. Исправление — зафиксировать значение: аргумент по умолчанию (lambda i=i: i) или functools.partial.

Полный разбор
Что такое декоратор и как его написать?Junior

Декоратор — функция, которая принимает функцию и возвращает новую; @dec — сахар для f = dec(f).

Полный разбор
Как работают области видимости в Python?Junior

Имя ищется по цепочке LEGB: Local → Enclosing → Global → Built-in.

Полный разбор
Почему нельзя использовать изменяемый объект как значение аргумента по умолчанию?Junior

Значение по умолчанию вычисляется один раз — при определении функции, а не при каждом вызове.

Полный разбор

Разборы темы

← Вся карта «Python»

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования