Книга «Простой Python. Современный стиль программирования. 2-е изд.»
Привет, Хаброжители! «Простой Python» познакомит вас с одним из самых популярных языков программирования. Книга идеально подойдет как начинающим, так и опытным программистам, желающим добавить Python к списку освоенных языков. Любому программисту нужно знать не только язык, но и его возможности.
Вы начнете с основ Python и его стандартной библиотеки. Узнаете, как находить, загружать, устанавливать и использовать сторонние пакеты. Изучите лучшие практики тестирования, отладки, повторного использования кода и получите полезные советы по разработке. Примеры кода и упражнения помогут в создании приложений для различных целей.
Что изменилось? — Абсолютно новые 100 страниц (там есть котики). — Глав стало большое, но они стали короче. — Появилась глава, посвященная типам данных, переменным и именам. — Добавился рассказ о новых возможностях Python, таких как f-строки. — Обновилась информация о сторонних библиотеках. — Новые примеры кода. — Дан обзор библиотеки asyncio. — Рассмотрен новый стек технологий: контейнеры, облачные технологии, data science и машинное обучение. Что осталось неизменным? — Примеры c утками и плохими стихотворениями. Они навечно с нами.
Вот краткое содержание всех глав и приложений и обзор новых терминов, с которыми вы там встретитесь.
Глава 1. «Python: с чем его едят». Компьютерные программы не так уж и отличаются от других инструкций, с которыми вы сталкиваетесь каждый день. Мы рассмотрим небольшие программы, написанные на Python. Они продемонстрируют синтаксис языка, его возможности и способы применения в реальном мире. Вы узнаете, как запустить программу внутри интерактивного интерпретатора (оболочки), а также из текстового файла, сохраненного на вашем компьютере.
Глава 2. «Данные: типы, значения, переменные и имена». В компьютерных языках используются данные и инструкции. Компьютер по-разному хранит и обрабатывает разные типы данных. Их значения или можно изменять (такие типы называются изменяемыми), или нельзя (неизменяемые типы). В программе, написанной на Python, данные могут быть представлены как литералами (числами вроде 78 или текстовыми строками вроде «waffle»), так и именованными переменными. В отличие от многих других языков программирования Python относится к переменным как к именам, и это влечет за собой некоторые важные последствия.
Глава 3. «Числа». В этой главе показываются простейшие типы данных, применяемые в языке программирования Python: булевы переменные, целые числа и числа с плавающей точкой. Вы также изучите простейшую математику. В примерах этой главы интерактивный интерпретатор Python используется как калькулятор.
Глава 4. «Выбираем с помощью оператора if». С существительными (типами данных) и с глаголами (программными структурами) мы поработаем в нескольких главах. Код, написанный на Python, обычно выполняется по одной строке за раз: от начала программы до ее конца. Структура if позволяет запускать разные строки кода исходя из результата сравнения определенных данных.
Глава 5. «Текстовые строки». Здесь мы обратимся к существительным и миру текстовых строк. Вы научитесь создавать, объединять, изменять и получать строки, а также выводить их на экран.
Глава 6. «Создаем циклы с помощью ключевых слов while и for». Снова глаголы. Вы научитесь создавать цикл двумя способами — с помощью for и с помощью while, а также узнаете, что такое итераторы — одно из основных понятий Python.
Глава 7. «Кортежи и списки». Пришло время рассмотреть первые структуры данных более высокого уровня: списки и кортежи. Они представляют собой последовательности значений, которыми вы будете пользоваться как конструктором Lego для того, чтобы создавать более сложные структуры. Вы научитесь проходить по ним с помощью итераторов, а также быстро создавать списки с помощью списковых включений.
Глава 8. «Словари и множества». Словари и множества позволяют сохранять данные не по позиции, а по их значению. Вы увидите, насколько это удобно, — данная особенность Python станет одной из ваших любимых.
Глава 9. «Функции». Соединяйте структуры данных из предыдущих глав со структурами кода, чтобы выполнять сравнение, выборку или повторение операций. Упаковывайте код в функции и обрабатывайте ошибки с помощью исключений.
Глава 10. «Ой-ой-ой: объекты и классы». Слово «объект» недостаточно конкретно, но имеет большое значение во многих компьютерных языках, в том числе и в Python. Если вы уже занимались объектно-ориентированным программированием на других языках, то в сравнении с ними Python покажется вам более простым. В этой главе объясняется, когда следует использовать объекты и классы, а когда лучше выбрать другой путь.
Глава 11. «Модули, пакеты и программы». Вы узнаете, как перейти к более крупным структурам кода — модулям, пакетам и программам, а также где можно разместить код и данные, как ввести и вывести данные, обработать различные параметры, просмотреть стандартную библиотеку Python и то, что находится вне ее.
Глава 12. «Обрабатываем данные». Вы научитесь профессионально обрабатывать данные и управлять ими. Эта глава полностью посвящена текстовым и двоичным данным, особенностям использования символов стандарта Unicode, а также поиску текста с помощью регулярных выражений. Вы познакомитесь с типами данных byte и bytearray — соперниками типа string, в которых содержатся необработанные бинарные значения вместо текстовых символов.
Глава 13. «Календари и часы». С датой и временем работать бывает непросто. Здесь мы рассмотрим распространенные проблемы и способы их решения.
Глава 14. «Файлы и каталоги». Простые хранилища данных используют файлы и каталоги. В этой главе речь пойдет о создании и использовании файлов и каталогов.
Глава 15. «Данные во времени: процессы и конкурентность». Это первая глава, в которой мы приступаем к изучению системы. Начнем с данных во времени — вы научитесь использовать программы, процессы и потоки для того, чтобы выполнять больше работы за один промежуток времени (конкурентность). Среди прочего будут упомянуты последние добавления в async (более подробно они рассматриваются в приложении В).
Глава 16. «Данные в коробке: надежные хранилища». Данные могут храниться в простых файлах и каталогах внутри файловых систем и структурироваться с помощью распространенных форматов, таких как CSV, JSON и XML. Однако по мере того, как объем и сложность данных будут расти, вам, возможно, придется использовать базы данных — как традиционные реляционные, так и современные базы данных NoSQL.
Глава 17. «Данные в пространстве: сети». Отправляйте ваш код и данные через пространство по сетям с помощью служб, протоколов и API. В качестве примеров рассматриваются как низкоуровневые сокеты, библиотеки обмена сообщениями и системы массового обслуживания, так и развертывание в облачных системах.
Глава 18. «Распутываем Всемирную паутину». Всемирной сети посвящена отдельная глава, в которой рассматриваются клиенты, серверы, извлечение данных, API и фреймворки. Вы научитесь искать сайты и извлекать из них данные, а затем разработаете реальный сайт, используя параметры запросов и шаблоны.
Глава 19. «Быть питонщиком». В этой главе содержатся советы для программистов, пишущих на Python: вы получите рекомендации по установке (с помощью pip и virtualenv), использованию IDE, тестированию, отладке, журналированию, контролю исходного кода и документации. Узнаете также, как найти и установить полезные пакеты сторонних разработчиков, как упаковать свой код для повторного использования и где получить более подробную информацию.
Глава 20. «Пи-Арт». При помощи языка программирования Python можно создавать произведения искусства: в графике, музыке, анимации и играх.
Глава 21. «За работой». У Python есть специальные приложения для бизнеса: визуализация данных (графики, графы и карты), безопасность и регулирование.
Глава 22. «Python в науке». За последние несколько лет Python стал главным языком науки, он используется в математике, статистике, физике, биологии и медицине. Его сильные стороны — наука о данных и машинное обучение. В этой главе демонстрируются возможности таких инструментов, как NumPy, SciPy и Pandas.
Приложение А. «Аппаратное и программное обеспечение для начинающих программистов». Если вы новичок в мире программирования, из этого приложения вы можете узнать, как на самом деле работает аппаратное и программное обеспечение и что означают некоторые термины, с которыми в дальнейшем вам придется сталкиваться.
Приложение Б. «Установка Python 3». Если вы еще не установили Python 3 на свой компьютер, в этом приложении вы найдете информацию о том, как это сделать независимо от того, какая операционная система у вас установлена: Windows, Mac OS/X, Linux или другой вариант Unix.
Приложение В. «Нечто совершенно иное: async». В разных релизах Python добавляется функциональность для работы с асинхронностью — разобраться с ней может быть сложно. Я упоминаю о ней в тех главах, в которых заходит речь об асинхронности, но в этом приложении рассматриваю тему более подробно.
Приложение Г. «Ответы к упражнениям». Здесь содержатся ответы на упражнения, приведенные в конце каждой главы. Не подглядывайте туда, пока не попробуете решить задачи самостоятельно, в противном случае вы рискуете превратиться в козленочка.
Приложение Д. «Вспомогательные таблицы». В этом приложении содержатся справочные данные.
Версии Python
Языки программирования со временем изменяются — разработчики добавляют в них новые возможности и исправляют ошибки. Примеры этой книги написаны и протестированы для версии Python 3.7. Версия 3.7 является наиболее современной на момент выхода этой книги, и о самых значимых нововведениях я расскажу. Версия 3.8 вышла в конце 2019 года — я рассмотрю самую ожидаемую функциональность (оригинальное издание выпущено до выхода версии 3.8; текущая версия — 3.8.2) Узнать, что и когда было добавлено в язык программирования Python, можно, посетив страницу docs.python.org/3/whatsnew: там представлена техническая информация. Она, скорее всего, покажется трудной для понимания, если вы только начинаете изучать Python, но может пригодиться в будущем, если вам нужно будет писать программы для компьютеров, на которых установлены другие версии Python.
Изменчивость
Изменчивость одна лишь неизменна.
Перси Шелли
Тип также определяет, можно ли значение, которое хранится в ящике, изменить — тогда это будет изменяемое значение, или оно константно — неизменяемое значение. Неизменяемый объект как будто находится в закрытом ящике с прозрачными стенками (см. рис. 2.1): увидеть значение вы можете, но не в силах его изменить. По той же аналогии изменяемый объект похож на коробку с крышкой: вы можете не только увидеть хранящееся там значение, но и изменить его, не изменив его тип.
Python является строго типизированным языком, а это означает, что тип объекта не изменяется, даже если его значение изменяемо (рис. 2.2).
Значения-литералы
Существует два вида определения данных в Python:
- как литералы;
- как переменные.
В следующих главах вы увидите, как указываются значения-литералы для разных типов данных — целые числа представляют собой последовательность цифр, дробные числа содержат десятичную точку, текстовые строки заключаются в кавычки и т. д. Но в примерах этой главы — чтобы избежать излишней сложности — мы будем использовать лишь короткие целые числа из десятичной системы счисления и один-два списка. Десятичные целые числа такие же, как числа в математике: они представляют собой последовательность цифр от 0 до 9. В главе 3 мы рассмотрим дополнительные детали работы с целыми числами (например, знаки и недесятичные системы счисления).
Переменные
Вот мы и добрались до ключевого понятия языков программирования.
Python, как и большинство других компьютерных языков, позволяет вам определять переменные — имена для значений в памяти вашего компьютера, которые вы далее будете использовать в программе.
Имена переменных в Python отвечают определенным правилам.
- Они могут содержать только следующие символы:
- буквы в нижнем регистре (от a до z);
- буквы в верхнем регистре (от A до Z);
- цифры (от 0 до 9);
- нижнее подчеркивание (_).
- Они чувствительны к регистру: thing, Thing и THING — это разные имена.
- Они должны начинаться с буквы или нижнего подчеркивания, но не с цифры.
- Python особо обрабатывает имена, которые начинаются с нижнего подчеркивания (об этом вы сможете прочитать в главе 9).
- Они не могут совпадать с зарезервированными словами Python (их также называют ключевыми).
Перед вами список зарезервированных слов:
False await else import pass
None break except in raise
True class finally is return
and continue for lambda try
as def from nonlocal while
assert del global not with
async elif if or yield
Внутри программы Python увидеть список зарезервированных слов можно с помощью команд:
>>> help("keywords")
или:
>>> import keyword
>>> keyword.kwlist
Корректными являются такие имена:
- a;
- a1;
- a_b_c___95;
- _abc;
- _1a.
А следующие имена некорректны:
- 1;
- 1a;
- 1_;
- name!;
- another-name.
Присваивание
В Python символ = применяется для присваивания значения переменной.
В школе нас учили, что символ = означает «равно». Почему же во многих языках программирования, включая Python, этот символ используется для обозначения присваивания? Одна из причин — на стандартной клавиатуре отсутствуют логические альтернативы вроде стрелки влево, а символ = не слишком сбивает с толку. Кроме того, в компьютерных программах присваивание используется чаще, чем проверка на равенство.
Программы непохожи на алгебру. В школе мы имели дело с подобными уравнениями:
y = x + 12
Решить уравнение можно, подставив значение для x. Если вы зададите для x значение 5, то, поскольку 5 + 12 равно 17, значение y будет равно 17. Подставьте значение 6, и y будет равен 18. И так далее.
Строки компьютерной программы могут выглядеть как уравнения, но означают они при этом нечто иное. В Python и других компьютерных языках x и y являются переменными. Python знает, что цифра или простая последовательность цифр вроде 12 или 5 является числовым литералом. Рассмотрим небольшую программу на Python, которая схожа с этим уравнением, — она выводит на экран значение y:
>>> x = 5
>>> y = x + 12
>>> y
17
Здесь мы видим большое различие между математикой и программами: в математике знак = означает равенство обеих сторон, а в программировании он означает присваивание: переменной слева мы присваиваем значение с правой стороны.
В программировании также принято, что все находящееся справа от знака = должно иметь значение (это называется инициализацией). Справа вы можете увидеть значение-литерал, переменную, которой было присвоено значение, или их комбинацию. Python знает, что 5 и 12 — это числовые литералы. В первой строке целочисленное значение 5 присваивается переменной х. Теперь мы можем использовать переменную х в следующей строке. Когда Python читает выражение y = x + 12, он делает следующее:
- видит знак = в середине;
- понимает, что это оператор присваивания;
- вычисляет значение с правой стороны (получает значение объекта, на который ссылается переменная х, и добавляет его к 12);
- присваивает этот результат переменной слева — y.
Теперь, введя имя у в интерактивном интерпретаторе, можно увидеть его новое значение.
Если вы начнете программу со строки y = x + 12, Python сгенерирует исключение (ошибку), поскольку переменная х еще не имеет значения:
>>> y = x + 12
Traceback (most recent call last):
File "", line 1, in
NameError: name 'x' is not defined
Более подробно об исключениях можно прочитать в главе 9. На компьютерном языке мы скажем, что переменная х не была инициализирована.
В алгебре вы могли бы сделать все наоборот — присвоить значение у, чтобы подсчитать значение х. Для того, чтобы сделать это в Python, вам нужно получить значения-литералы и инициализированные переменные с правой стороны оператора присваивания до того, как присвоить значение переменной х:
>>> y = 5
>>> x = 12 - y
>>> x
7
Переменные — это имена, а не локации
Пришло время сделать важное утверждение о переменных в Python: переменные — всего лишь имена, и в этом заключается отличие Python от других языков программирования. Об этом важно помнить, особенно при работе с такими изменяемыми объектами, как списки. Операция присваивания не копирует значение, а только лишь прикрепляет имя к объекту, содержащему нужные данные. Имя — это ссылка на объект, а не сам объект. Можно представить, что имя — это этикетка, приклеенная на коробку с объектом, которая размещается где-то в памяти компьютера (рис. 2.3).
В других языках программирования переменные сами по себе имеют тип и привязываются к локации в памяти. Вы можете изменить значение в этой локации, но оно должно быть того же типа. Именно поэтому в статических языках нужно объявлять тип переменных. В Python этого делать не требуется, поскольку имя может ссылаться на все что угодно: значение и тип мы получаем, идя по цепочке к самому объекту с данными. Такой подход экономит время, но при этом имеет свои недостатки.
- Вы можете неверно написать имя переменной и получить исключение, поскольку она ни на что не ссылается, Python не выполняет такую проверку автоматически в отличие от статических языков. В главе 19 показывается способ предварительной проверки переменных.
- В сравнении с такими языками, как С, у Python скорость работы ниже. Ведь он заставляет компьютер выполнять больше работы, для того чтобы вам не пришлось выполнять ее самостоятельно.
Попробуйте сделать следующее с помощью интерактивного интерпретатора (рис. 2.4).
- Как и раньше, присвойте значение 7 имени a. Это создаст объект-«ящик», содержащий целочисленное значение 7.
- Выведите на экран а.
- Присвойте имя, а переменной b, заставив b прикрепиться к объекту-«ящику», содержащему значение 7.
- Выведите b.
>>> a = 7
>>> print(a)
7
>>> b = a
>>> print(b)
7
В Python, если нужно узнать тип какого-либо объекта (переменной или значения), можно использовать конструкцию type (объект). type () — одна из встроенных в Python функций. Чтобы проверить, указывает ли переменная на объект определенного типа, используйте конструкцию isinstance (type):
>>> type(7)
>>> type(7) == int
True
>>> isinstance(7, int)
True
Когда я упоминаю функцию, то после ее имени размещаю круглые скобки (()) и таким образом подчеркиваю, что это именно функция, а не имя переменной или что-либо еще.
Попробуем проделать это с разными значениями (58, 99.9, 'abc') и переменными (a, b):
>>> a = 7
>>> b = a
>>> type(a)
>>> type(b)
>>> type(58)
>>> type(99.9)
>>> type('abc')
Класс — это определение объекта (классы детально рассматриваются в главе 10). В Python значения терминов «класс» и «тип» примерно одинаковы.
Как вы могли заметить, при упоминании имени переменной Python ищет объект, на который она ссылается. Неявно Python выполняет большое количество действий и часто создает временные объекты, которые будут удалены спустя одну-две строки.
Снова рассмотрим пример, показанный ранее:
>>> y = 5
>>> x = 12 - y
>>> x
7
В этом фрагменте кода Python сделал следующее:
- создал целочисленный объект со значением 5;
- создал переменную у, которая указывает на этот объект;
- нарастил счетчик ссылок для объекта, содержащего значение 5;
- создал еще один целочисленный объект со значением 12;
- вычел значение объекта, на который указывает переменная у (5), из значения 12, содержащегося в анонимном объекте;
- присвоил результат (7) новому (пока еще безымянному) целочисленному объекту;
- заставил переменную х указывать на этот новый объект;
- нарастил счетчик ссылок для объекта, на который указывает переменная х;
- нашел значение объекта, на который ссылается переменная х (7), и вывел его на экран.
Когда количество ссылок на объект становится равным нулю, это означает, что ни одно имя на него больше не ссылается, поэтому хранить такой объект нет необходимости. В Python имеется сборщик мусора, который позволяет повторно использовать память, занятую уже ненужными на данный момент объектами: представьте себе, будто кто-то следит за этими полками с памятью и забирает ненужные коробки на переработку.
В нашем случае объекты со значениями 5, 12 и 7, а также переменные x и y больше не нужны. Сборщик мусора Python может или отправить их в небесный рай для объектов, или сохранить, исходя из соображений производительности, так как небольшие целые числа используются довольно часто.
Присваивание нескольким именам
Вы можете присвоить значение сразу нескольким переменным одновременно:
>>> two = deux = zwei = 2
>>> two
2
>>> deux
2
>>> zwei
2
Переназначение имени
Поскольку имена указывают на объекты, если изменить значение, присвоенное имени, оно начнет указывать на другой объект. Счетчик ссылок старого объекта уменьшится на 1, а счетчик ссылок нового увеличится на ту же величину.
Копирование
Как вы видели на рис. 2.4, присваивание существующей переменной, а новой переменной b заставит b указывать на тот же объект, что и a. Если вы выберете этикетку a или b и обратитесь к объекту, на который они указывают, вы получите одинаковый результат.
Если объект неизменяем (например, целое число), его значение нельзя изменить, поэтому по умолчанию оба имени являются доступными только для чтения. Попробуйте выполнить следующий код:
>>> x = 5
>>> x
5
>>> y = x
>>> y
5
>>> x = 29
>>> x
29
>>> y
5
Когда мы присваиваем переменную x переменной y, переменная y начинает указывать на целочисленный объект со значением 5, на который также указывает и переменная x. Далее мы изменяем переменную x так, чтобы она указывала на целочисленный объект со значением 29. Объект со значением 5, на который все еще указывает переменная y, не изменился.
В случае, когда оба имени указывают на изменяемый объект, вы можете изменить значение объекта с помощью любого имени. Если вы этого еще не знали, такая особенность может вас удивить.
Список представляет собой изменяемый массив значений (в главе 7 этот тип данных описывается более подробно). В нашем примере a и b указывают на список, содержащий три целочисленных объекта:
>>> a = [2, 4, 6]
>>> b = a
>>> a
[2, 4, 6]
>>> b
[2, 4, 6]
Эти элементы списка (a[0], a[1] и a[2]) сами по себе являются именами, указывающими на целочисленные объекты со значениями 2, 4 и 6. Список хранит элементы в заданном порядке.
Теперь давайте изменим первый элемент списка с помощью имени, а и убедимся, что список b также изменился:
>>> a[0] = 99
>>> a
[99, 4, 6]
>>> b
[99, 4, 6]
Когда первый элемент списка изменяется, он больше не указывает на объект со значением 2. Теперь он указывает на объект со значением 99. Список все еще имеет тип list, но его значения (элементы списка и их порядок) можно изменить.
Выбираем хорошее имя переменной
Он говорил правильные вещи, но называл их неверными именами.
Элизабет Барретт Браунинг
Удивительно, но выбор соответствующих имен для переменных очень важен. Во многих примерах кода, которые мы успели рассмотреть, я использовал простейшие имена вроде a и x. В реальных программах вам будет нужно отслеживать гораздо больше переменных одновременно и придется балансировать между краткостью и понятностью. Например, имя num_loons можно напечатать быстрее, чем number_of_loons или gaviidae_inventory, однако они более понятны, чем имя n.
» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок
Для Хаброжителей скидка 25% по купону — Python
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.