В предыдущем уроке мы изучили основы функций: как их создавать, передавать параметры, возвращать значения. Это фундамент, на котором строится любое программирование на Python. Но возможности функций в этом языке гораздо шире. Python рассматривает функции как объекты первого класса — это означает, что функции можно присваивать переменным, передавать в качестве аргументов другим функциям, возвращать из функций, создавать динамически. Эти возможности открывают новые парадигмы программирования: функциональное программирование, метапрограммирование, создание гибких API. В этом уроке мы изучим четыре ключевые продвинутые техники работы с функциями, которые позволяют писать более лаконичный, выразительный и мощный код.
Лямбда-функции (lambda) — это анонимные (безымянные) функции, которые создаются в одной строке. Они идеально подходят для простых операций, которые не требуют полноценного определения функции с использованием def. Лямбда-функции часто используются как аргументы для встроенных функций высшего порядка: map(), filter(), sorted(). Вы узнаете, как создавать лямбда-функции, какие у них ограничения (только одно выражение, без операторов), и в каких ситуациях их применение делает код более читаемым. Мы разберем практические примеры: сортировка списка словарей по определенному ключу, фильтрация элементов коллекции, преобразование данных.
Замыкания (closures) — это механизм, позволяющий функции «запоминать» переменные из внешней области видимости, даже после того как внешняя функция завершила свою работу. Это мощный инструмент для создания фабрик функций и сохранения состояния без использования глобальных переменных. Вы поймете, как работают замыкания, чем они отличаются от обычных вложенных функций, как использовать ключевое слово nonlocal для изменения внешних переменных. На практических примерах мы создадим счетчик, который помнит своё состояние, и фабрику функций для создания математических операторов.
Декораторы (decorators) — это одна из самых элегантных и часто используемых возможностей Python. Декоратор — это функция, которая принимает другую функцию и возвращает её модифицированную версию. Декораторы позволяют добавлять дополнительную логику (логирование, проверка прав доступа, кэширование результатов, замер времени выполнения, валидация аргументов) к существующим функциям, не изменяя их исходный код. Вы научитесь создавать свои декораторы с помощью синтаксиса @имя_декоратора, использовать несколько декораторов одновременно, передавать аргументы в декораторы, а также сохранять метаданные исходной функции с помощью functools.wraps.
Рекурсия (recursion) — это техника, при которой функция вызывает саму себя. Рекурсия позволяет элегантно решать задачи, которые естественно разбиваются на подзадачи того же типа: вычисление факториала, числа Фибоначчи, обход древовидных структур (папки, комментарии, иерархические данные), поиск в глубину. Вы узнаете, как правильно строить рекурсивные функции, что такое базовый случай (условие остановки) и рекурсивный случай, как избежать бесконечной рекурсии, а также познакомитесь с ограничениями рекурсии в Python (глубина рекурсии, производительность) и способами их решения.
Все примеры будут максимально практичными и приближенными к реальным задачам: сортировка списка пользователей с помощью лямбда-функции, создание независимых счетчиков через замыкание, логирование времени выполнения функций через декоратор, вычисление чисел Фибоначчи рекурсивно и с кэшированием. К концу урока вы будете уверенно использовать продвинутые возможности функций и понимать, как они работают под капотом, что значительно расширит ваш инструментарий программиста.