Предисловие от издательства....18
Отзывы и пожелания....18
Список опечаток....18
Нарушение авторских прав....18
Об авторе....19
Колофон....19
Предисловие....20
На кого рассчитана эта книга....20
На кого эта книга не рассчитана....21
Пять книг в одной....21
Как организована эта книга....21
Практикум....23
Поговорим: мое личное мнение....24
Сопроводительный сайт: fluentpython.com....24
Графические выделения....24
О примерах кода....25
Как с нами связаться....25
Благодарности....26
Благодарности к первому изданию....27
Часть I....30
Структуры данных....30
Глава 1....31
Модель данных в языке Python....31
Что нового в этой главе....32
Колода карт на Python....32
Как используются специальные методы....35
Эмуляция числовых типов....36
Строковое представление....39
Булево значение пользовательского типа....40
API коллекций....40
Сводка специальных методов....42
Почему len – не метод....44
Резюме....44
Дополнительная литература....45
Глава 2....47
Массив последовательностей....47
Что нового в этой главе....48
Общие сведения о встроенных последовательностях....48
Списковое включение и генераторные выражения....50
Списковое включение и удобочитаемость....51
Сравнение спискового включения с map и filter....52
Декартовы произведения....53
Генераторные выражения....54
Кортеж – не просто неизменяемый список....56
Кортежи как записи....56
Кортежи как неизменяемые списки....57
Сравнение методов кортежа и списка....59
Распаковка последовательностей и итерируемых объектов....60
Распаковка с помощью * в вызовах функций и литеральных последовательностях....62
Распаковка вложенных объектов....62
Сопоставление с последовательностями-образцами....63
Сопоставление с последовательностями-образцами в интерпретаторе....68
Получение среза....71
Почему в срезы и диапазоны не включается последний элемент....72
Объекты среза....72
Многомерные срезы и многоточие....73
Присваивание срезу....74
Использование + и * для последовательностей....75
Построение списка списков....75
Составное присваивание последовательностей....77
Головоломка: присваивание A += ....78
Метод list.sort и встроенная функция sorted....80
Когда список не подходит....82
Массивы....82
Представления областей памяти....85
NumPy....87
Двусторонние и другие очереди....89
Резюме....92
Дополнительная литература....93
Глава 3....98
Словари и множества....98
Что нового в этой главе....98
Современный синтаксис словарей....99
Словарные включения....99
Распаковка отображений....100
Объединение отображений оператором |....101
Сопоставление с отображением-образцом....101
Стандартный API типов отображений....104
Что значит «хешируемый»?....104
Обзор наиболее употребительных методов отображений....105
Вставка и обновление изменяемых значений....107
Автоматическая обработка отсутствующих ключей....110
defaultdict: еще один подход к обработке отсутствия ключа....110
Метод __missing__....111
Несогласованное использование __missing__ в стандартной библиотеке....113
Вариации на тему dict....114
collections.OrderedDict....114
collections.ChainMap....115
collections.Counter....116
shelve.Shelf....116
Создание подкласса UserDict вместо dict....117
Неизменяемые отображения....119
Представления словаря....120
Практические последствия внутреннего устройства класса dict....121
Теория множеств....122
Литеральные множества....124
Множественное включение....125
Практические последствия внутреннего устройства класса set....125
Операции над множествами....126
Теоретико-множественные операции над представлениями словарей....128
Резюме....130
Дополнительная литература....131
Глава 4....134
Unicode-текст и байты....134
Что нового в этой главе....135
О символах, и не только....135
Все, что нужно знать о байтах....136
Базовые кодировщики и декодировщики....139
Проблемы кодирования и декодирования....140
Обработка UnicodeEncodeError....141
Обработка UnicodeDecodeError....142
Исключение SyntaxError при загрузке модулей с неожиданной кодировкой....143
Как определить кодировку последовательности байтов....144
BOM: полезный крокозябр....145
Обработка текстовых файлов....146
Остерегайтесь кодировок по умолчанию....149
Нормализация Unicode для надежного сравнения....154
Сворачивание регистра....157
Служебные функции для сравнения нормализованного текста....157
Экстремальная «нормализация»: удаление диакритических знаков....158
Сортировка Unicode-текстов....161
Сортировка с помощью алгоритма упорядочивания Unicode....163
База данных Unicode....164
Поиск символов по имени....164
Символы, связанные с числами....166
Двухрежимный API....167
str и bytes в регулярных выражениях....167
str и bytes в функциях из модуля os....169
Резюме....169
Дополнительная литература....170
Глава 5....175
Построители классов данных....175
Что нового в этой главе....176
Обзор построителей классов данных....176
Основные возможности....178
Классические именованные кортежи....180
Типизированные именованные кортежи....183
Краткое введение в аннотации типов....184
Никаких последствий во время выполнения....184
Синтаксис аннотаций переменных....185
Семантика аннотаций переменных....185
Инспекция typing.NamedTuple....186
Инспектирование класса с декоратором dataclass....187
Еще о @dataclass....189
Опции полей....190
Постинициализация....193
Типизированные атрибуты класса....195
Инициализируемые переменные, не являющиеся полями....195
Пример использования @dataclass: запись о ресурсе из дублинского ядра....196
Класс данных как признак кода с душком....198
Класс данных как временная конструкция....200
Класс данных как промежуточное представление....200
Сопоставление с экземплярами классов – образцами....200
Простые классы-образцы....201
Именованные классы-образцы....201
Позиционные классы-образцы....203
Резюме....204
Дополнительная литература....204
Глава 6....208
Ссылки на объекты, изменяемость и повторное использование....208
Что нового в этой главе....209
Переменные – не ящики....209
Тождественность, равенство и псевдонимы....211
Выбор между == и is....212
Относительная неизменяемость кортежей....213
По умолчанию копирование поверхностное....214
Глубокое и поверхностное копирование произвольных объектов....217
Параметры функций как ссылки....218
Значения по умолчанию изменяемого типа: неудачная мысль....219
Защитное программирование при наличии изменяемых параметров....221
del и сборка мусора....223
Как Python хитрит с неизменяемыми объектами....225
Резюме....227
Дополнительная литература....228
Часть II....232
Функции как объекты....232
Глава 7....233
Функции как полноправные объекты....233
Что нового в этой главе....234
Обращение с функцией как с объектом....234
Функции высшего порядка....235
Современные альтернативы функциям map, filter и reduce....236
Анонимные функции....238
Девять видов вызываемых объектов....239
Пользовательские вызываемые типы....240
От позиционных к чисто именованным параметрам....241
Чисто позиционные параметры....243
Пакеты для функционального программирования....244
Модуль operator....244
Фиксация аргументов с помощью functools.partial....247
Резюме....249
Дополнительная литература....249
Глава 8....253
Аннотации типов в функциях....253
Что нового в этой главе....254
О постепенной типизации....254
Постепенная типизация на практике....255
Начинаем работать с Mypy....256
А теперь построже....257
Значение параметра по умолчанию....257
None в качестве значения по умолчанию....259
Типы определяются тем, какие операции они поддерживают....260
Типы, пригодные для использования в аннотациях....265
Тип Any....265
«Является подтипом» и «совместим с»....266
Простые типы и классы....268
Типы Optional и Union....268
Обобщенные коллекции....269
Типы кортежей....272
Обобщенные отображения....274
Абстрактные базовые классы....275
Тип Iterable....277
Параметризованные обобщенные типы и TypeVar....279
Статические протоколы....283
Тип Callable....287
Тип NoReturn....290
Аннотирование чисто позиционных и вариадических параметров....290
Несовершенная типизация и строгое тестирование....291
Резюме....292
Дополнительная литература....293
Глава 9....299
Декораторы и замыкания....299
Что нового в этой главе....300
Краткое введение в декораторы....300
Когда Python выполняет декораторы....301
Регистрационные декораторы....303
Правила видимости переменных....303
Замыкания....306
Объявление nonlocal....309
Логика поиска переменных....310
Реализация простого декоратора....311
Как это работает....312
Декораторы в стандартной библиотеке....313
Запоминание с помощью functools.cache....314
Использование lru_cache....316
Обобщенные функции с одиночной диспетчеризацией....317
Параметризованные декораторы....321
Параметризованный регистрационный декоратор....322
Параметризованный декоратор clock....323
Декоратор clock на основе класса....326
Резюме....327
Дополнительная литература....327
Глава 10....332
Реализация паттернов проектирования с помощью полноправных функций....332
Что нового в этой главе....333
Практический пример: переработка паттерна Стратегия....333
Классическая Стратегия....333
Функционально-ориентированная стратегия....337
Выбор наилучшей стратегии: простой подход....340
Поиск стратегий в модуле....341
Паттерн Стратегия, дополненный декоратором....342
Паттерн Команда....344
Резюме....345
Дополнительная литература....346
Часть III....350
Классы и протоколы....350
Глава 11....351
Объект в духе Python....351
Что нового в этой главе....352
Представления объекта....352
И снова класс вектора....353
Альтернативный конструктор....355
Декораторы classmethod и staticmethod....356
Форматирование при выводе....357
Хешируемый класс Vector2d....360
Поддержка позиционного сопоставления с образцом....362
Полный код класса Vector2d, версия 3....364
Закрытые и «защищенные» атрибуты в Python....367
Экономия памяти с помощью атрибута класса __slots__....369
Простое измерение экономии, достигаемой за счет __slot__....371
Проблемы при использовании __slots__....372
Переопределение атрибутов класса....373
Резюме....375
Дополнительная литература....376
Глава 12....380
Специальные методы для последовательностей....380
Что нового в этой главе....380
Vector: пользовательский тип последовательности....381
Vector, попытка № 1: совместимость с Vector2d....381
Протоколы и утиная типизация....384
Vector, попытка № 2: последовательность, допускающая срез....385
Как работает срезка....386
Метод __getitem__ с учетом срезов....387
Vector, попытка № 3: доступ к динамическим атрибутам....389
Vector, попытка № 4: хеширование и ускорение оператора ==....392
Vector, попытка № 5: форматирование....398
Резюме....405
Дополнительная литература....406
Глава 13....410
Интерфейсы, протоколы и ABC....410
Карта типизации....411
Что нового в этой главе....412
Два вида протоколов....412
Программирование уток....414
Python в поисках следов последовательностей....414
Партизанское латание как средство реализации протокола во время выполнения....416
Защитное программирование и принцип быстрого отказа....418
Гусиная типизация....420
Создание подкласса ABC....425
ABC в стандартной библиотеке....426
Определение и использование ABC....429
Синтаксические детали ABC....434
Создание подклассов ABC....434
Виртуальный подкласс Tombola....437
Использование функции register на практике....439
ABC и структурная типизация....439
Статические протоколы....441
Типизированная функция double....442
Статические протоколы, допускающие проверку во время выполнения....443
Ограничения протоколов, допускающих проверку во время выполнения....446
Поддержка статического протокола....447
Проектирование статического протокола....449
Рекомендации по проектированию протоколов....450
Расширение протокола....451
ABC из пакета numbers и числовые протоколы....452
Резюме....455
Дополнительная литература....456
Глава 14....461
Наследование: к добру или к худу....461
Что нового в этой главе....462
Функция super()....462
Сложности наследования встроенным типам....464
Множественное наследование и порядок разрешения методов....467
Классы-примеси....472
Отображения, не зависящие от регистра....472
Множественное наследование в реальном мире....474
ABC – тоже примеси....474
ThreadingMixIn и ForkingMixIn....474
Множественное наследование в Tkinter....479
Жизнь с множественным наследованием....481
Предпочитайте композицию наследованию класса....482
Разберитесь, зачем наследование используется в каждом конкретном случае....482
Определяйте интерфейсы явно с помощью ABC....482
Используйте примеси для повторного использования кода....483
Предоставляйте пользователям агрегатные классы....483
Наследуйте только классам, предназначенным для наследования....483
Воздерживайтесь от наследования конкретным классам....484
Tkinter: хороший, плохой, злой....484
Резюме....486
Дополнительная литература....487
Глава 15....491
Еще об аннотациях типов....491
Что нового в этой главе....491
Перегруженные сигнатуры....491
Перегрузка max....493
Уроки перегрузки max....497
TypedDict....497
Приведение типов....504
Чтение аннотаций типов во время выполнения....507
Проблемы с аннотациями во время выполнения....507
Как решать проблему....510
Реализация обобщенного класса....510
Основы терминологии, относящейся к обобщенным типам....512
Вариантность....513
Инвариантный разливочный автомат....513
Ковариантный разливочный автомат....515
Контравариантная урна....515
Обзор вариантности....517
Реализация обобщенного статического протокола....519
Резюме....521
Дополнительная литература....522
Глава 16....527
Перегрузка операторов....527
Что нового в этой главе....528
Основы перегрузки операторов....528
Унарные операторы....529
Перегрузка оператора сложения векторов +....532
Перегрузка оператора умножения на скаляр *....537
Использование @ как инфиксного оператора....539
Арифметические операторы – итоги....540
Операторы сравнения....541
Операторы составного присваивания....544
Резюме....548
Дополнительная литература....549
Часть IV....554
Поток управления....554
Глава 17....555
Итераторы, генераторы и классические сопрограммы....555
Что нового в этой главе....556
Последовательность слов....556
Почему последовательности итерируемы: функция iter....557
Использование iter в сочетании с Callable....559
Итерируемые объекты и итераторы....560
Классы Sentence с методом __iter__....563
Класс Sentence, попытка № 2: классический итератор....564
Не делайте итерируемый объект итератором для самого себя....565
Класс Sentence, попытка № 3: генераторная функция....566
Как работает генератор....567
Ленивые классы Sentence....569
Класс Sentence, попытка № 4: ленивый генератор....569
Класс Sentence, попытка № 5: генераторное выражение....570
Генераторные выражения: когда использовать....572
Генератор арифметической прогрессии....574
Построение арифметической прогрессии с помощью itertools....576
Генераторные функции в стандартной библиотеке....577
Функции редуцирования итерируемого объекта....587
yield from и субгенераторы....589
Изобретаем chain заново....590
Обход дерева....591
Обобщенные итерируемые типы....595
Классические сопрограммы....596
Пример: сопрограмма для вычисления накопительного среднего....598
Возврат значения из сопрограммы....600
Аннотации обобщенных типов для классических сопрограмм....604
Резюме....606
Дополнительная литература....606
Глава 18....611
Блоки with, match и else....611
Что нового в этой главе....612
Контекстные менеджеры и блоки with....612
Утилиты contextlib....616
Использование @contextmanager....617
Сопоставление с образцом в lis.py: развернутый пример....621
Синтаксис Scheme....621
Предложения импорта и типы....622
Синтаксический анализатор....623
Класс Environment....625
Цикл REPL....627
Вычислитель....628
Procedure: класс, реализующий замыкание....635
Использование OR-образцов....636
Делай то, потом это: блоки else вне if....637
Резюме....639
Дополнительная литература....640
Глава 19....645
Модели конкурентности в Python....645
Что нового в этой главе....646
Общая картина....646
Немного терминологии....647
Процессы, потоки и знаменитая блокировка GIL в Python ....649
Конкурентная программа Hello World....651
Анимированный индикатор с потоками....651
Индикатор с процессами....654
Индикатор с сопрограммами....655
Сравнение супервизоров....659
Истинное влияние GIL....661
Проверка знаний....661
Доморощенный пул процессов....664
Решение на основе процессов....665
Интерпретация времени работы....666
Код проверки на простоту для многоядерной машины....667
Эксперименты с большим и меньшим числом процессов....670
Не решение на основе потоков....671
Python в многоядерном мире....672
Системное администрирование....673
Наука о данных....674
Веб-разработка на стороне сервера и на мобильных устройствах....675
WSGI-серверы приложений....677
Распределенные очереди задач....679
Резюме....680
Дополнительная литература....681
Конкурентность с применением потоков и процессов....681
GIL....683
Конкурентность за пределами стандартной библиотеки....683
Конкурентность и масштабируемость за пределами Python....685
Глава 20....690
Конкурентные исполнители....690
Что нового в этой главе....690
Конкурентная загрузка из веба....691
Скрипт последовательной загрузки....693
Загрузка с применением библиотеки concurrent.futures....695
Где находятся будущие объекты?....697
Запуск процессов с помощью concurrent.futures....700
И снова о проверке на простоту на многоядерной машине....700
Эксперименты с Executor.map....703
Загрузка с индикацией хода выполнения и обработкой ошибок....706
Обработка ошибок во flags2-примерах....710
Использование futures.as_completed....712
Резюме....715
Дополнительная литература....715
Глава 21....718
Асинхронное программирование....718
Что нового в этой главе....719
Несколько определений....719
Пример использования asyncio: проверка доменных имен....720
Предложенный Гвидо способ чтения асинхронного кода....722
Новая концепция: объекты, допускающие ожидание....723
Загрузка файлов с помощью asyncio и HTTPX....724
Секрет платформенных сопрограмм: скромные генераторы....726
Проблема «все или ничего»....727
Асинхронные контекстные менеджеры....728
Улучшение асинхронного загрузчика....729
Использование asyncio.as_completed и потока....730
Регулирование темпа запросов с помощью семафора....732
Отправка нескольких запросов при каждой загрузке....735
Делегирование задач исполнителям....738
Написание асинхронных серверов....739
Веб-служба FastAPI....741
Асинхронный TCP-сервер....745
Асинхронные итераторы и итерируемые объекты....750
Асинхронные генераторные функции....751
Асинхронные включения и асинхронные генераторные выражения....757
async за пределами asyncio: Curio....759
Аннотации типов для асинхронных объектов....762
Как работает и как не работает асинхронность....763
Круги, разбегающиеся вокруг блокирующих вызовов....763
Миф о системах, ограниченных вводом-выводом....764
Как не попасть в ловушку счетных функций....764
Резюме....765
Дополнительная литература....766
Часть V....770
Метапрограммирование....770
Глава 22....771
Динамические атрибуты и свойства....771
Что нового в этой главе....771
Применение динамических атрибутов для обработки данных....772
Исследование JSON-подобных данных с динамическими атрибутами....774
Проблема недопустимого имени атрибута....777
Гибкое создание объектов с помощью метода __new__....778
Вычисляемые свойства....780
Шаг 1: создание управляемого данными атрибута....781
Шаг 2: выборка связанных записей с помощью свойств....783
Шаг 3: переопределение существующего атрибута свойством....786
Шаг 4: кеширование свойств на заказ....787
Шаг 5: кеширование свойств с помощью functools....788
Использование свойств для контроля атрибутов....790
LineItem, попытка № 1: класс строки заказа....790
LineItem, попытка № 2: контролирующее свойство....791
Правильный взгляд на свойства....793
Свойства переопределяют атрибуты экземпляра....794
Документирование свойств....796
Программирование фабрики свойств....797
Удаление атрибутов....799
Важные атрибуты и функции для работы с атрибутами....801
Специальные атрибуты, влияющие на обработку атрибутов....801
Встроенные функции для работы с атрибутами....802
Специальные методы для работы с атрибутами....803
Резюме....804
Дополнительная литература....805
Глава 23....809
Дескрипторы атрибутов....809
Что нового в этой главе....809
Пример дескриптора: проверка значений атрибутов....810
LineItem попытка № 3: простой дескриптор....810
LineItem попытка № 4: автоматическое генерирование имен атрибутов хранения....815
LineItem попытка № 5: новый тип дескриптора....817
Переопределяющие и непереопределяющие дескрипторы....819
Переопределяющие дескрипторы....821
Переопределяющий дескриптор без __get__....822
Непереопределяющий дескриптор....823
Перезаписывание дескриптора в классе....824
Методы являются дескрипторами....825
Советы по использованию дескрипторов....827
Строка документации дескриптора и перехват удаления....828
Резюме....830
Дополнительная литература....830
Глава 24....833
Метапрограммирование классов....833
Что нового в этой главе....834
Классы как объекты....834
type: встроенная фабрика классов....835
Функция-фабрика классов....836
Введение в __init_subclass__....839
Почему __init_subclass__ не может конфигурировать __slots__....845
Дополнение класса с помощью декоратора класса....846
Что когда происходит: этап импорта и этап выполнения....848
Демонстрация работы интерпретатора....849
Основы метаклассов....853
Как метакласс настраивает класс....855
Элегантный пример метакласса....856
Демонстрация работы метакласса....859
Реализация Checked с помощью метакласса....863
Метаклассы на практике....867
Современные средства позволяют упростить или заменить метаклассы....867
Метаклассы – стабильное языковое средство....868
У класса может быть только один метакласс....868
Метаклассы должны быть деталью реализации....869
Метаклассный трюк с __prepare__....869
Заключение....871
Резюме....872
Дополнительная литература....873
Послесловие....877
Предметный указатель....880
Не тратьте зря времени, пытаясь подогнать Python под способы программирования, знакомые вам по другим языкам. Python настолько прост, что вы очень быстро освоите его в общих чертах, но для создания эффективных современных программ требуются более глубокие знания.
Второе издание книги позволит вам использовать возможности Python 3 в полной мере, обратив себе на пользу лучшие идеи. Автор рассказывает о базовых средствах языка, о его библиотеках и учит писать более краткий, быстрый и удобочитаемый код. Вы узнаете о том, как применять идиоматические средства Python 3, выходящие за рамки вашего предыдущего опыта.