Не тратьте зря времени, пытаясь подогнать Python под способы программирования, знакомые вам по другим языкам. Python настолько прост, что вы очень быстро станете продуктивным программистом, но зачастую это означает, что вы не в полной мере используете то, что может предложить язык. Второе издание книги позволит вам писать более эффективный и современный код на Python 3, обратив себе на пользу лучшие идеи.
Издание предназначено практикующим программистам на Python, которые хотят усовершенствоваться в Python 3.
Author(s): Лусиану Рамальо
Edition: 2
Publisher: ДМК Пресс
Year: 2022
Language: Russian
Commentary: Vector PDF
Pages: 898
City: М.
Tags: Data Structures; Python; Concurrency; Asynchronous Programming; Design Patterns; Object-Oriented Programming; asyncio; Metaprogramming; Coding Style
Предисловие от издательства
Отзывы и пожелания
Список опечаток
Нарушение авторских прав
Об авторе
Колофон
Предисловие
На кого рассчитана эта книга
На кого эта книга не рассчитана
Пять книг в одной
Как организована эта книга
Практикум
Поговорим: мое личное мнение
Сопроводительный сайт: fluentpython.com
Графические выделения
О примерах кода
Как с нами связаться
Благодарности
Благодарности к первому изданию
Часть I
Структуры данных
Глава 1
Модель данных в языке Python
Что нового в этой главе
Колода карт на Python
Как используются специальные методы
Эмуляция числовых типов
Строковое представление
Булево значение пользовательского типа
API коллекций
Сводка специальных методов
Почему len – не метод
Резюме
Дополнительная литература
Глава 2
Массив последовательностей
Что нового в этой главе
Общие сведения о встроенных последовательностях
Списковое включение и генераторные выражения
Списковое включение и удобочитаемость
Сравнение спискового включения с map и filter
Декартовы произведения
Генераторные выражения
Кортеж – не просто неизменяемый список
Кортежи как записи
Кортежи как неизменяемые списки
Сравнение методов кортежа и списка
Распаковка последовательностей и итерируемых объектов
Распаковка с помощью * в вызовах функций и литеральных последовательностях
Распаковка вложенных объектов
Сопоставление с последовательностями-образцами
Сопоставление с последовательностями-образцами в интерпретаторе
Получение среза
Почему в срезы и диапазоны не включается последний элемент
Объекты среза
Многомерные срезы и многоточие
Присваивание срезу
Использование + и * для последовательностей
Построение списка списков
Составное присваивание последовательностей
Головоломка: присваивание A +=
Метод list.sort и встроенная функция sorted
Когда список не подходит
Массивы
Представления областей памяти
NumPy
Двусторонние и другие очереди
Резюме
Дополнительная литература
Глава 3
Словари и множества
Что нового в этой главе
Современный синтаксис словарей
Словарные включения
Распаковка отображений
Объединение отображений оператором |
Сопоставление с отображением-образцом
Стандартный API типов отображений
Что значит «хешируемый»?
Обзор наиболее употребительных методов отображений
Вставка и обновление изменяемых значений
Автоматическая обработка отсутствующих ключей
defaultdict: еще один подход к обработке отсутствия ключа
Метод __missing__
Несогласованное использование __missing__ в стандартной библиотеке
Вариации на тему dict
collections.OrderedDict
collections.ChainMap
collections.Counter
shelve.Shelf
Создание подкласса UserDict вместо dict
Неизменяемые отображения
Представления словаря
Практические последствия внутреннего устройства класса dict
Теория множеств
Литеральные множества
Множественное включение
Практические последствия внутреннего устройства класса set
Операции над множествами
Теоретико-множественные операции над представлениями словарей
Резюме
Дополнительная литература
Глава 4
Unicode-текст и байты
Что нового в этой главе
О символах, и не только
Все, что нужно знать о байтах
Базовые кодировщики и декодировщики
Проблемы кодирования и декодирования
Обработка UnicodeEncodeError
Обработка UnicodeDecodeError
Исключение SyntaxError при загрузке модулей с неожиданной кодировкой
Как определить кодировку последовательности байтов
BOM: полезный крокозябр
Обработка текстовых файлов
Остерегайтесь кодировок по умолчанию
Нормализация Unicode для надежного сравнения
Сворачивание регистра
Служебные функции для сравнения нормализованного текста
Экстремальная «нормализация»: удаление диакритических знаков
Сортировка Unicode-текстов
Сортировка с помощью алгоритма упорядочивания Unicode
База данных Unicode
Поиск символов по имени
Символы, связанные с числами
Двухрежимный API
str и bytes в регулярных выражениях
str и bytes в функциях из модуля os
Резюме
Дополнительная литература
Глава 5
Построители классов данных
Что нового в этой главе
Обзор построителей классов данных
Основные возможности
Классические именованные кортежи
Типизированные именованные кортежи
Краткое введение в аннотации типов
Никаких последствий во время выполнения
Синтаксис аннотаций переменных
Семантика аннотаций переменных
Инспекция typing.NamedTuple
Инспектирование класса с декоратором dataclass
Еще о @dataclass
Опции полей
Постинициализация
Типизированные атрибуты класса
Инициализируемые переменные, не являющиеся полями
Пример использования @dataclass: запись о ресурсе из дублинского ядра
Класс данных как признак кода с душком
Класс данных как временная конструкция
Класс данных как промежуточное представление
Сопоставление с экземплярами классов – образцами
Простые классы-образцы
Именованные классы-образцы
Позиционные классы-образцы
Резюме
Дополнительная литература
Глава 6
Ссылки на объекты, изменяемость и повторное использование
Что нового в этой главе
Переменные – не ящики
Тождественность, равенство и псевдонимы
Выбор между == и is
Относительная неизменяемость кортежей
По умолчанию копирование поверхностное
Глубокое и поверхностное копирование произвольных объектов
Параметры функций как ссылки
Значения по умолчанию изменяемого типа: неудачная мысль
Защитное программирование при наличии изменяемых параметров
del и сборка мусора
Как Python хитрит с неизменяемыми объектами
Резюме
Дополнительная литература
Часть II
Функции как объекты
Глава 7
Функции как полноправные объекты
Что нового в этой главе
Обращение с функцией как с объектом
Функции высшего порядка
Современные альтернативы функциям map, filter и reduce
Анонимные функции
Девять видов вызываемых объектов
Пользовательские вызываемые типы
От позиционных к чисто именованным параметрам
Чисто позиционные параметры
Пакеты для функционального программирования
Модуль operator
Фиксация аргументов с помощью functools.partial
Резюме
Дополнительная литература
Глава 8
Аннотации типов в функциях
Что нового в этой главе
О постепенной типизации
Постепенная типизация на практике
Начинаем работать с Mypy
А теперь построже
Значение параметра по умолчанию
None в качестве значения по умолчанию
Типы определяются тем, какие операции они поддерживают
Типы, пригодные для использования в аннотациях
Тип Any
«Является подтипом» и «совместим с»
Простые типы и классы
Типы Optional и Union
Обобщенные коллекции
Типы кортежей
Обобщенные отображения
Абстрактные базовые классы
Тип Iterable
Параметризованные обобщенные типы и TypeVar
Статические протоколы
Тип Callable
Тип NoReturn
Аннотирование чисто позиционных и вариадических параметров
Несовершенная типизация и строгое тестирование
Резюме
Дополнительная литература
Глава 9
Декораторы и замыкания
Что нового в этой главе
Краткое введение в декораторы
Когда Python выполняет декораторы
Регистрационные декораторы
Правила видимости переменных
Замыкания
Объявление nonlocal
Логика поиска переменных
Реализация простого декоратора
Как это работает
Декораторы в стандартной библиотеке
Запоминание с помощью functools.cache
Использование lru_cache
Обобщенные функции с одиночной диспетчеризацией
Параметризованные декораторы
Параметризованный регистрационный декоратор
Параметризованный декоратор clock
Декоратор clock на основе класса
Резюме
Дополнительная литература
Глава 10
Реализация паттернов проектирования с помощью полноправных функций
Что нового в этой главе
Практический пример: переработка паттерна Стратегия
Классическая Стратегия
Функционально-ориентированная стратегия
Выбор наилучшей стратегии: простой подход
Поиск стратегий в модуле
Паттерн Стратегия, дополненный декоратором
Паттерн Команда
Резюме
Дополнительная литература
Часть III
Классы и протоколы
Глава 11
Объект в духе Python
Что нового в этой главе
Представления объекта
И снова класс вектора
Альтернативный конструктор
Декораторы classmethod и staticmethod
Форматирование при выводе
Хешируемый класс Vector2d
Поддержка позиционного сопоставления с образцом
Полный код класса Vector2d, версия 3
Закрытые и «защищенные» атрибуты в Python
Экономия памяти с помощью атрибута класса __slots__
Простое измерение экономии, достигаемой за счет __slot__
Проблемы при использовании __slots__
Переопределение атрибутов класса
Резюме
Дополнительная литература
Глава 12
Специальные методы для последовательностей
Что нового в этой главе
Vector: пользовательский тип последовательности
Vector, попытка № 1: совместимость с Vector2d
Протоколы и утиная типизация
Vector, попытка № 2: последовательность, допускающая срез
Как работает срезка
Метод __getitem__ с учетом срезов
Vector, попытка № 3: доступ к динамическим атрибутам
Vector, попытка № 4: хеширование и ускорение оператора ==
Vector, попытка № 5: форматирование
Резюме
Дополнительная литература
Глава 13
Интерфейсы, протоколы и ABC
Карта типизации
Что нового в этой главе
Два вида протоколов
Программирование уток
Python в поисках следов последовательностей
Партизанское латание как средство реализации протокола во время выполнения
Защитное программирование и принцип быстрого отказа
Гусиная типизация
Создание подкласса ABC
ABC в стандартной библиотеке
Определение и использование ABC
Синтаксические детали ABC
Создание подклассов ABC
Виртуальный подкласс Tombola
Использование функции register на практике
ABC и структурная типизация
Статические протоколы
Типизированная функция double
Статические протоколы, допускающие проверку во время выполнения
Ограничения протоколов, допускающих проверку во время выполнения
Поддержка статического протокола
Проектирование статического протокола
Рекомендации по проектированию протоколов
Расширение протокола
ABC из пакета numbers и числовые протоколы
Резюме
Дополнительная литература
Глава 14
Наследование: к добру или к худу
Что нового в этой главе
Функция super()
Сложности наследования встроенным типам
Множественное наследование и порядок разрешения методов
Классы-примеси
Отображения, не зависящие от регистра
Множественное наследование в реальном мире
ABC – тоже примеси
ThreadingMixIn и ForkingMixIn
Множественное наследование в Tkinter
Жизнь с множественным наследованием
Предпочитайте композицию наследованию класса
Разберитесь, зачем наследование используется в каждом конкретном случае
Определяйте интерфейсы явно с помощью ABC
Используйте примеси для повторного использования кода
Предоставляйте пользователям агрегатные классы
Наследуйте только классам, предназначенным для наследования
Воздерживайтесь от наследования конкретным классам
Tkinter: хороший, плохой, злой
Резюме
Дополнительная литература
Глава 15
Еще об аннотациях типов
Что нового в этой главе
Перегруженные сигнатуры
Перегрузка max
Уроки перегрузки max
TypedDict
Приведение типов
Чтение аннотаций типов во время выполнения
Проблемы с аннотациями во время выполнения
Как решать проблему
Реализация обобщенного класса
Основы терминологии, относящейся к обобщенным типам
Вариантность
Инвариантный разливочный автомат
Ковариантный разливочный автомат
Контравариантная урна
Обзор вариантности
Реализация обобщенного статического протокола
Резюме
Дополнительная литература
Глава 16
Перегрузка операторов
Что нового в этой главе
Основы перегрузки операторов
Унарные операторы
Перегрузка оператора сложения векторов +
Перегрузка оператора умножения на скаляр *
Использование @ как инфиксного оператора
Арифметические операторы – итоги
Операторы сравнения
Операторы составного присваивания
Резюме
Дополнительная литература
Часть IV
Поток управления
Глава 17
Итераторы, генераторы и классические сопрограммы
Что нового в этой главе
Последовательность слов
Почему последовательности итерируемы: функция iter
Использование iter в сочетании с Callable
Итерируемые объекты и итераторы
Классы Sentence с методом __iter__
Класс Sentence, попытка № 2: классический итератор
Не делайте итерируемый объект итератором для самого себя
Класс Sentence, попытка № 3: генераторная функция
Как работает генератор
Ленивые классы Sentence
Класс Sentence, попытка № 4: ленивый генератор
Класс Sentence, попытка № 5: генераторное выражение
Генераторные выражения: когда использовать
Генератор арифметической прогрессии
Построение арифметической прогрессии с помощью itertools
Генераторные функции в стандартной библиотеке
Функции редуцирования итерируемого объекта
yield from и субгенераторы
Изобретаем chain заново
Обход дерева
Обобщенные итерируемые типы
Классические сопрограммы
Пример: сопрограмма для вычисления накопительного среднего
Возврат значения из сопрограммы
Аннотации обобщенных типов для классических сопрограмм
Резюме
Дополнительная литература
Глава 18
Блоки with, match и else
Что нового в этой главе
Контекстные менеджеры и блоки with
Утилиты contextlib
Использование @contextmanager
Сопоставление с образцом в lis.py: развернутый пример
Синтаксис Scheme
Предложения импорта и типы
Синтаксический анализатор
Класс Environment
Цикл REPL
Вычислитель
Procedure: класс, реализующий замыкание
Использование OR-образцов
Делай то, потом это: блоки else вне if
Резюме
Дополнительная литература
Глава 19
Модели конкурентности в Python
Что нового в этой главе
Общая картина
Немного терминологии
Процессы, потоки и знаменитая блокировка GIL в Python
Конкурентная программа Hello World
Анимированный индикатор с потоками
Индикатор с процессами
Индикатор с сопрограммами
Сравнение супервизоров
Истинное влияние GIL
Проверка знаний
Доморощенный пул процессов
Решение на основе процессов
Интерпретация времени работы
Код проверки на простоту для многоядерной машины
Эксперименты с большим и меньшим числом процессов
Не решение на основе потоков
Python в многоядерном мире
Системное администрирование
Наука о данных
Веб-разработка на стороне сервера и на мобильных устройствах
WSGI-серверы приложений
Распределенные очереди задач
Резюме
Дополнительная литература
Конкурентность с применением потоков и процессов
GIL
Конкурентность за пределами стандартной библиотеки
Конкурентность и масштабируемость за пределами Python
Глава 20
Конкурентные исполнители
Что нового в этой главе
Конкурентная загрузка из веба
Скрипт последовательной загрузки
Загрузка с применением библиотеки concurrent.futures
Где находятся будущие объекты?
Запуск процессов с помощью concurrent.futures
И снова о проверке на простоту на многоядерной машине
Эксперименты с Executor.map
Загрузка с индикацией хода выполнения и обработкой ошибок
Обработка ошибок во flags2-примерах
Использование futures.as_completed
Резюме
Дополнительная литература
Глава 21
Асинхронное программирование
Что нового в этой главе
Несколько определений
Пример использования asyncio: проверка доменных имен
Предложенный Гвидо способ чтения асинхронного кода
Новая концепция: объекты, допускающие ожидание
Загрузка файлов с помощью asyncio и HTTPX
Секрет платформенных сопрограмм: скромные генераторы
Проблема «все или ничего»
Асинхронные контекстные менеджеры
Улучшение асинхронного загрузчика
Использование asyncio.as_completed и потока
Регулирование темпа запросов с помощью семафора
Отправка нескольких запросов при каждой загрузке
Делегирование задач исполнителям
Написание асинхронных серверов
Веб-служба FastAPI
Асинхронный TCP-сервер
Асинхронные итераторы и итерируемые объекты
Асинхронные генераторные функции
Асинхронные включения и асинхронные генераторные выражения
async за пределами asyncio: Curio
Аннотации типов для асинхронных объектов
Как работает и как не работает асинхронность
Круги, разбегающиеся вокруг блокирующих вызовов
Миф о системах, ограниченных вводом-выводом
Как не попасть в ловушку счетных функций
Резюме
Дополнительная литература
Часть V
Метапрограммирование
Глава 22
Динамические атрибуты и свойства
Что нового в этой главе
Применение динамических атрибутов для обработки данных
Исследование JSON-подобных данных с динамическими атрибутами
Проблема недопустимого имени атрибута
Гибкое создание объектов с помощью метода __new__
Вычисляемые свойства
Шаг 1: создание управляемого данными атрибута
Шаг 2: выборка связанных записей с помощью свойств
Шаг 3: переопределение существующего атрибута свойством
Шаг 4: кеширование свойств на заказ
Шаг 5: кеширование свойств с помощью functools
Использование свойств для контроля атрибутов
LineItem, попытка № 1: класс строки заказа
LineItem, попытка № 2: контролирующее свойство
Правильный взгляд на свойства
Свойства переопределяют атрибуты экземпляра
Документирование свойств
Программирование фабрики свойств
Удаление атрибутов
Важные атрибуты и функции для работы с атрибутами
Специальные атрибуты, влияющие на обработку атрибутов
Встроенные функции для работы с атрибутами
Специальные методы для работы с атрибутами
Резюме
Дополнительная литература
Глава 23
Дескрипторы атрибутов
Что нового в этой главе
Пример дескриптора: проверка значений атрибутов
LineItem попытка № 3: простой дескриптор
LineItem попытка № 4: автоматическое генерирование имен атрибутов хранения
LineItem попытка № 5: новый тип дескриптора
Переопределяющие и непереопределяющие дескрипторы
Переопределяющие дескрипторы
Переопределяющий дескриптор без __get__
Непереопределяющий дескриптор
Перезаписывание дескриптора в классе
Методы являются дескрипторами
Советы по использованию дескрипторов
Строка документации дескриптора и перехват удаления
Резюме
Дополнительная литература
Глава 24
Метапрограммирование классов
Что нового в этой главе
Классы как объекты
type: встроенная фабрика классов
Функция-фабрика классов
Введение в __init_subclass__
Почему __init_subclass__ не может конфигурировать __slots__
Дополнение класса с помощью декоратора класса
Что когда происходит: этап импорта и этап выполнения
Демонстрация работы интерпретатора
Основы метаклассов
Как метакласс настраивает класс
Элегантный пример метакласса
Демонстрация работы метакласса
Реализация Checked с помощью метакласса
Метаклассы на практике
Современные средства позволяют упростить или заменить метаклассы
Метаклассы – стабильное языковое средство
У класса может быть только один метакласс
Метаклассы должны быть деталью реализации
Метаклассный трюк с __prepare__
Заключение
Резюме
Дополнительная литература
Послесловие
Предметный указатель