В этой главе вы разобрались с приёмами, которые делают функции в Python ещё более гибким и выразительным инструментом. Узнали, как описывать алгоритмы через рекурсию, научились избегать избыточных вычислений с помощью кеширования и увидели, как декораторы позволяют добавлять к функциям дополнительное поведение — без изменения их кода. Кроме того, вы познакомились с генераторами и освоили технику «ленивых» вычислений, когда значения создаются только по мере необходимости.
Теперь вы умеете:
- создавать рекурсивные функции и применять их для задач, где решение строится через обращение к самому себе;
- отличать императивный и декларативный стиль программирования и понимать, какой из них лучше подходит в каждом конкретном случае;
- использовать кеширование для ускорения работы рекурсий: как вручную через словарь, так и автоматически с помощью
@lru_cache
; - писать собственные декораторы и применять их для расширения функциональности других функций — универсально, через
*args
и**kwargs
; - описывать функции-генераторы, использовать
yield
и работать с данными по частям, не загружая всю коллекцию в память.
Вы получили в руки мощные инструменты, которые позволяют писать компактный, выразительный и удобочитаемый код — особенно в тех случаях, когда функции должны быть максимально гибкими и повторно используемыми.
В следующей главе вас ждёт новый уровень организации кода — объектно-ориентированное программирование. Мы обсудим, как устроены классы и объекты в Python, зачем нужны инкапсуляция и наследование и как описывать сложные сущности и их поведение с помощью методов, полей и магических функций.