Рецепты Python. Коллекция лучших техник программирования

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

В «Рецептах Python» используется простой, но эффективный метод освоения 63-х базовых навыков программирования на Python. Сначала формулируется вопрос, например «Как найти элементы в последовательности?» Затем приводится базовое решение на чистом понятном коде. Далее исследуются другие интересные подходы, такие как поиск подстрок или пользовательские классы. Перед переходом к следующему вопросу полученные навыки закрепляются с помощью решения задач. Автор рассматривает все языковые средства, необходимые для уверенного владения Python. По ходу знакомства с книгой вы изучите лучшие приемы написания питонического кода. В освоении каждого инструмента помогут конкретные рекомендации и рисунки. Многочисленные перекрестные ссылки указывают на возможность повторного использования рассматриваемых средств и концепций в различных контекстах.

Author(s): Юн Цуй
Series: Библиотека программиста
Edition: 1
Publisher: Питер
Year: 2024

Language: Russian
Commentary: Publisher's PDF
Pages: 512
City: СПб.
Tags: Programming; Debugging; Python; Logging; JSON; Laziness; Object-Oriented Programming; Decorators; Generators; Testing; Regular Expressions; Text Processing; Exception Handling; Elementary; Higher-Order Functions; Iterators

Предисловие
Благодарности
О книге
Для кого эта книга
Структура книги
О коде в книге
Форум LiveBook
Другие источники информации
Об авторе
Иллюстрация на обложке
От издательства
Глава 1. Разработка стратегии прагматичного обучения
1.1. О пользе прагматичного подхода
1.1.1. Написание удобочитаемого кода Python
1.1.2. Думайте о опровождаемости еще до написания кода
1.2. Что Python делает хорошо — или не хуже, чем другие языки
1.3. Чего Python не делает или что делает недостаточно хорошо
1.4. О чем вы узнаете из книги
1.4.1. Ориентация на предметно-независимые знания
1.4.2. Решение задач посредством синтеза
1.4.3. Изучение навыков в контексте
Итоги
Часть 1. Использование встроенных моделей данных
Глава 2. Обработка и форматирование строк
2.1. Как использовать f-строки для интерполяции и форматирования
2.1.1. Форматирование строк до появления f-строк
2.1.2. Использование f-строк для интерполяции переменных
2.1.3. Использование f-строк для интерполяции выражений
2.1.4. Применение спецификаторов для форматирования f-строк
2.1.5. Обсуждение
2.1.6. Задача
2.2. Как преобразовать строки для получения представляемых данных
2.2.1. Проверка строк на представление алфавитно-цифровых значений
2.2.2. Преобразование строк в числа
2.2.3. Вычисление строк для получения представляемых данных
2.2.4. Обсуждение
2.2.5. Задача
2.3. Как объединять и разбивать строки
2.3.1. Объединение строк с пробельными символами
2.3.2. Объединение строк без ограничителей
2.3.3. Разбиение строк для создания списка
2.3.4. Обсуждение
2.3.5. Задача
2.4. Какие возможности предоставляют регулярные выражения
2.4.1. Работа с регулярными выражениями в Python
2.4.2. Определение шаблона в виде необработанной строки
2.4.3. Основы синтаксиса регулярных выражений
2.4.4. Анализ совпадений
2.4.5. Часто используемые методы
2.4.6. Обсуждение
2.4.7. Задача
2.5. Как использовать регулярные выражения для обработки текста
2.5.1. Создание шаблона для поиска совпадений
2.5.2. Извлечение данных из совпадений
2.5.3. Использование именованных групп для обработки текста
2.5.4. Обсуждение
2.5.5. Задача
Итоги
Глава 3. Встроенные контейнеры данных
3.1. Как выбрать между списком и кортежем
3.1.1. Кортежи для неизменяемых, списки для изменяемых данных
3.1.2. Кортежи для разнородных, списки для однородных данных
3.1.3. Обсуждение
3.1.4. Задача
3.2. Как сортировать списки сложных данных с помощью специализированных функций
3.2.1. Сортировка списков в порядке по умолчанию
3.2.2. Использование встроенной функции как ключа сортировки
3.2.3. Использование нестандартных функций для более сложных задач сортировки
3.2.4. Обсуждение
3.2.5. Задача
3.3. Как построить облегченную модель данных с использованием именованных кортежей
3.3.1. Альтернативные модели данных
3.3.2. Создание именованных кортежей для хранения данных
3.3.3. Обсуждение
3.3.4. Задача
3.4. Как обращаться к ключам, значениям и элементам словарей
3.4.1. Прямое использование объектов динамических представлений (keys, values и items)
3.4.2. Будьте осторожны с исключением KeyError
3.4.3. Предотвращение KeyError с предварительной проверкой: непитонический способ
3.4.4. Использование метода get для обращения к элементу словаря
3.4.5. Побочный эффект метода setdefault
3.4.6. Обсуждение
3.4.7. Задача
3.5. Когда использовать словари и множества вместо списков и кортежей
3.5.1. Преимущества постоянной эффективности поиска
3.5.2. Хешируемость и хеширование
3.5.3. Обсуждение
3.5.4. Задача
3.6. Как использовать операции над множествами для проверки отношений между списками
3.6.1. Проверка вхождения всех элементов в другой список
3.6.2. Проверка вхождения любого элемента списка в другой список
3.6.3. Работа с несколькими объектами set
3.6.4. Обсуждение
3.6.5. Задача
Итоги
Глава 4. Работа с последовательностями
4.1. Как получать подпоследовательности и выполнять над ними операции с помощью срезов
4.1.1. Использование всех возможностей слайсинга
4.1.2. Различия между срезами и интервалами
4.1.3. Использование именованных объектов slice для обработки данных последовательностей
4.1.4. Операции с элементами списков с применением слайсинга
4.1.5. Обсуждение
4.1.6. Задача
4.2. Как использовать положительные и отрицательные индексы для получения элементов
4.2.1. Положительное индексирование от начала списка
4.2.2. Отрицательное индексирование от конца списка
4.2.3. Объединение положительных и отрицательных индексов
4.2.4. Обсуждение
4.2.5. Задача
4.3. Как искать элементы последовательности по критерию
4.3.1. Проверка вхождения элемента
4.3.2. Использование метода index для поиска элемента
4.3.3. Поиск подстроки в строке
4.3.4. Поиск экземпляра пользовательского класса в списке
4.3.5. Обсуждение
4.3.6. Задача
4.4. Как распаковать последовательности
4.4.1. Распаковка коротких последовательностей с однозначным соответствием
4.4.2. Выборка смежных элементов с использованием выражений со звездочкой
4.4.3. Пометка нежелательных элементов подчеркиваниями
4.4.4. Обсуждение
4.4.5. Задача
4.5. Когда следует выбирать другие модели данных, помимо списков и кортежей
4.5.1. Использование множеств в ситуациях с проверкой принадлежности
4.5.2. Деки для обеспечения принципа FIFO
4.5.3. Обработка многомерных данных средствами NumPy и Pandas
4.5.4. Обсуждение
4.5.5. Задача
Итоги
Глава 5. Итерируемые объекты и перебор
5.1. Как создавать распространенные контейнеры данных с использованием итерируемых объектов
5.1.1. Итерируемые объекты и итераторы
5.1.2. Проверка итерируемости
5.1.3. Использование итерируемых объектов для создания встроенных контейнеров данных
5.1.4. Обсуждение
5.1.5. Задача
5.2. Что такое включения списков, словарей и множеств
5.2.1. Создание списков из итерируемых объектов с использованием списковых включений
5.2.2. Создание словарей из итерируемых объектов с использованием словарных включений
5.2.3. Создание множеств из итерируемых объектов с использованием включений множеств
5.2.4. Применение фильтрующего условия
5.2.5. Встроенные циклы for
5.2.6. Обсуждение
5.2.7. Задача
5.3. Как улучшить циклы for с использованием встроенных функций
5.3.1. Перечисление элементов и enumerate
5.3.2. Обратная перестановка элементов функцией reversed
5.3.3. Соединение итерируемых объектов с использованием zip
5.3.4. Сцепление нескольких итерируемых объектов функцией chain
5.3.5. Фильтрация итерируемого объекта функцией filter
5.3.6. Обсуждение
5.3.7. Задача
5.4. Как использовать необязательные инструкции в циклах for и while
5.4.1. Выход из циклов инструкцией break
5.4.2. Пропуск итерации инструкцией continue
5.4.3. Использование else в циклах for и while
5.4.4. Обсуждение
5.4.5. Задача
Итоги
Часть 2. Определение функций
Глава 6. Определение дружественных к пользователю функций
6.1. Как определить аргументы по умолчанию для упрощения вызова функций
6.1.1. Вызов функций с аргументами по умолчанию
6.1.2. Определение функций с аргументами по умолчанию
6.1.3. Предотвращение проблем с назначением аргументов по умолчанию для изменяемых параметров
6.1.4. Обсуждение
6.1.5. Задача
6.2. Как определить и использовать возвращаемое значение при вызовах функций
6.2.1. Явное и неявное возвращение значения
6.2.2. Определение функций, возвращающих 0, 1 или несколько значений
6.2.3. Использование нескольких значений, возвращаемых при вызове функции
6.2.4. Обсуждение
6.2.5. Задача
6.3. Как использовать аннотации типов для написания понятных функций
6.3.1. Определение аннотаций типов для переменных
6.3.2. Использование аннотаций типов в определениях функций
6.3.3. Нетривиальное применение аннотаций типов в определениях функций
6.3.4. Обсуждение
6.3.5. Задача
6.4. Как повысить гибкость функции при помощи *args и **kwargs
6.4.1. Позиционные и ключевые аргументы
6.4.2. Получение переменного количества позиционных аргументов
6.4.3. Получение переменного количества ключевых аргументов
6.4.4. Обсуждение
6.4.5. Задача
6.5. Как правильно написать doc-строку для функции
6.5.1. Базовая структура doc-строки функции
6.5.2. Указание действия функции в кратком описании
6.5.3. Документирование параметров и возвращаемого значения
6.5.4. Определение возможных исключений
6.5.5. Обсуждение
6.5.6. Задача
Итоги
Глава 7. Продвинутое использование функций
7.1. Как определяются лямбда-функции
7.1.1. Создание лямбда-функций
7.1.2. Использование лямбда-функций для выполнения небольших операций
7.1.3. Потенциальные проблемы при использовании лямбда-функций
7.1.4. Обсуждение
7.1.5. Задача
7.2. К каким последствиям приводит использование функций как объектов
7.2.1. Хранение функций в контейнерах данных
7.2.2. Передача функций в аргументах функций высшего порядка
7.2.3. Функции как возвращаемые значения
7.2.4. Обсуждение
7.2.5. Задача
7.3. Как проверить быстродействие функций с декораторами
7.3.1. Декорирование функции для вывода ее быстродействия
7.3.2. Строение функции-декоратора
7.3.3. Упаковка для передачи метаданных декорируемой функции
7.3.4. Обсуждение
7.3.5. Задача
7.4. Как использовать функции-генераторы в качестве поставщика данных, эффективно расходующего память
7.4.1. Создание генератора для получения квадратов
7.4.2. Использование генераторов для экономии памяти
7.4.3. Использование генераторных выражений
7.4.4. Обсуждение
7.4.5. Задача
7.5. Как создать частичные функции для упрощения вызова функций
7.5.1. «Локализация» общих функций для упрощения вызовов
7.5.2. Создание частичной функции для локализации функции
7.5.3. Обсуждение
7.5.4. Задача
Итоги
Часть 3. Определение классов
Глава 8. Определение пользовательских классов
8.1. Как определить метод инициализации для класса
8.1.1. Загадочный self: первый параметр __init__
8.1.2. Правильный выбор аргументов в __init__
8.1.3. Назначение всех атрибутов в __init__
8.1.4. Определение атрибутов класса за пределами метода __init__
8.1.5. Обсуждение
8.1.6. Задача
8.2. Как определяются методы экземпляров, статические методы и методы классов
8.2.1. Определение методов экземпляров для выполнения операций с отдельными экземплярами
8.2.2. Определение статических методов для вспомогательной функциональности
8.2.3. Определение методов класса для обращения к атрибутам уровня класса
8.2.4. Обсуждение
8.2.5. Задача
8.3. Как организовать более точное управление доступом в классе
8.3.1. Создание защищенных методов с префиксом _
8.3.2. Создание приватных методов с префиксом __
8.3.3. Создание атрибутов, доступных только для чтения (read-only)
8.3.4. Проверка целостности данных с использованием set-метода (сеттера)
8.3.5. Обсуждение
8.3.6. Задача
8.4. Как настроить строковое представление класса
8.4.1. Переопределение __str__ для вывода содержательной информации об экземпляре
8.4.2. Переопределение __repr__ для получения информации экземпляра
8.4.3. Различия между __str__ и __repr__
8.4.4. Обсуждение
8.4.5. Задача
8.5. Для чего и как создаются надклассы и подклассы
8.5.1. Когда уместно использовать подклассы
8.5.2. Автоматическое наследование атрибутов и методов надкласса
8.5.3. Переопределение методов надкласса для реализации нестандартного поведения
8.5.4. Создание ограниченных методов в надклассе
8.5.5. Обсуждение
8.5.6. Задача
Итоги
Глава 9. Продвинутое использование классов
9.1. Как создавать перечисления
9.1.1. Перечисления без обычных классов
9.1.2. Создание класса перечислений
9.1.3. Использование перечислений
9.1.4. Определение методов для класса перечислений
9.1.5. Обсуждение
9.1.6. Задача
9.2. Как использовать классы данных для устранения шаблонного кода
9.2.1. Создание класса данных с декоратором dataclass
9.2.2. Определение значений по умолчанию для полей
9.2.3. Определение неизменяемых классов данных
9.2.4. Создание подкласса для существующего класса данных
9.2.5. Обсуждение
9.2.6. Задача
9.3. Как подготовить и обработать данные JSON
9.3.1. Структура данных JSON
9.3.2. Соответствие типов данных JSON и Python
9.3.3. Десериализация строк JSON
9.3.4. Сериализация данных Python в формат JSON
9.3.5. Обсуждение
9.3.6. Задача
9.4. Как создать отложенные атрибуты для улучшения быстродействия
9.4.1. Сценарий использования
9.4.2. Переопределение специального метода __getattr__ для реализации отложенных атрибутов
9.4.3. Реализация свойства в виде отложенного атрибута
9.4.4. Обсуждение
9.4.5. Задача
9.5. Как определить классы с четким разделением ответственности
9.5.1. Анализ класса
9.5.2. Создание дополнительных классов для разделения ответственности
9.5.3. Связывание взаимодействующих классов
9.5.4. Обсуждение
9.5.5. Задача
Итоги
Часть 4. Операции с объектами и файлами
Глава 10. Основы работы с объектами
10.1. Как проверить тип переменной для повышения гибкости кода
10.1.1. Проверка типа объекта функцией type
10.1.2. Проверка типа объекта с использованием isinstance
10.1.3. Обобщенная проверка типа объекта
10.1.4. Обсуждение
10.1.5. Задача
10.2. Как выглядит жизненный цикл объекта
10.2.1. Инстанцирование объекта
10.2.2. Активность в пространствах имен
10.2.3. Подсчет ссылок
10.2.4. Уничтожение объекта
10.2.5. Обсуждение
10.2.6. Задача
10.3. Как скопировать объект
10.3.2. Потенциальные проблемы с поверхностным копированием
10.3.3. Создание глубокой копии
10.3.4. Обсуждение
10.3.5. Задача
10.4. Как обратиться к переменной и изменить ее в другой области видимости
10.4.1. Обращение к произвольной переменной: правило LEGB при поиске имен
10.4.2. Изменение глобальной переменной в локальной области видимости
10.4.3. Изменение охватывающей переменной
10.4.4. Обсуждение
10.4.5. Задача
10.5. Что такое вызываемость и что она означает
10.5.1. Различия между классами и функциями
10.5.2. Снова о функции высшего порядка map
10.5.3. Использование вызываемых объектов в аргументе key
10.5.4. Создание декораторов в форме классов
10.5.5. Обсуждение
10.5.6. Задача
Итоги
Глава 11. Работа с файлами
11.1. Как выполнять чтение и запись в файлы через управление контекстом
11.1.1. Открытие и закрытие файлов: менеджер контекста
11.1.2. Разные способы чтения данных из файла
11.1.3. Разные способы записи данных в файл
11.1.4. Обсуждение
11.1.5. Задача
11.2. Как работать с табличными файлами данных
11.2.1. Чтение CSV-файлов
11.2.2. Чтение CSV-файла с заголовком
11.2.3. Запись данных в CSV-файл
11.2.4. Обсуждение
11.2.5. Задача
11.3. Как сохранять данные в файлах с использованием консервации ?
11.3.1. Консервация объектов для сохранения данных
11.3.2. Восстановление данных посредством расконсервации
11.3.3. Достоинства и недостатки консервации
11.3.4. Обсуждение
11.3.5. Задача
11.4. Как управлять файлами на своем компьютере
11.4.1. Создание каталогов и файлов
11.4.2. Получение списка файлов по шаблону
11.4.3. Перемещение файлов в другой каталог
11.4.4. Копирование файлов в другой каталог
11.4.5. Удаление файлов
11.4.6. Обсуждение
11.4.7. Задача
11.5. Как получить метаданные файла
11.5.1. Получение информации, относящейся к имени файла
11.5.2. Получение информации о размере файла и времени изменения
11.5.3. Обсуждение
11.5.4. Задача
Итоги
Часть 5. Защита кодовой базы
Глава 12. Ведение журнала и обработка исключений
12.1. Как следить за работой программы посредством логирования
12.1.1. Создание регистратора для логирования событий приложения
12.1.2. Использование файлов для хранения событий приложения
12.1.3. Добавление нескольких обработчиков
12.1.4. Обсуждение
12.1.5. Задача
12.2. Как правильно хранить журнальные записи
12.2.1. Классификация событий приложения по уровням
12.2.2. Назначение уровня для обработчика
12.2.3. Форматы для обработчика
12.2.4. Обсуждение
12.2.5. Задача
12.3. Как обрабатывать исключения
12.3.1. Обработка исключений в блоке try…except…
12.3.2. Указание исключений в секции except
12.3.3. Обработка нескольких исключений
12.3.4. Вывод расширенной информации об исключении
12.3.5. Обсуждение
12.3.6. Задача
12.4. Как использовать секции else и finally при обработке исключений
12.4.1. Использование else для продолжения логики секции try
12.4.2. Завершение обработки исключений в секции finally
12.4.3. Обсуждение
12.4.4. Задача
12.5. Как выдавать содержательные исключения с пользовательскими классами исключений
12.5.1. Выдача исключений с пользовательским сообщением
12.5.2. Встроенные классы исключений предпочтительны
12.5.3. Определение пользовательских классов исключений
12.5.4. Обсуждение
12.5.5. Задача
Итоги
Глава 13. Отладка и тестирование
13.1. Как выявить проблемы с помощью трассировки
13.1.1. Как генерируется трассировка
13.1.2. Анализ трассировки при выполнении кода в консоли
13.1.3. Анализ трассировки при выполнении скриптов
13.1.4. Последний вызов в трассировке
13.1.5. Обсуждение
13.1.6. Задача
13.2. Как провести отладку программы в интерактивном режиме
13.2.1. Активизация отладчика в точке останова
13.2.2. Построчное выполнение кода
13.2.3. Выполнение с заходом в функции
13.2.4. Анализ важных переменных
13.2.5. Обсуждение
13.2.6. Задача
13.3. Как тестировать функции автоматически
13.3.1. Принципы тестирования функций
13.3.2. Создание подкласса TestCase для тестирования функций
13.3.3. Подготовка теста
13.3.4. Обсуждение
13.3.5. Задача
13.4. Как провести автоматическое тестирование класса
13.4.1. Создание подкласса TestCase для тестирования класса
13.4.2. Реакция на сбои в тестах
13.4.3. Обсуждение
13.4.4. Задача
Итоги
Часть 6. Построение веб-приложения
Глава 14. Завершение реального проекта
14.1. Как использовать для проекта виртуальную среду
14.1.1. Причины использования виртуальных сред
14.1.2. Создание виртуальной среды для каждого проекта
14.1.3. Установка пакетов в виртуальной среде
14.1.4. Использование виртуальных сред в Visual Studio Code
14.1.5. Обсуждение
14.1.6. Задача
14.2. Как построить модели данных для проекта
14.2.1. Выявление бизнес-целей
14.2.2. Создание вспомогательных классов и функций
14.2.3. Создание класса Task
14.2.4. Обсуждение
14.2.5. Задача
14.3. Как использовать в приложении базу данных SQLite
14.3.1. Создание базы данных
14.3.2. Чтение записей из базы данных
14.3.3. Сохранение записей в базе данных
14.3.4. Обновление записи в базе данных
14.3.5. Удаление записи из базы данных
14.3.6. Обсуждение
14.3.7. Задача
14.4. Как построить веб-приложение для взаимодействия с клиентом (фронтэнд)
14.4.1. Основные возможности streamlit
14.4.2. Интерфейс приложения
14.4.3. Отслеживание действий пользователя в течение сеанса
14.4.4. Настройка боковой панели
14.4.5. Вывод задач
14.4.6. Вывод подробной информации о задаче
14.4.7. Создание новой задачи
14.4.8. Организация проекта
14.4.9. Запуск приложения
14.4.10. Обсуждение
14.4.11. Задача
Итоги
Решения задач