Python
Python
Introducing Python
Modern Computing in Simple Packages
Bill Lubanovic
Билл Любанович
2021
ȻȻɄ
ɍȾɄ
Ʌ
ɅɸɛɚɧɨɜɢɱȻɢɥɥ
Ʌ ɉɪɨɫɬɨɣ3\WKRQɋɨɜɪɟɦɟɧɧɵɣɫɬɢɥɶɩɪɨɝɪɚɦɦɢɪɨɜɚɧɢɹɟɢɡɞ²ɋɉɛɉɢɬɟɪ
²ɫɢɥ² ɋɟɪɢɹ©Ȼɟɫɬɫɟɥɥɟɪɵ2¶5HLOO\ª
,6%1
©ɉɪɨɫɬɨɣ3\WKRQªɩɨɡɧɚɤɨɦɢɬɜɚɫɫɨɞɧɢɦɢɡɫɚɦɵɯɩɨɩɭɥɹɪɧɵɯɹɡɵɤɨɜɩɪɨɝɪɚɦɦɢɪɨɜɚɧɢɹɄɧɢɝɚ
ɢɞɟɚɥɶɧɨɩɨɞɨɣɞɟɬɤɚɤɧɚɱɢɧɚɸɳɢɦɬɚɤɢɨɩɵɬɧɵɦɩɪɨɝɪɚɦɦɢɫɬɚɦɠɟɥɚɸɳɢɦɞɨɛɚɜɢɬɶ3\WKRQ
ɤɫɩɢɫɤɭɨɫɜɨɟɧɧɵɯɹɡɵɤɨɜ
Ʌɸɛɨɦɭɩɪɨɝɪɚɦɦɢɫɬɭɧɭɠɧɨɡɧɚɬɶɧɟɬɨɥɶɤɨɹɡɵɤɧɨɢɟɝɨɜɨɡɦɨɠɧɨɫɬɢȼɵɧɚɱɧɟɬɟɫɨɫɧɨɜ
3\WKRQɢɟɝɨɫɬɚɧɞɚɪɬɧɨɣɛɢɛɥɢɨɬɟɤɢɍɡɧɚɟɬɟɤɚɤɧɚɯɨɞɢɬɶɡɚɝɪɭɠɚɬɶɭɫɬɚɧɚɜɥɢɜɚɬɶɢɢɫɩɨɥɶɡɨɜɚɬɶ
ɫɬɨɪɨɧɧɢɟɩɚɤɟɬɵɂɡɭɱɢɬɟɥɭɱɲɢɟɩɪɚɤɬɢɤɢɬɟɫɬɢɪɨɜɚɧɢɹɨɬɥɚɞɤɢɩɨɜɬɨɪɧɨɝɨɢɫɩɨɥɶɡɨɜɚɧɢɹɤɨɞɚ
ɢɩɨɥɭɱɢɬɟɩɨɥɟɡɧɵɟɫɨɜɟɬɵɩɨɪɚɡɪɚɛɨɬɤɟɉɪɢɦɟɪɵɤɨɞɚɢɭɩɪɚɠɧɟɧɢɹɩɨɦɨɝɭɬɜɫɨɡɞɚɧɢɢɩɪɢɥɨ-
ɠɟɧɢɣɞɥɹɪɚɡɥɢɱɧɵɯɰɟɥɟɣ
16+ ȼɫɨɨɬɜɟɬɫɬɜɢɢɫɎɟɞɟɪɚɥɶɧɵɦɡɚɤɨɧɨɦɨɬɞɟɤɚɛɪɹɝʋɎɁ
ȻȻɄ
ɍȾɄ
ɉɪɚɜɚɧɚɢɡɞɚɧɢɟɩɨɥɭɱɟɧɵɩɨɫɨɝɥɚɲɟɧɢɸɫ2¶5HLOO\ȼɫɟɩɪɚɜɚɡɚɳɢɳɟɧɵɇɢɤɚɤɚɹɱɚɫɬɶɞɚɧɧɨɣɤɧɢɝɢɧɟɦɨɠɟɬ
ɛɵɬɶɜɨɫɩɪɨɢɡɜɟɞɟɧɚɜɤɚɤɨɣɛɵɬɨɧɢɛɵɥɨɮɨɪɦɟɛɟɡɩɢɫɶɦɟɧɧɨɝɨɪɚɡɪɟɲɟɧɢɹɜɥɚɞɟɥɶɰɟɜɚɜɬɨɪɫɤɢɯɩɪɚɜ
ɂɧɮɨɪɦɚɰɢɹ ɫɨɞɟɪɠɚɳɚɹɫɹ ɜ ɞɚɧɧɨɣ ɤɧɢɝɟ ɩɨɥɭɱɟɧɚ ɢɡ ɢɫɬɨɱɧɢɤɨɜ ɪɚɫɫɦɚɬɪɢɜɚɟɦɵɯ ɢɡɞɚɬɟɥɶɫɬɜɨɦ ɤɚɤ ɧɚ
ɞɟɠɧɵɟ Ɍɟɦ ɧɟ ɦɟɧɟɟ ɢɦɟɹ ɜ ɜɢɞɭ ɜɨɡɦɨɠɧɵɟ ɱɟɥɨɜɟɱɟɫɤɢɟ ɢɥɢ ɬɟɯɧɢɱɟɫɤɢɟ ɨɲɢɛɤɢ ɢɡɞɚɬɟɥɶɫɬɜɨ ɧɟ ɦɨɠɟɬ
ɝɚɪɚɧɬɢɪɨɜɚɬɶɚɛɫɨɥɸɬɧɭɸɬɨɱɧɨɫɬɶɢɩɨɥɧɨɬɭɩɪɢɜɨɞɢɦɵɯɫɜɟɞɟɧɢɣɢɧɟɧɟɫɟɬɨɬɜɟɬɫɬɜɟɧɧɨɫɬɢɡɚɜɨɡɦɨɠɧɵɟ
ɨɲɢɛɤɢɫɜɹɡɚɧɧɵɟɫɢɫɩɨɥɶɡɨɜɚɧɢɟɦɤɧɢɝɢɂɡɞɚɬɟɥɶɫɬɜɨɧɟɧɟɫɟɬɨɬɜɟɬɫɬɜɟɧɧɨɫɬɢɡɚɞɨɫɬɭɩɧɨɫɬɶɦɚɬɟɪɢɚɥɨɜ
ɫɫɵɥɤɢɧɚɤɨɬɨɪɵɟɜɵɦɨɠɟɬɟɧɚɣɬɢɜɷɬɨɣɤɧɢɝɟɇɚɦɨɦɟɧɬɩɨɞɝɨɬɨɜɤɢɤɧɢɝɢɤɢɡɞɚɧɢɸɜɫɟɫɫɵɥɤɢɧɚɢɧɬɟɪɧɟɬ
ɪɟɫɭɪɫɵɛɵɥɢɞɟɣɫɬɜɭɸɳɢɦɢ
,6%1ɚɧɝɥ $XWKRUL]HG5XVVLDQWUDQVODWLRQRIWKH(QJOLVKHGLWLRQRI,QWURGXFLQJ3\WKRQ(
,6%1%LOO/XEDQRYLF
7KLVWUDQVODWLRQLVSXEOLVKHGDQGVROGE\SHUPLVVLRQRI2¶5HLOO\0HGLD,QF
ZKLFKRZQVRUFRQWUROVDOOULJKWVWRSXEOLVKDQGVHOOWKHVDPH
,6%1 ɉɟɪɟɜɨɞɧɚɪɭɫɫɤɢɣɹɡɵɤɈɈɈɂɡɞɚɬɟɥɶɫɬɜɨ©ɉɢɬɟɪª
ɂɡɞɚɧɢɟɧɚɪɭɫɫɤɨɦɹɡɵɤɟɨɮɨɪɦɥɟɧɢɟɈɈɈɂɡɞɚɬɟɥɶɫɬɜɨ©ɉɢɬɟɪª
ɋɟɪɢɹ©Ȼɟɫɬɫɟɥɥɟɪɵ2¶5HLOO\ª
ƒƸƨƺƲƶƭƹƶƬƭƸƮƨƵưƭ
Введение .....................................................................................................................................................26
Благодарности ..........................................................................................................................................33
Об авторе....................................................................................................................................................34
ǿȈșȚȤ,ǶșȕȖȊȣ3\WKRQ
Глава 1. Python: с чем его едят ...........................................................................................................36
Глава 2. Данные: типы, значения, переменные и имена ............................................................55
Глава 3. Числа ..........................................................................................................................................67
Глава 4. Выбираем с помощью оператора if ..................................................................................82
Глава 5. Текстовые строки ...................................................................................................................91
Глава 6. Создаем циклы с помощью ключевых слов while и for.......................................... 113
Глава 7. Кортежи и списки ............................................................................................................... 119
Глава 8. Словари и множества ........................................................................................................ 144
Глава 9. Функции ................................................................................................................................ 166
Глава 10. Ой-ой-ой: объекты и классы ......................................................................................... 194
Глава 11. Модули, пакеты и программы ...................................................................................... 224
ǿȈșȚȤ,,3\WKRQȕȈȗȘȈȒȚȐȒȍ
Глава 12. Обрабатываем данные..................................................................................................... 242
Глава 13. Календари и часы.............................................................................................................. 271
Глава 14. Файлы и каталоги............................................................................................................. 283
Глава 15. Данные во времени: процессы и конкурентность ................................................. 302
DzȘȈȚȒȖȍșȖȌȍȘȎȈȕȐȍ
Введение .....................................................................................................................................................26
Для кого эта книга ............................................................................................................................27
Что нового во втором издании .....................................................................................................27
Структура книги ...............................................................................................................................28
Версии Python ...................................................................................................................................31
Условные обозначения....................................................................................................................31
Использование примеров кода ....................................................................................................32
От издательства.................................................................................................................................32
Благодарности ..........................................................................................................................................33
Об авторе....................................................................................................................................................34
ǿȈșȚȤ,ǶșȕȖȊȣ3\WKRQ
Глава 1. Python: с чем его едят ...........................................................................................................36
Тайны ....................................................................................................................................................36
Маленькие программы ...................................................................................................................38
Более объемная программа ...........................................................................................................40
Python в реальном мире .................................................................................................................44
Python против языка с планеты Х ..............................................................................................45
Почему же Python? ..........................................................................................................................48
Когда не стоит использовать Python .........................................................................................49
Python 2 против Python 3 ..............................................................................................................50
Установка Python..............................................................................................................................51
Запуск Python ....................................................................................................................................51
Интерактивный интерпретатор ............................................................................................51
Файлы Python .............................................................................................................................52
Что дальше? .................................................................................................................................53
ǶȋȓȈȊȓȍȕȐȍ
Момент просветления.....................................................................................................................53
Читайте далее.....................................................................................................................................54
Упражнения ........................................................................................................................................54
ǿȈșȚȤ,,3\WKRQȕȈȗȘȈȒȚȐȒȍ
Глава 12. Обрабатываем данные..................................................................................................... 242
Текстовые строки: Unicode......................................................................................................... 243
Строки формата Unicode в Python 3 ................................................................................ 244
Кодирование и декодирование с помощью кодировки UTF-8 ............................... 246
Кодирование ............................................................................................................................. 247
Декодирование ......................................................................................................................... 249
Сущности HTML .................................................................................................................... 250
Нормализация .......................................................................................................................... 251
Подробная информация ....................................................................................................... 252
Текстовые строки: регулярные выражения .......................................................................... 253
Ищем точное начальное совпадение с помощью функции match()...................... 254
Ищем первое совпадение с помощью функции search()........................................... 255
Ищем все совпадения, используя функцию findall() ................................................. 255
Разбиваем совпадения с помощью функции split().................................................... 256
Заменяем совпадения с помощью функции sub() ....................................................... 256
Шаблоны: специальные символы ..................................................................................... 256
Шаблоны: использование спецификаторов .................................................................. 258
Шаблоны: указываем способ вывода совпадения ....................................................... 261
ǶȋȓȈȊȓȍȕȐȍ
Каталоги............................................................................................................................................ 295
Создаем каталог с помощью функции mkdir()............................................................. 295
Удаляем каталог, используя функцию rmdir() ............................................................. 295
Выводим на экран содержимое каталога с помощью функции listdir() .............. 295
Изменяем текущий каталог с помощью функции chdir() ........................................ 296
Перечисляем совпадающие файлы, используя функцию glob()............................ 296
Pathname ........................................................................................................................................... 297
Получаем путь с помощью функции abspath() ............................................................ 298
Получаем символьную ссылку с помощью функции realpath() ............................ 298
Построение пути с помощью функции [Link]() ................................................. 298
Модуль pathlib ......................................................................................................................... 298
BytesIO и StringIO ........................................................................................................................ 299
Читайте далее.................................................................................................................................. 301
Упражнения ..................................................................................................................................... 301
Глава 15. Данные во времени: процессы и конкурентность ................................................. 302
Программы и процессы ............................................................................................................... 302
Создаем процесс с помощью модуля subprocess .......................................................... 303
Создаем процесс с помощью модуля multiprocessing ................................................ 304
Убиваем процесс, используя функцию terminate() .................................................... 305
Получаем системную информацию с помощью модуля os ...................................... 306
Получаем информацию о процессах с помощью модуля psutil.............................. 306
Автоматизация команд ................................................................................................................ 307
Invoke .......................................................................................................................................... 307
Другие вспомогательные методы для команд ..................................................................... 308
Конкурентность ............................................................................................................................. 308
Очереди ...................................................................................................................................... 309
Процессы.................................................................................................................................... 310
Потоки ........................................................................................................................................ 311
[Link] ................................................................................................................... 314
Зеленые потоки и gevent ...................................................................................................... 317
twisted ......................................................................................................................................... 320
asyncio ......................................................................................................................................... 321
Redis ............................................................................................................................................. 321
Помимо очередей .................................................................................................................... 325
Читайте далее.................................................................................................................................. 326
Упражнения ..................................................................................................................................... 326
Глава 16. Данные в коробке: надежные хранилища ................................................................ 327
Плоские текстовые файлы ......................................................................................................... 327
Текстовые файлы, дополненные пробелами ........................................................................ 328
ǶȋȓȈȊȓȍȕȐȍ
ǷȘȐȓȖȎȍȕȐȧ
Приложение А. Аппаратное и программное обеспечение для начинающих
программистов ...................................................................................................................................... 520
Аппаратное обеспечение ............................................................................................................. 520
Компьютеры пещерных людей........................................................................................... 520
Электричество.......................................................................................................................... 521
Изобретения ............................................................................................................................. 521
Идеальный компьютер .......................................................................................................... 522
Процессор .................................................................................................................................. 522
Память и кэш ............................................................................................................................ 522
Хранение .................................................................................................................................... 522
Ввод данных .............................................................................................................................. 523
ǶȋȓȈȊȓȍȕȐȍ
Как и обещает название, книга познакомит вас с одним из самых популярных язы-
ков программирования — Python. Издание предназначено как для начинающих
программистов, так и для тех, кто уже имеет опыт в написании программ и просто
желает добавить Python к списку доступных ему языков.
В большинстве случаев изучать компьютерный язык проще, чем человеческий, —
в нем меньше двусмысленностей и исключений, которые приходится запоминать.
Python — один из самых последовательных и понятных компьютерных языков, он
сочетает в себе простоту изучения, простоту использования и большую выразитель-
ную силу.
Компьютерные языки состоят из данных — аналогами в разговорной речи яв-
ляются существительные — и инструкций (или кода), которые можно сравнить
с глаголами. Изучить нужно будет и то и другое: вы освоите основы кода и струк-
тур данных и узнаете, как их объединить. Затем перейдете к более сложным темам,
а программы, которые вы будете читать и писать, станут длиннее и сложнее. Если
провести аналогию с работой по дереву, мы начнем с молотка, гвоздей и небольших
кусков древесины, а во второй половине книги обратимся к более специализиро-
ванным инструментам, которые можно сравнить с токарными станками и другими
более сложными устройствами.
Вам нужно знать не только сам язык, но и то, что с его помощью можно делать.
Мы начнем с языка Python и его стандартной библиотеки, готовой к работе прямо
«из коробки». Помимо этого, я покажу вам, как находить, загружать, устанавливать
и использовать качественные сторонние пакеты: касаться узких тем или рассматри-
вать сложные трюки не буду, а сделаю акцент на том, что после десяти лет работы
с Python считаю действительно полезным.
Несмотря на то что книга представляет собой введение в Python, в ней мы
затронем и несколько дополнительных тем, с которыми, на мой взгляд, следует
ознакомиться еще на начальном этапе. Работе с базами данных и Интернетом мы
тоже уделим внимание, однако не станем забывать, что технологии меняются очень
быстро — теперь от программиста на Python общество ждет знаний об облачных
технологиях, машинном обучении и создании потоков событий: основную инфор-
мацию по этим темам вы также здесь найдете.
Язык Python имеет некоторые специальные функции, работающие лучше,
чем адаптированные стили программирования из других языков. Например, ис-
пользование ключевого слова for и итераторов — более прямой способ создания
ǪȊȍȌȍȕȐȍ
ǷȖȌȖȉȕȣȍȗȘȐȔȍȟȈȕȐȧȧȉțȌțȌȍȓȈȚȤȒȖȋȌȈȟȚȖȚȖȔȖȎȍȚȉȣȚȤȕȍȗȖȕȧȚȕȣȔȐȓȐȎȍ
șțȡȍșȚȊțȍȚȉȖȓȍȍȗȐȚȖȕșȒȐȑșȗȖșȖȉȘȍȠȐȚȤȗȘȖȉȓȍȔț
ǬȓȧȒȖȋȖȥȚȈȒȕȐȋȈ
Эта книга для всех, кто заинтересован в изучении одного из самых популярных во
всем мире языков программирования. Наличие или отсутствие опыта с другими
языками программирования не имеет значения.
ǿȚȖȕȖȊȖȋȖȊȖȊȚȖȘȖȔȐȏȌȈȕȐȐ
Что изменилось со времени выхода первого издания?
Добавилось около 100 страниц, в том числе с изображением котиков.
Количество глав удвоилось, но сами главы стали короче.
В начале книги появилась глава, посвященная типам данных, переменным
и именам.
Рассмотрены новые особенности Python, такие как f-строки.
Рекомендованы новые или улучшенные сторонние библиотеки.
Во всей книге присутствуют новые примеры кода.
Для начинающих разработчиков добавлен текст с описанием аппаратного и про-
граммного обеспечения.
Более опытные разработчики могут ознакомиться с библиотекой asyncio.
Рассмотрен новый стек технологий: контейнеры, облачные технологии, наука
о данных и машинное обучение.
ǪȊȍȌȍȕȐȍ
ǹȚȘțȒȚțȘȈȒȕȐȋȐ
В первой части излагаются основы языка программирования Python: главы 1–11
следует читать по порядку. Я оперирую простейшими структурами данных и кода,
постепенно составляя из них более сложные и реалистичные программы. Во второй
части (главы 12–22) показывается, каким образом язык программирования Python
используется в определенных прикладных областях, таких как Интернет, базы дан-
ных, сети и т. д.: эти главы можно читать в любом порядке.
Вот краткое содержание всех глав и приложений и обзор новых терминов, с ко-
торыми вы там встретитесь.
Глава 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 (более подробно они
рассматриваются в приложении В).
ǪȊȍȌȍȕȐȍ
ǪȍȘșȐȐ3\WKRQ
Языки программирования со временем изменяются — разработчики добавляют в них
новые возможности и исправляют ошибки. Примеры этой книги написаны и про-
тестированы для версии Python 3.7. Версия 3.7 является наиболее современной на
момент выхода этой книги, и о самых значимых нововведениях я расскажу. Версия 3.8
вышла в конце 2019 года — я рассмотрю самую ожидаемую функциональность1.
Узнать, что и когда было добавлено в язык программирования Python, можно, посетив
страницу KWWSVGRFVS\WKRQRUJZKDWVQHZ: там представлена техническая информация.
Она, скорее всего, покажется трудной для понимания, если вы только начинаете из-
учать Python, но может пригодиться в будущем, если вам нужно будет писать про-
граммы для компьютеров, на которых установлены другие версии Python.
ǻșȓȖȊȕȣȍȖȉȖȏȕȈȟȍȕȐȧ
В этой книге приняты следующие шрифтовые соглашения.
Курсив
Им обозначаются новые термины и понятия.
ǬȢȡȢȬȜȤȜȡȡȯȝȬȤȜȨȦ
Используется в листингах программного кода, а также для имен и расширений
файлов, названий путей, имен функций, команд, баз данных, переменных,
операторов и ключевых слов.
ǪȧȤȥȜȖȡȯȝȠȢȡȢȬȜȤȜȡȡȯȝȬȤȜȨȦ
Указывает текст, который необходимо заменить пользовательскими значениями
или значениями, определяемыми контекстом.
ǺȈȒȖȜȖȘȔȓȍȕȣșȖȊȍȚȗȘȍȌȓȖȎȍȕȐȍȐȓȐȏȈȔȍȟȈȕȐȍ
ǺȈȒȐȔȖȉȘȈȏȖȔȖȜȖȘȔȓȍȕȖȗȘȍȌțȗȘȍȎȌȍȕȐȍ
1
Оригинальное издание выпущено до выхода версии 3.8. Текущая версия — 3.8.2. — Примеч. ред.
ǪȊȍȌȍȕȐȍ
ǰșȗȖȓȤȏȖȊȈȕȐȍȗȘȐȔȍȘȖȊȒȖȌȈ
Примеры кода и упражнения, приведенные в тексте, доступны для загрузки по адре-
су KWWSVJLWKXEFRPPDGVFKHPHLQWURGXFLQJS\WKRQ. Эта книга написана, чтобы помочь
вам в работе: вы можете применить код, содержащийся в ней, в ваших программах
и документации и не связываться с нами, чтобы спросить разрешения, если соби-
раетесь воспользоваться небольшим фрагментом кода. Например, если вы пишете
программу и кое-где вставляете в нее код из книги, никакого особого разрешения
не требуется. Однако если вы запишете на диск примеры из книги и начнете разда-
вать или продавать такие диски, разрешение на это получить необходимо. Если вы
цитируете это издание, отвечая на вопрос, или воспроизводите код из него в качестве
примера, разрешения не требуется. Но если включаете значительный фрагмент кода
из данной книги в документацию по вашему продукту, необходимо разрешение.
Ссылки на источник приветствуются, но не обязательны. В такие ссылки обычно
включаются название книги, имя ее автора, название издательства и номер ISBN.
Например: «Простой Python. Современный стиль программирования. 2-е изд. Билл
Любанович. Питер, 2020. 978-5-4461-1639-3».
При любых сомнениях относительно превышения разрешенного объема исполь-
зования примеров кода, приведенных в данной книге, можете обращаться к нам по
адресу SHUPLVVLRQV#RUHLOO\FRP.
ǶȚȐȏȌȈȚȍȓȤșȚȊȈ
Ваши замечания, предложения, вопросы отправляйте по адресу FRPS#SLWHUFRP (из-
дательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
На веб-сайте издательства ZZZSLWHUFRP вы найдете подробную информацию
о наших книгах.
ƉƳƨƫƶƬƨƸƵƶƹƺư
1
Bauer M. Linux Server Security, 2nd Edition. — O’Reilly, 2009.
2
Адельштайн Т., Любанович Б. Системное администрирование в Linux. — СПб.: Питер, 2010.
3
Любанович Б. Простой Python. Современный стиль программирования. — СПб.: Питер,
2019.
ǿǨǹǺȄ,
ƖƹƵƶƪǃ3\WKRQ
ƋƓƈƊƈ
3\WKRQƹƿƭƴƭƫƶƭƬLJƺ
Дональд Кнут
ǺȈȑȕȣ
Начнем с двух небольших тайн и их разгадок. Что, по-вашему, означают следующие
две строки?
ſǰȳȘɨƀśſƀɨɯřřɨřŜ
ſǰȳȘɩƀśſƀɨřɬřɩřɨřŜ
Выглядит как некая компьютерная программа. На самом деле это схема для вя-
зания — точнее, фрагмент, который описывает, как связать пятку носка. Похожие
носки показаны на рис. 1.1.
ǸȐșǪȧȏȈȕȣȍȕȖșȒȐ
ǫȓȈȊȈ3\WKRQșȟȍȔȍȋȖȍȌȧȚ
Для меня эти строки имеют не больше смысла, чем судоку для одного из моих
котов, но вот моя жена совершенно точно понимает написанное. Если вы вяжете,
то тоже поймете.
Рассмотрим еще один таинственный текст, который можно увидеть записанным
на листочке из блокнота. Вы сразу поймете его предназначение, даже если и не до-
гадаетесь о том, каким будет конечный продукт:
ɨŵɩȥȦȢȟȢȖȢȝȟȢȚȞȜȠȔȥȟȔȜȟȜȠȔȤȗȔȤȜȡȔŚ
ɨŵɩȥȦȢȟȢȖȢȝȟȢȚȞȜȥȟȜȖȢȞŚ
ɩɨŵɩȥȦȔȞȔȡȔȠȧȞȜŚ
ɨȫȔȝȡȔȳȟȢȚȞȔȥȢȟȜŚ
ɨȫȔȝȡȔȳȟȢȚȞȔȥȔȩȔȤȔŚ
ɫȥȦȔȞȔȡȔȞȔȤȦȢȨșȟȰȡȢȗȢȣȲȤșſȢȩȟȔȚȘșȡȡȢȗȢƀŜ
ǯșȤșȘȦșȠȞȔȞȘȢȕȔȖȜȦȰȠȧȞȧřȧȕșȘȜȦșȥȰřȫȦȢȖȥșȜȡȗȤșȘȜșȡȦȯȢȩȟȔȚȘșȡȯŜ
DZȠșȬȔȝȦșȖȥșȜȡȗȤșȘȜșȡȦȯŜ
DzȭȔȦșȟȰȡȢțȔȠșȥȜȦșŜ
DZȘșȟȔȝȦșɩɥȬȔȤȜȞȢȖŜ
ǤșȤȚȜȦșȜȩȢȩȟȔȚȘșȡȡȯȠȜȘȢȥȟșȘȧȲȭșȗȢȱȦȔȣȔŜ
ǤȟȳȞȔȚȘȢȗȢȬȔȤȜȞȔś
ȣȤȜȥȯȣȰȦșȤȔțȘșȟȢȫȡȧȲȘȢȥȞȧȠȧȞȢȝŚ
ȤȔȥȞȔȦȔȝȦșȬȔȤȜȞȣȤȜȣȢȠȢȭȜȤȜȨȟșȡȢȝȥȞȔȟȞȜŚ
ȚȔȤȰȦșȡȔȥȞȢȖȢȤȢȘșȘȢȣȢȘȤȧȠȳȡȜȖȔȡȜȳŚ
ȣșȤșȖșȤȡȜȦșȜȢȕȚȔȤȰȦșȘȤȧȗȧȲȥȦȢȤȢȡȧŜ
ǸȐșdzȍȜșȍ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǴȈȓȍȕȤȒȐȍȗȘȖȋȘȈȔȔȣ
Подобные идеи вы встретите и в компьютерных программах, которые сами по себе
являются маленькими языками: через них люди говорят компьютеру, что делать.
Схему для вязания и рецепт я использовал для демонстрации того, что программы
не так страшны, как может показаться, — всего лишь нужно выучить верные слова
и правила.
Понять этот маленький язык гораздо легче, если в нем не очень много слов и пра-
вил и если вам не нужно изучать их все одновременно: за один раз наш мозг может
воспринять только ограниченное количество знаний.
Пришло время обратиться к настоящей программе (пример 1.1). Как вы думаете,
что она делает?
ǫȓȈȊȈ3\WKRQșȟȍȔȍȋȖȍȌȧȚ
ǷȘȐȔȍȘFRXQWGRZQS\
ɬřɫřɪřɩřɨřɑŠɑś
ſ ƀ
то вы знаете, что Python выучить проще, чем понять рецепт или схему для вяза-
ния. К тому же тренироваться писать на этом языке вы можете, сидя за удобным
и безопасным столом и избегая опасностей вроде горячей воды и спиц.
Программа, написанная на языке программирования Python, содержит некоторое
количество специальных слов и символов: for, in, print, запятые, точки с запятой,
скобки и т. д. — все они являются важной частью синтаксиса (правил) языка.
Хорошая новость заключается в том, что Python имеет более доступный и менее
объемный синтаксис по сравнению с большинством других языков программиро-
вания: текст кажется почти понятным — как и рецепт.
Пример 1.2 — тоже небольшая программа на Python: она позволяет выбрать одно
из заклинаний Гарри Поттера, хранящееся в списке, и вывести его на экран.
ǷȘȐȔȍȘVSHOOVS\
ʰƃ
ɑŠɑř
ɑŠɑř
ɑŠɑř
ɑ Šɑř
ɑŠɑř
ɑŠɑř
Ƅ
ſƃɪƄƀ
dzȦȌȐȖȉȣȟȕȖșȟȐȚȈȦȚșȍȌȐȕȐȞȣȗȖȥȚȖȔțșȟȐȚȈȚȤșȕțȓȧȔȖȎȍȚȗȖȒȈȏȈȚȤșȧșȚȘȈȕ
ȕȣȔǶȌȕȈȒȖȊȗȘȖȋȘȈȔȔȐȘȖȊȈȕȐȐțȌȖȉȕȍȍȖȗȍȘȐȘȖȊȈȚȤșȔȍȡȍȕȐȧȔȐȈȕȍȗȖȏȐ
ȞȐȧȔȐǬȈȥȚȖȗȘȐȔȍȘȚȖȋȖȒȈȒȒȖȔȗȤȦȚȍȘȕȈȧȗȘȖȋȘȈȔȔȈȐȕȖȋȌȈȖȚȓȐȟȈȍȚșȧȖȚ
ȖȉȣȟȕȖȋȖȧȏȣȒȈ
ǷȘȐȔȍȘTXRWHVS\
ʰƇ
ɑɑśɑřţɑř
ɑɑśɑŠɑř
ɑɑśɑŠɑř
ƈ
ʰɑɑ
ſřɑśɑřƃƄƀ
Если вы запустите эту небольшую программу, она выведет следующее:
śŠ
quotes — переменная, которая именует словарь Python: коллекцию уникальных
ключей (в примере ключом является имя участника трио) и связанных с ними значе-
ний (в нашем примере — значимое высказывание участника «Балбесов»). Используя
словарь, вы можете сохранять элементы и выполнять их поиск по именам: зачастую
это удобнее, чем работать со списком.
В примере с заклинаниями для создания списка использовались квадратные
скобки (ƃ и Ƅ), а в примере с цитатами для создания словаря — фигурные скобки
(Ƈ и ƈ). Также мы использовали двоеточие (ś) для того, чтобы связать каждый ключ
словаря с соответствующим значением. Более подробно о словарях можно про-
читать в главе 8.
Надеюсь, я не перегрузил вас синтаксисом. В следующих нескольких разделах
вы познакомитесь и с другими простыми правилами.
ǩȖȓȍȍȖȉȢȍȔȕȈȧȗȘȖȋȘȈȔȔȈ
Теперь рассмотрим что-то совершенно иное: в примере 1.4 представлена программа,
которая выполняет более сложную серию задач. Не рассчитывайте, что сразу пой-
мете, как она работает, — книга для того и предназначена, чтоб научить вас этому!
Таким образом я даю вам возможность увидеть и прочувствовать типичную полно-
размерную программу, написанную на языке Python. Если вы знаете другие языки
программирования, то можете сравнить их с Python прямо сейчас. Сможете ли вы,
не зная Python и еще не прочтя расшифровку, примерно представить, что делает
каждая строка? Вы уже видели примеры использования списка и словаря, а эта
программа демонстрирует еще несколько новых возможностей.
ǫȓȈȊȈ3\WKRQșȟȍȔȍȋȖȍȌȧȚ
ǷȘȐȔȍȘDUFKLYHS\
ɨ
ɩ
ɪŜ
ɫ
ɬſɑɐŜɑƀ
ɭʰſɑśɑƀ
ɮʰſɑřřřɩɥɨɬɥɭɨɪśɑƀ
ɯʰɑśŵŵ Ŝŵ ŵţʰʩĺʰʩɑʩſřƀ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ɰʰſƀ
ɨɥ ʰŜſƀ
ɨɨʰ Ŝ ſɑŞɯɑƀ
ɨɩʰŜſƀ
ɨɪś
ɨɫɏʰƃɑ ɏɑƄƃɑ ɑƄƃɑɑƄ
ɨɬſɑ śɑřɏƀ
ɨɭſɑ Ŝɑƀ
ɨɮŜſɏƀ
ɨɯ ś
ɨɰſɑř ɑřƀ
ǸȐșǸȍȏțȓȤȚȈȚȖȉȘȈȡȍȕȐȧȒ:D\EDFN0DFKLQH
ǷȘȐȔȍȘDUFKLYHS\
ɨ
ɩ
ɪ
ɫſɑɐŜɑƀ
ɬʰſɑśɑƀ
ɭʰſɑřřřɩɥɨɬɥɭɨɪśɑƀ
ɮʰɑśŵŵ Ŝŵ ŵţʰʩĺʰʩɑʩſřƀ
ɯʰŜſƀ
ɰʰŜſƀ
ɨɥś
ɨɨɏʰƃɑ ɏɑƄƃɑ ɑƄƃɑɑƄ
ɨɩſɑ śɑřɏƀ
ɨɪſɑ Ŝɑƀ
ɨɫŜſɏƀ
ɨɬ ś
ɨɭſɑř ɑřƀ
Новая версия короче и, как мне кажется, более читабельна для большинства лю-
дей. О requests вы узнаете в главе 18, а о других авторских программах для Python
в главе 11.
3\WKRQȊȘȍȈȓȤȕȖȔȔȐȘȍ
Стоит ли тратить время и силы на изучение Python? Язык программирования
Python существует примерно с 1991 года (он старше Java, но моложе С) и является
одним из пяти самых популярных языков программирования. Людям платят деньги
за написание программ на Python — очень важных и значимых, которыми мы поль-
зуемся каждый день: Google, YouTube, Instagram, Netflix и Hulu.
Я использовал Python для создания приложений в самых разных областях.
Python имеет репутацию высокопроизводительного языка программирования, и это
особенно нравится динамично развивающимся компаниям.
Python используется во многих компьютерных приложениях, таких как:
командная строка на мониторе или в окне терминала;
пользовательские интерфейсы (Graphical User Interface, GUI), включая сетевые;
веб-приложения, как клиентские, так и серверные;
бэкенд-серверы, поддерживающие крупные популярные сайты;
облака (серверы, управляемые сторонними организациями);
приложения для мобильных устройств;
приложения для встроенных устройств.
ǫȓȈȊȈ3\WKRQșȟȍȔȍȋȖȍȌȧȚ
3\WKRQȗȘȖȚȐȊȧȏȣȒȈșȗȓȈȕȍȚȣǽ
Насколько Python хорош по сравнению с другими языками программирования?
Где и когда следует использовать тот или иной язык? В этом разделе я покажу при-
меры кода, написанные на других языках, чтобы вы могли оценить, с чем конкури-
рует Python. Вы не обязаны понимать каждый из приведенных фрагментов, если
не работали с этими языками. (А когда увидите последний фрагмент, написанный
на Python, то почувствуете облегчение из-за того, что не работали с некоторыми
другими языками.) Если же вам интересен только Python — вы ничего не потеряете,
если не станете читать этот раздел.
Каждая программа должна напечатать число и немного рассказать о языке, на
котором она написана.
Если вы пользуетесь терминалом или терминальным окном, программа, кото-
рая читает то, что вы вводите, выполняет это и отображает результат, называется
программой-оболочкой. Оболочка операционной системы Windows называется
cmd (KWWSVUXZLNLSHGLDRUJZLNL&PGH[H), она выполняет пакетные файлы, имеющие
расширение Ŝ. Для Linux и других операционных систем семейства Unix (вклю-
чая macOS) существует множество программ-оболочек. Самая популярная из них
называется bash (KWWSVZZZJQXRUJVRIWZDUHEDVK) или sh. Оболочка обладает про-
стейшими возможностями вроде выполнения простой логики и разворачивания
символа-джокера наподобие * в полноценные имена файлов. Вы можете сохранять
команды в файлы, которые называются сценариями оболочки, и выполнять их позже.
Подобные программы могли быть в числе самых первых в вашей карьере программи-
ста. Проблема в том, что возможности для масштабирования у сценариев оболочки
ограничиваются несколькими сотнями строк, а сами сценарии выполняются гораздо
медленнее, чем программы, написанные на других языках. В следующем фрагменте
кода демонстрируется небольшая программа-оболочка:
ɤŠŵŵ
ʰɥ
ɑɛś ŜŜɑ
Если вы сохраните этот файл под именем Ŝ и запустите его с помощью
команды sh Ŝ, то на экране увидите следующее:
ɥś ŜŜ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ɑɑ
ſƀƇ
śʰɮ
Ŝſɑʩś řřɐ ŠɎɑřƀ
ƈ
ǷȖȟȍȔțȎȍ3\WKRQ"
Одной из причин, не обязательно самой важной, является популярность. Есть такие
факты:
Python — это наиболее быстро набирающий популярность основной язык про-
граммирования, как показано на рис. 1.4 (KWWSVVWDFNRYHUIORZEORJ
LQFUHGLEOHJURZWKS\WKRQ);
редакторы TIOBE Index (KWWSVZZZWLREHFRPWLREHLQGH[) в июне 2019 года за-
явили: «В этом месяце Python снова достиг высочайшей позиции в TIOBE Index,
его результат составил 8,5 %. Если Python удержит такой темп, то в течение бли-
жайших трех-четырех лет он сможет заменить С и Java, став самым популярным
языком программирования в мире»;
Python стал языком программирования 2018 года по версии TIOBE и занял
первые места в рейтингах IEEE Spectrum (KWWSVVSHFWUXPLHHHRUJDWZRUNLQQRYDWLRQ
WKHWRSSURJUDPPLQJODQJXDJHV) и PyPL (KWWSS\SOJLWKXELR3<3/KWPO);
Python является самым популярным языком программирования для курсов
введения в информатику в лучших американских колледжах (KWWSVFDFPDFPRUJ
EORJVEORJFDFPS\WKRQLVQRZWKHPRVWSRSXODULQWURGXFWRU\WHDFKLQJODQJXDJHDW
WRSXVXQLYHUVLWLHVIXOOWH[W);
Python официально используется для обучения во французских гимназиях.
ǸȐș3\WKRQȖȗȍȘȍȎȈȍȚȊȘȖșȚȍȖșȚȈȓȤȕȣȍȖșȕȖȊȕȣȍȧȏȣȒȐȗȘȖȋȘȈȔȔȐȘȖȊȈȕȐȧ
ǫȓȈȊȈ3\WKRQșȟȍȔȍȋȖȍȌȧȚ
DzȖȋȌȈȕȍșȚȖȐȚȐșȗȖȓȤȏȖȊȈȚȤ3\WKRQ
Python не всегда будет наилучшим выбором.
Он не установлен по умолчанию. В приложении Б показано, как установить
Python, если он еще не установлен на вашем компьютере.
Python достаточно быстрый для большинства приложений, но его скорости
может оказаться недостаточно для наиболее требовательных из них. Если ваша
программа проводит большую часть времени за вычислениями, что в технических
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
3\WKRQȗȘȖȚȐȊ3\WKRQ
Вы можете столкнуться с проблемой выбора одной из двух версий Python. Python 2
существует давно и предустановлен на компьютерах с Linux и Apple. Это был отлич-
ный язык, но нет ничего идеального. В языках программирования, как и во многих
других сферах, бывают ошибки косметические и легко исправимые, а бывают —
сложные и требующие усилий. Исправления несовместимы: новые программы, на-
писанные с помощью исправленного языка, не будут работать на старых системах,
а старые программы не будут работать на новых.
Создатель языка Python Гвидо ван Россум (KWWSVZZZS\WKRQRUJaJXLGR) и дру-
гие разработчики решили собрать и объединить все исправления и в результате
в 2008 году представили миру Python 3. Python 2 — это прошлое, а Python 3 —
будущее. Финальная версия Python 2 имеет номер 2.7, и некоторое время она
еще будет поддерживаться, однако на ней род заканчивается; Python 2.8 никогда
не выйдет. Окончание поддержки языка Python 2 намечено на январь 2020 года.
Больше не будут исправляться проблемы (в том числе проблемы с безопасно-
стью), и многие весомые пакеты Python к этому моменту перестанут поддержи-
вать Python 2 (KWWSVS\WKRQVWDWHPHQWRUJ). В операционных системах также будет
ǫȓȈȊȈ3\WKRQșȟȍȔȍȋȖȍȌȧȚ
ǻșȚȈȕȖȊȒȈ3\WKRQ
Чтобы не загромождать текст, я вынес детали установки Python 3 в приложение Б.
Если у вас еще не установлен Python 3 или вы не до конца в этом уверены, обрати-
тесь к приложению и посмотрите, каковы должны быть ваши действия. Да, это может
быть хлопотно и трудоемко, но сделать это вам придется лишь однажды.
ǯȈȗțșȒ3\WKRQ
После установки рабочей копии Python 3 вы сможете использовать ее, чтобы запу-
скать как приведенные в этой книге программы, так и собственный код. Как же запу-
стить программу, написанную на языке Python? Существует два основных способа.
Встроенный в Python интерактивный интерпретатор (также он называется
оболочкой) предоставляет простой способ поэкспериментировать с небольшими
программами. Строка за строкой вы вводите команды и мгновенно видите ре-
зультат — такая тесная связь между набором текста и его просмотром позволяет
проводить эксперименты быстрее. Я буду использовать интерактивный интер-
претатор для демонстрации возможностей языка, а вы те же команды можете
вводить в собственном компьютере.
В остальных случаях сохраняйте программы в виде текстовых файлов с расши-
рением Ŝ, а затем запускайте их, введя python и имена этих файлов.
Попробуем воспользоваться обоими методами.
ǰȕȚȍȘȈȒȚȐȊȕȣȑȐȕȚȍȘȗȘȍȚȈȚȖȘ
Для большинства примеров кода в этой книге используется встроенный интерак-
тивный интерпретатор. Когда вы вводите команду из примера и получаете тот же
результаты, вы понимаете, что находитесь на правильном пути.
Интерпретатор запускается путем ввода имени основной программы Python
для вашего компьютера: python, ɪ или чего-то похожего. В дальнейшем мы
будем предполагать, что она называется python. Если ваша программа называется
по-другому, то для запуска вам следует ввести именно ее имя.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǼȈȑȓȣ3\WKRQ
Если вы запишете в файл число ɩɮ и запустите этот файл с помощью Python, он вы-
полнится, но на экране ничего не появится. В обычных неинтерактивных программах
для Python вам нужно вызывать функцию print, чтобы вывести что-то на экран, как
показано в следующем фрагменте кода:
ſɩɮƀ
Сработало? Если да, то примите мои поздравления по поводу того, что вы за-
пустили свою первую автономную программу на Python!
ǿȚȖȌȈȓȤȠȍ"
Вы будете вводить команды в работающую систему Python, и они должны соответ-
ствовать синтаксису языка. Вместо того чтобы сваливать на вас все синтаксические
правила сразу, мы неторопливо пройдемся по ним в нескольких следующих главах.
Базовый способ разработки программы на Python — применение простого
текстового редактора и окна терминала. В рамках этой книги я использую именно
такие редакторы, иногда показывая интерактивные сессии работы с терминалом,
а иногда — фрагменты файлов. Вам следует знать, что существует множество
интегрированных сред разработки (integrated development environment, IDE) для
Python. Они могут предоставить вам графические пользовательские интерфейсы,
помогающие в редактировании текста, и экраны помощи. Более подробно об этом
вы прочитаете в главе 19.
ǴȖȔȍȕȚȗȘȖșȊȍȚȓȍȕȐȧ
Каждый язык программирования имеет свой стиль. Во введении я упомянул, что
существует характерный для Python способ выразить себя. В Python встроен не-
большой текст, который выражает его философию (насколько я знаю, Python —
это единственный язык программирования, содержащий подобную «пасхалку»).
Когда вам захочется ощутить момент просветления, просто введите this
в интерактивный интерпретатор, а затем нажмите клавишу (QWHU:
ʴʴʴ
ǪȤȔȥȜȖȢșȟȧȫȬșřȫșȠȧȤȢȘȟȜȖȢșŜ
ǿȖȡȢșȟȧȫȬșřȫșȠȡșȳȖȡȢșŜ
ǯȤȢȥȦȢșȟȧȫȬșřȫșȠȥȟȢȚȡȢșŜ
DZȟȢȚȡȢșȟȧȫȬșřȫșȠțȔȣȧȦȔȡȡȢșŜ
ǮȘȡȢȧȤȢȖȡșȖȢșȟȧȫȬșřȫșȠȖȟȢȚșȡȡȢșŜ
ǰȔțȤșȚșȡȡȢșȟȧȫȬșřȫșȠȣȟȢȦȡȢșŜ
ǷȜȦȔșȠȢȥȦȰȜȠșșȦțȡȔȫșȡȜșŜ
ǮȥȢȕȯșȥȟȧȫȔȜȡșȡȔȥȦȢȟȰȞȢȢȥȢȕȯșřȫȦȢȕȯȡȔȤȧȬȔȦȰȣȤȔȖȜȟȔŜ
1
Если вы не знаете, что это значит, откройте приложение Б, чтобы получить детальную
информацию для различных операционных систем.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǯȤȜȱȦȢȠȣȤȔȞȦȜȫȡȢȥȦȰȖȔȚȡșșȕșțȧȣȤșȫȡȢȥȦȜŜ
ǮȬȜȕȞȜȡȜȞȢȗȘȔȡșȘȢȟȚȡȯțȔȠȔȟȫȜȖȔȦȰȥȳŜ
ǥȥȟȜȡșțȔȠȔȟȫȜȖȔȲȦȥȳȳȖȡȢŜ
ǢȥȦȤșȦȜȖȘȖȧȥȠȯȥȟșȡȡȢȥȦȰřȢȦȕȤȢȥȰȜȥȞȧȬșȡȜșȧȗȔȘȔȦȰŜ
ǤȢȟȚșȡȥȧȭșȥȦȖȢȖȔȦȰȢȘȜȡŹȜȚșȟȔȦșȟȰȡȢȦȢȟȰȞȢȢȘȜȡŹȢȫșȖȜȘȡȯȝȥȣȢȥȢȕȥȘșȟȔȦȰȱȦȢŜ
ǵȢȦȳȣȢȡȔȫȔȟȧȢȡȠȢȚșȦȕȯȦȰȜȡșȢȫșȖȜȘșȡřșȥȟȜȖȯȡșȗȢȟȟȔȡȘșȪŜ
DZșȝȫȔȥȟȧȫȬșřȫșȠȡȜȞȢȗȘȔŜ
ǵȢȦȳȡȜȞȢȗȘȔțȔȫȔȥȦȧȲȟȧȫȬșřȫșȠȣȤȳȠȢȥșȝȫȔȥŜ
ǥȥȟȜȤșȔȟȜțȔȪȜȲȥȟȢȚȡȢȢȕȮȳȥȡȜȦȰŹȜȘșȳȣȟȢȩȔŜ
ǥȥȟȜȤșȔȟȜțȔȪȜȲȟșȗȞȢȢȕȮȳȥȡȜȦȰŹȜȘșȳřȖȢțȠȢȚȡȢřȩȢȤȢȬȔŜ
ǯȤȢȥȦȤȔȡȥȦȖȔȜȠșȡŹȢȦȟȜȫȡȔȳȬȦȧȞȔŠǡȧȘșȠȘșȟȔȦȰȜȩȣȢȕȢȟȰȬșŠ
ǿȐȚȈȑȚȍȌȈȓȍȍ
В следующей главе мы поговорим о типах данных и переменных в Python. Это под-
готовит вас к чтению тех глав, в которых подробно рассматриваются типы данных
и структуры кода Python.
ǻȗȘȈȎȕȍȕȐȧ
Эта глава была введением в язык программирования Python. Вы узнали, что язык
делает, как выглядит и где его можно применить. В конце каждой главы я буду пред-
лагать выполнить небольшие задания, которые помогут вам запомнить то, что вы
только что прочитали, и подготовят к следующим урокам.
1.1. Если вы еще не установили Python 3, сделайте это сейчас. Прочтите приложе-
ние Б, чтобы узнать детали.
1.2. Запустите интерактивный интерпретатор Python 3. Детали опять же вы найдете
в приложении Б. Интерпретатор должен вывести несколько строк о себе, а за-
тем строку, начинающуюся с символов ʴʴʴ. Перед вами приглашение для ввода
команд Python.
1.3. Немного поэкспериментируйте с интерпретатором. Используйте его как кальку-
лятор и наберите ɯ * 9. Нажмите клавишу (QWHU, чтобы увидеть результат. Python
должен вывести ɮɩ.
1.4. Теперь введите число ɫɮ и нажмите клавишу (QWHU. Появилось ли число ɫɮ в сле-
дующей строке?
1.5. Теперь введите ſɫɮƀ и нажмите клавишу (QWHU. Появилось ли снова число ɫɮ
в следующей строке?
ƋƓƈƊƈ
ǬȈȕȕȣȍȚȐȗȣȏȕȈȟȍȕȐȧ
ȗȍȘȍȔȍȕȕȣȍȐȐȔȍȕȈ
Притчи 22:1
Ǫ3\WKRQȌȈȕȕȣȍȧȊȓȧȦȚșȧȖȉȢȍȒȚȈȔȐ
Память вашего компьютера визуально можно представить в виде длинного ряда
полок. Каждый слот на этих полках имеет ширину 1 байт (8 бит). Слоты пронуме-
рованы от 0 (первая позиция) до самого конца. Современные компьютеры имеют
миллиарды байт памяти (гигабайт), поэтому полки могли бы заполнить огромный
воображаемый склад.
Программа Python получает доступ к определенной области памяти вашего
компьютера с помощью операционной системы. Эта память используется для кода
самой программы, а также для данных, которыми программа оперирует. Операци-
онная система гарантирует, что программа не может читать или записывать в другие
области памяти без соответствующего разрешения.
Программы следят за тем, где (область памяти) хранятся их биты и чем (тип
данных) они являются. С точки зрения вашего компьютера все биты одинаковы.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
Одни и те же биты могут иметь разные значения в зависимости от того, какого они
типа. Один и тот же вариант расстановки битов может означать как число ɭɬ, так
и текстовый символ Ǡ.
Разные типы используют разное количество битов. Когда вы читаете о «64-бит-
ной машине», это означает, что целое число использует 64 бита (8 байт).
Некоторые языки хранят эти необработанные значения в памяти, отслеживая их
размеры и типы. Вместо непосредственной обработки таких данных Python упако-
вывает каждое значение — булевы значения, целые числа, числа с плавающей точкой,
строки и даже крупные структуры данных, функции и программы — в память как
объекты. Глава 10 этой книги посвящена созданию собственных объектов в Python,
но сейчас мы поговорим только об объектах, которые обрабатывают встроенные
типы данных.
Продолжая аналогию с полками: можно предста-
вить, что объекты — это коробки переменной длины,
занимающие место на этих полках так, как показано
на рис. 2.1. Python создает такие коробки, размещает
их на свободных местах и убирает, когда потребность
в них отпадает.
В Python объектом является фрагмент данных, в ко-
тором содержится как минимум следующее:
тип, определяющий, что объект может делать (по-
ǸȐșǷȖȝȖȎȐȑȕȈȒȖȘȖȉȒț
дробнее см. в следующем разделе); ȖȉȢȍȒȚ²ȞȍȓȖȍȟȐșȓȖ
уникальный идентификатор, позволяющий отли- șȖȏȕȈȟȍȕȐȍȔ
чить его от других объектов;
значение, соответствующее типу;
счетчик ссылок для отслеживания того, как часто объект используется.
Идентификатор представляет собой адрес места на полке. Тип похож на фа-
бричный штамп на коробке, который поясняет, что объект может делать. Если объ-
ект является целым числом, он имеет тип int и может (помимо всего прочего,
о чем вы узнаете из главы 3) быть добавлен к другому объекту с типом int .
Если мы представим, что коробка сделана из прозрачного пластика, то сможем
увидеть значение, находящееся внутри нее. О том, зачем нужен счетчик ссылок,
вы узнаете через несколько разделов, когда мы будем говорить о переменных
и именах.
ǺȐȗȣ
В табл. 2.1 представлены базовые типы данных в Python. Во втором столбце («Тип»)
содержится имя этого типа в Python. Третий столбец («Изменяемый?») указывает,
можно ли изменить значение переменной после ее создания (подробнее об этом
поговорим в следующем разделе). В столбце «Примеры» показываются один или
ǫȓȈȊȈǬȈȕȕȣȍȚȐȗȣȏȕȈȟȍȕȐȧȗȍȘȍȔȍȕȕȣȍȐȐȔȍȕȈ
После глав, посвященных этим базовым типам, в главе 10 вы узнаете, как созда-
вать новые типы данных.
ǰȏȔȍȕȟȐȊȖșȚȤ
Изменчивость одна лишь неизменна.
Перси Шелли
ǸȐșǹȚȘȖȋȈȧȚȐȗȐȏȈȞȐȧȕȍȖȏȕȈȟȈȍȚȟȚȖȒȓȈȊȐȠȐȕțȎȕȖȕȈȎȐȔȈȚȤșȐȓȤȕȍȍ
ǯȕȈȟȍȕȐȧȓȐȚȍȘȈȓȣ
Существует два вида определения данных в Python:
как литералы;
как переменные.
В следующих главах вы увидите, как указываются значения-литералы для разных
типов данных — целые числа представляют собой последовательность цифр, дроб-
ные числа содержат десятичную точку, текстовые строки заключаются в кавычки
и т. д. Но в примерах этой главы — чтобы избежать излишней сложности — мы
будем использовать лишь короткие целые числа из десятичной системы счисления
и один-два списка. Десятичные целые числа такие же, как числа в математике: они
представляют собой последовательность цифр от 0 до 9. В главе 3 мы рассмотрим
дополнительные детали работы с целыми числами (например, знаки и недесятичные
системы счисления).
ǷȍȘȍȔȍȕȕȣȍ
Вот мы и добрались до ключевого понятия языков программирования.
Python, как и большинство других компьютерных языков, позволяет вам опре-
делять переменные — имена для значений в памяти вашего компьютера, которые вы
далее будете использовать в программе.
ǫȓȈȊȈǬȈȕȕȣȍȚȐȗȣȏȕȈȟȍȕȐȧȗȍȘȍȔȍȕȕȣȍȐȐȔȍȕȈ
1
async и await появились в Python 3.7.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǷȘȐșȊȈȐȊȈȕȐȍ
В Python символ ʰ применяется для присваивания значения переменной.
ǪȠȒȖȓȍȕȈșțȟȐȓȐȟȚȖșȐȔȊȖȓ ȖȏȕȈȟȈȍȚ©ȘȈȊȕȖªǷȖȟȍȔțȎȍȊȖȔȕȖȋȐȝȧȏȣȒȈȝ
ȗȘȖȋȘȈȔȔȐȘȖȊȈȕȐȧȊȒȓȦȟȈȧ3\WKRQȥȚȖȚșȐȔȊȖȓȐșȗȖȓȤȏțȍȚșȧȌȓȧȖȉȖȏȕȈȟȍȕȐȧ
ȗȘȐșȊȈȐȊȈȕȐȧ"ǶȌȕȈȐȏȗȘȐȟȐȕ²ȕȈșȚȈȕȌȈȘȚȕȖȑȒȓȈȊȐȈȚțȘȍȖȚșțȚșȚȊțȦȚȓȖȋȐȟȍ
șȒȐȍȈȓȤȚȍȘȕȈȚȐȊȣȊȘȖȌȍșȚȘȍȓȒȐȊȓȍȊȖȈșȐȔȊȖȓ ȕȍșȓȐȠȒȖȔșȉȐȊȈȍȚșȚȖȓȒț
DzȘȖȔȍȚȖȋȖȊȒȖȔȗȤȦȚȍȘȕȣȝȗȘȖȋȘȈȔȔȈȝȗȘȐșȊȈȐȊȈȕȐȍȐșȗȖȓȤȏțȍȚșȧȟȈȡȍȟȍȔ
ȗȘȖȊȍȘȒȈȕȈȘȈȊȍȕșȚȊȖ
ǷȍȘȍȔȍȕȕȣȍ²ȥȚȖȐȔȍȕȈȈȕȍȓȖȒȈȞȐȐ
Пришло время сделать важное утверждение о переменных в Python: переменные —
всего лишь имена, и в этом заключается отличие Python от других языков програм-
мирования. Об этом важно помнить, особенно при работе с такими изменяемыми
объектами, как списки. Операция присваивания не копирует значение, а только
лишь прикрепляет имя к объекту, содержащему нужные данные. Имя — это ссылка
на объект, а не сам объект. Можно представить, что имя — это этикетка, прикле-
енная на коробку с объектом, которая размещается где-то в памяти компьютера
(рис. 2.3).
В других языках программирования переменные сами по себе имеют тип и при-
вязываются к локации в памяти. Вы можете изменить значение в этой локации,
но оно должно быть того же типа. Именно поэтому в статических языках нужно
объявлять тип переменных. В Python этого делать не требуется, поскольку имя
может ссылаться на все что угодно: значение и тип мы получаем, идя по цепочке
к самому объекту с данными. Такой подход экономит время, но при этом имеет
свои недостатки.
Вы можете неверно написать имя переменной и получить исключение, поскольку
она ни на что не ссылается, Python не выполняет такую проверку автоматически
в отличие от статических языков. В главе 19 показывается способ предваритель-
ной проверки переменных.
В сравнении с такими языками, как С, у Python скорость работы ниже. Ведь он
заставляет компьютер выполнять больше работы, для того чтобы вам не при-
шлось выполнять ее самостоятельно.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
В Python, если нужно узнать тип какого-либо объекта (переменной или значе-
ния), можно использовать конструкцию type(ȢȕȮșȞȦƀ. ſƀ — одна из встроенных
в Python функций. Чтобы проверить, указывает ли переменная на объект опреде-
ленного типа, используйте конструкцию ſtypeƀ:
ʴʴʴſɮƀ
ʳ ɐɐʴ
ʴʴʴſɮƀʰʰ
ʴʴʴ ſɮřƀ
ǫȓȈȊȈǬȈȕȕȣȍȚȐȗȣȏȕȈȟȍȕȐȧȗȍȘȍȔȍȕȕȣȍȐȐȔȍȕȈ
DzȖȋȌȈ ȧ țȗȖȔȐȕȈȦ ȜțȕȒȞȐȦ ȚȖ ȗȖșȓȍ ȍȍ ȐȔȍȕȐ ȘȈȏȔȍȡȈȦ ȒȘțȋȓȣȍ șȒȖȉȒȐ
Ȑ ȚȈȒȐȔ ȖȉȘȈȏȖȔ ȗȖȌȟȍȘȒȐȊȈȦ ȟȚȖ ȥȚȖ ȐȔȍȕȕȖ ȜțȕȒȞȐȧ Ȉ ȕȍ ȐȔȧ ȗȍȘȍȔȍȕȕȖȑ
ȐȓȐȟȚȖȓȐȉȖȍȡȍ
ǷȘȐșȊȈȐȊȈȕȐȍȕȍșȒȖȓȤȒȐȔȐȔȍȕȈȔ
Вы можете присвоить значение сразу нескольким переменным одновременно:
ʴʴʴʰʰʰɩ
ʴʴʴ
ɩ
ʴʴʴ
ɩ
ʴʴʴ
ɩ
ǷȍȘȍȕȈȏȕȈȟȍȕȐȍȐȔȍȕȐ
Поскольку имена указывают на объекты, если изменить значение, присвоенное
имени, оно начнет указывать на другой объект. Счетчик ссылок старого объекта
уменьшится на 1, а счетчик ссылок нового увеличится на ту же величину.
DzȖȗȐȘȖȊȈȕȐȍ
Как вы видели на рис. 2.4, присваивание существующей переменной Ȕ новой пере-
менной b заставит b указывать на тот же объект, что и a. Если вы выберете этикетку a
или b и обратитесь к объекту, на который они указывают, вы получите одинаковый
результат.
Если объект неизменяем (например, целое число), его значение нельзя изменить,
поэтому по умолчанию оба имени являются доступными только для чтения. Попро-
буйте выполнить следующий код:
ʴʴʴʰɬ
ʴʴʴ
ɬ
ʴʴʴʰ
ʴʴʴ
ɬ
ʴʴʴʰɩɰ
ʴʴʴ
1
Или на Остров забытых объектов.
ǫȓȈȊȈǬȈȕȕȣȍȚȐȗȣȏȕȈȟȍȕȐȧȗȍȘȍȔȍȕȕȣȍȐȐȔȍȕȈ
ɩɰ
ʴʴʴ
ɬ
Эти элементы списка (ƃɥƄ, ƃɨƄ и ƃɩƄ) сами по себе являются именами, ука-
зывающими на целочисленные объекты со значениями ɩ, ɫ и 6. Список хранит
элементы в заданном порядке.
Теперь давайте изменим первый элемент списка с помощью имени Ȕ и убедимся,
что список b также изменился:
ʴʴʴƃɥƄʰɰɰ
ʴʴʴ
ƃɰɰřɫřɭƄ
ʴʴʴ
ƃɰɰřɫřɭƄ
ǪȣȉȐȘȈȍȔȝȖȘȖȠȍȍȐȔȧȗȍȘȍȔȍȕȕȖȑ
Он говорил правильные вещи, но называл их
неверными именами.
ǿȐȚȈȑȚȍȌȈȓȍȍ
Числа! Они такие увлекательные! Хотя вы, наверное, даже не предполагали насколь-
ко1. Вы увидите, как использовать Python в качестве калькулятора, а также узнаете,
как кот помог создать систему счисления.
ǻȗȘȈȎȕȍȕȐȧ
2.1. Присвойте целочисленное значение 99 переменной и выведите ее на
экран.
2.2. Какого типа значение ɬ?
2.3. Какого типа значение ɩŜɥ?
2.4. Какого типа выражение ɬ ʫ ɩŜɥ?
1
Цифра 8 похожа на снеговика!
ƋƓƈƊƈ
ǿȐșȓȈ
Фрэнсис Хатчесон
ǩțȓȍȊȣȏȕȈȟȍȕȐȧ
В Python объекты булева (логического) типа данных могут иметь только два значе-
ния — или . Иногда вы будете использовать их напрямую, а иногда оце-
нивать «истинность» других типов по их значениям. Специальная функция ſƀ
может преобразовать любой тип данных Python в булев.
Функции мы рассмотрим в главе 9, сейчас же вам нужно знать только то,
что функция имеет имя, от нуля и более входных аргументов, взятых в скобки
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǾȍȓȣȍȟȐșȓȈ
Целые числа — это целые числа без дробей и десятичной точки, ничего особенного.
Кроме, возможно, знака и системы счисления (если вы хотите выразить числа в дру-
гих системах, а не в десятичной).
ǿȐșȓȈȓȐȚȍȘȈȓȣ
Любая последовательность цифр в Python представляет собой число-литерал:
ʴʴʴɬ
ɬ
ǰșȒȓȦȟȍȕȐȍȗȘȍȌțȗȘȍȎȌȈȍȚȊȈșȖȚȖȔȟȚȖȊȣȊȊȍȓȐȒȖȌȒȖȚȖȘȣȑȕȈȘțȠȈȍȚȗȘȈȊȐȓȈ
3\WKRQǿȚȖȥȚȖȏȕȈȟȐȚȧȖȉȢȧșȕȦȊȗȖȌȘȈȏȌȍȓȍ©ǹȐșȚȍȔȣșȟȐșȓȍȕȐȧªǪȒȕȐȋȍ
ȊȣțȊȐȌȐȚȍȍȡȍȔȕȖȋȖȗȘȐȔȍȘȖȊȐșȒȓȦȟȍȕȐȑȗȖșȒȖȓȤȒțȖȕȐȧȊȓȧȦȚșȧȖșȕȖȊȕȣȔ
ȔȍȝȈȕȐȏȔȖȔȖȉȘȈȉȖȚȒȐȖȠȐȉȖȒȊ3\WKRQ
Запись целого числа вы можете начать с конструкций ɥ, ɥ или ɥ. См. подраздел
«Системы счисления» далее в этой главе.
Последовательность цифр указывает на целое число. Если вы поместите знак ʫ
перед цифрами, число останется прежним:
ʴʴʴɨɩɪ
ɨɩɪ
ʴʴʴʫɨɩɪ
ɨɩɪ
ǶȗȍȘȈȞȐȐșȞȍȓȣȔȐȟȐșȓȈȔȐ
На нескольких следующих страницах вы увидите примеры использования Python
в качестве простого калькулятора. Можно выполнять обычные арифметические опе-
рации с помощью Python, используя математические операторы из этой таблицы.
ǶȗȍȘȈȚȖȘ ǶȗȐșȈȕȐȍ ǷȘȐȔȍȘ ǸȍȏțȓȤȚȈȚ
+ Сложение 5+8 13
– Вычитание 90 – 10 80
Продолжение ®
1
В версиях Python 3.6 и выше.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
(Продолжение)
ǾȍȓȣȍȟȐșȓȈȐȗȍȘȍȔȍȕȕȣȍ
Во всех предыдущих примерах использовались непосредственно целочисленные
значения, но можно смешивать целочисленные значения и переменные, которым
было присвоено целочисленное значение:
ʴʴʴʰɰɬ
ʴʴʴ
ɰɬ
ʴʴʴŹɪ
ɰɩ
Это — выражению Ȕ ʰ Ȕ * ɩ:
ʴʴʴȔʰɨɥɥ
ʴʴʴƋʰɩ
ʴʴʴ
ɩɥɥ
Только что вы увидели нечто новое — функцию с именем : она получает
целые числа 9 и ɬ, а возвращает двухэлементный кортеж. Как я уже говорил, с кор-
тежами вы познакомитесь в главе 7, а с функциями — в главе 9.
Рассмотрим последнюю математическую функцию, которая также позволяет
работать одновременно с целыми числами и с числами с плавающей точкой — воз-
ведение в степень с помощью оператора **:
ʴʴʴɩƋƋɪ
ɯ
ʴʴʴɩŜɥƋƋɪ
ɯŜɥ
ʴʴʴɩƋƋɪŜɥ
ɯŜɥ
ʴʴʴɥƋƋɪ
ɥ
ǷȘȐȖȘȐȚȍȚȖȗȍȘȈȞȐȑ
Рассмотрим, что получится, если ввести следующее:
ʴʴʴɩʫɪƋɫ
Как узнать приоритет той или иной операции? В приложении Д есть большая
таблица со всеми правилами. Однако на практике я и сам никогда в нее не смотрю,
потому что гораздо проще добавить пару скобок, чтобы сгруппировать код и вы-
числения нужным образом:
ʴʴʴɩʫſɪƋɫƀ
ɨɫ
Возможно, и это еще не то, чего бы вам хотелось. Скобки помогут сделать кон-
струкцию понятнее:
ʴʴʴſŞɬƀƋƋɩ
ɩɬ
ǹȐșȚȍȔȣșȟȐșȓȍȕȐȧ
Предполагается, что целые числа указываются в десятичной системе счисления,
если только вы не укажете какую-либо другую. Вам может никогда не понадобиться
использовать другие системы счисления, но иногда они будут встречаться в коде.
Как правило, у нас десять пальцев на руках и ногах, поэтому мы считаем: 0, 1, 2,
3, 4, 5, 6, 7, 8, 9. После этого у нас заканчиваются цифры, и мы переносим единицу
на место десятки и ноль — на место единицы: 10 означает «одна десятка и ноль еди-
ниц». В отличие от римских цифр в арабских цифрах нет одного символа, который
представлял бы собой 10. Далее мы считаем: 11, 12… 19, переносим единицу, чтобы
сделать 20 (две десятки и ноль единиц), и т. д.
Система счисления указывает, сколько цифр вы используете до того, как пере-
несете единицу. В двоичной (бинарной) системе счисления единственными цифрами
являются 0 и 1. Такие значения может иметь и знаменитый бит. Двоичные 0 и 1
точно такие же, как и десятичные. Однако, если в этой системе сложить 1 и 1, вы
получите 10 (одна десятичная двойка плюс ноль десятичных единиц).
В Python, помимо десятичной, вы можете выразить числа еще в трех системах
счисления, используя следующие префиксы для целых чисел:
0b или 0B для двоичной системы (основание 2);
0o или 0O для восьмеричной системы (основание 8);
0x или 0X для шестнадцатеричной системы (основание 16).
Основаниями здесь являются степени двойки. В некоторых случаях использова-
ние этих систем счисления может быть полезным, однако вполне вероятно, что вам
никогда не понадобится ни одна другая система счисления, кроме старой доброй
десятичной.
Интерпретатор выведет эти числа как десятичные. Попробуем воспользоваться
каждой из систем счисления. Первой выберем старое доброе десятичное число 10,
которое означает «одна десятка и ноль единиц»:
ʴʴʴɨɥ
ɨɥ
Теперь возьмем двоичное (основание 2) число 0b10, что означает «одна (деся-
тичная) двойка и ноль единиц»:
ʴʴʴɥɨɥ
ɩ
ǫȓȈȊȈǿȐșȓȈ
ǸȐșǿȍșȚȍȘ²ȗȘȍȒȘȈșȕȣȑȗțȠȐșȚȣȑȗȈȘȍȕȤ
ȐȏȖȉȘȍȚȈȚȍȓȤȟȍșȚȍȘȐȟȕȖȑșȐșȚȍȔȣșȟȐșȓȍȕȐȧ
ǷȘȍȖȉȘȈȏȖȊȈȕȐȧȚȐȗȖȊ
Чтобы изменить тип данных на целочисленный, воспользуйтесь функцией ſƀ.
Функция ſƀ принимает один входной аргумент и возвращает одно значение —
преобразованный в целое число эквивалент входного аргумента. При этом она со-
храняет целую часть числа и отбрасывает любой остаток.
Как было сказано в начале главы, простейший тип данных в Python — булев,
переменные этого типа могут иметь только значения и . После преобра-
зования в целые числа они представляют собой значения ɨ и ɥ:
ʴʴʴſƀ
ɨ
ʴʴʴſ ƀ
ɥ
ʴʴʴſɐɐƀ
ſ ƀś
ɑʳʴɑřɨřʳʴ
śſƀɨɥśɐɐ
Булево значение рассматривается как ɥ или ɥŜɥ, когда смешивается с це-
лыми числами или числами с плавающей точкой, а — как ɨ или ɨŜɥ:
ʴʴʴʫɩ
ɪ
ʴʴʴ ʫɬŜɥ
ɬŜɥ
ǵȈșȒȖȓȤȒȖȖȉȢȍȔȍȕȚȐȗLQW
В Python 2 размер переменной типа int имел ограничение в 32 или в 64 бита, в за-
висимости от вашего процессора. В 32 битах можно было хранить любое целое число
в диапазоне от –2 147 483 648 до 2 147 483 647.
Для переменных типа long выделялось 64 бита, что позволяло хранить значения
в диапазоне от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807. В Python 3
тип long отсутствует, а переменная типа int может быть любого размера — даже
больше 64 бит. Есть возможность поиграть и с такими большими числами, как гугол
(это единица со ста последующими нулями), имя которому придумал девятилетний
мальчик в 1920 году (KWWSVUXZLNLSHGLDRUJZLNLǫțȋȖȓ):
ʴʴʴ
ʴʴʴʰɨɥƋƋɨɥɥ
ʴʴʴ
ɨɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥ
ɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥ
ǫȓȈȊȈǿȐșȓȈ
ʴʴʴƋ
ɨɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥ
ɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥ
ɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥ
ǿȐșȓȈșȗȓȈȊȈȦȡȍȑȚȖȟȒȖȑ
Значениями целочисленного типа являются целые числа, но числа с плавающей
точкой (в Python они называются float) имеют десятичную точку:
ʴʴʴɬŜ
ɬŜɥ
ʴʴʴɬŜɥ
ɬŜɥ
ʴʴʴɥɬŜɥ
ɬŜɥ
Числа с плавающей точкой обрабатываются так же, как и целые: вы можете ис-
пользовать операторы ʫ, ʬ, *, ŵ, ŵŵ, **, ʩ и функцию ſƀ.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
Для того чтобы преобразовать другие типы в тип float, следует использовать
функцию ſƀ. Булевы значения по-прежнему обрабатываются как небольшие
числа:
ʴʴʴſƀ
ɨŜɥ
ʴʴʴſ ƀ
ɥŜɥ
При преобразовании целого числа типа int в число типа float просто добавля-
ется десятичная точка:
ʴʴʴſɰɯƀ
ɰɯŜɥ
ʴʴʴſɐɰɰɐƀ
ɰɰŜɥ
ǴȈȚȍȔȈȚȐȟȍșȒȐȍȜțȕȒȞȐȐ
Python поддерживает комплексные числа и имеет привычный набор математических
функций, таких как квадратный корень, косинус и т. д. Их рассмотрение отложим
до главы 22, в которой также обсудим применение Python в науке.
ǫȓȈȊȈǿȐșȓȈ
ǿȐȚȈȑȚȍȌȈȓȍȍ
В следующей главе мы наконец попрощаемся с однострочными примерами кода.
Вы научитесь принимать решения в коде с помощью утверждения if.
ǻȗȘȈȎȕȍȕȐȧ
В этой главе мы рассмотрели атомы Python: числа, строки и переменные. Выполним
с ними несколько небольших упражнений в интерактивном интерпретаторе.
3.1. Сколько секунд в часе? Используйте интерактивный интерпретатор как кальку-
лятор и умножьте количество секунд в минуте (60) на количество минут в часе
(тоже 60).
3.2. Присвойте результат вычисления предыдущего задания (секунды в часе) пере-
менной, которая называется ɏɏ.
3.3. Сколько секунд в сутках? Используйте переменную ɏɏ.
3.4. Снова посчитайте количество секунд в сутках, но на этот раз сохраните резуль-
тат в переменной ɏɏ.
3.5. Разделите значение переменной ɏɏ на значение переменной
ɏɏ, используя деление с плавающей точкой (ŵ).
3.6. Разделите значение переменной ɏɏ на значение переменной
ɏɏ, используя целочисленное деление (ŵŵ). Совпадает ли по-
лученный результат с ответом из предыдущего пункта без учета символов Ŝɥ
в конце?
ƋƓƈƊƈ
ǪȣȉȐȘȈȍȔșȗȖȔȖȡȤȦ
ȖȗȍȘȈȚȖȘȈLI
DzȖȔȔȍȕȚȐȘțȍȔșȗȖȔȖȡȤȦșȐȔȊȖȓȈ
Комментарий — это фрагмент текста в вашей программе, который будет проигно-
рирован интерпретатором Python. Вы можете использовать комментарии, чтобы
давать пояснение кода, делать какие-то пометки для себя или для чего-либо еще.
Комментарий помечается символом #: все, что после # и до конца текущей строки,
ǫȓȈȊȈǪȣȉȐȘȈȍȔșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈLI
Символ # имеет много имен: хеш, шарп, фунт или устрашающее октоторп.
Как бы вы его ни назвали, эффект # действует только до конца строки, на которой
он располагается.
Python не дает возможности написать многострочный комментарий. Каждую
строку или раздел комментария следует начинать с символа #:
ʴʴʴɤǿȠȢȗȧȥȞȔțȔȦȰțȘșȥȰȖȥșřȘȔȚșșȥȟȜȱȦȢȡșȡȤȔȖȜȦȥȳř
ŜŜŜɤȣȢȥȞȢȟȰȞȧȳțȔȭȜȭșȡȞȤȧȦȯȠ
ŜŜŜɤȢȞȦȢȦȢȤȣȢȠŜ
ŜŜŜ
ʴʴʴ
ǷȘȖȌȓȍȊȈȍȔșȚȘȖȒȐșȗȖȔȖȡȤȦșȐȔȊȖȓȈ?
Любая программа становится более удобочитаемой, если ее строки сравнительно
короткие. Рекомендуемая (но не обязательная) максимальная длина строки рав-
на 80 символам. Если вы не можете выразить свою мысль в рамках 80 символов,
воспользуйтесь символом продолжения Ɏ — просто поместите его в конце строки,
и дальше Python будет действовать так, как будто это все та же строка.
Например, если бы я хотел создать длинную строку из нескольких коротких,
я мог бы сделать это пошагово:
ʴʴʴʰɥ
ʴʴʴʫʰɨ
ʴʴʴʫʰɩ
ʴʴʴʫʰɪ
ʴʴʴʫʰɫ
ʴʴʴ
ɨɥ
ǹȘȈȊȕȐȊȈȍȔșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȖȊLIHOLIȐHOVH
И вот мы готовы сделать первый шаг к структурам кода, которые вводят данные
в программы. В качестве первого примера рассмотрим небольшую программу,
которая проверяет значение булевой переменной и выводит подходящий
комментарий:
ʴʴʴʰ
ʴʴʴś
ŜŜŜſɑŠɑƀ
ŜŜŜś
ŜŜŜſɑŠɑƀ
ŜŜŜ
Š
ʴʴʴ
ǭșȓȐȘȈȕȍȍȊȣȘȈȉȖȚȈȓȐșȌȘțȋȐȔȐȧȏȣȒȈȔȐȗȘȖȋȘȈȔȔȐȘȖȊȈȕȐȧȖȉȘȈȚȐȚȍȊȕȐȔȈ
ȕȐȍȕȈȚȖȟȚȖȏȌȍșȤȗȘȐȗȘȖȊȍȘȒȍLIșȚȈȊȐȚȤșȒȖȉȒȐȕȍȕțȎȕȖǵȈȗȘȐȔȍȘȕȍȕȈȌȖ
ȗȐșȈȚȤȟȚȖȚȖȊȘȖȌȍLI GLVDVWHU 7UXH ǪȒȖȕȞȍșȚȘȖȒȐșȓȍȌțȍȚȗȖșȚȈȊȐȚȤȌȊȖȍ
ȚȖȟȐȍ ǭșȓȐȊȣȒȈȒȐȕȖȋȌȈȐȧȏȈȉțȌȍȚȍȗȖșȚȈȊȐȚȤȌȊȖȍȚȖȟȐȍ3\WKRQȊȣȊȍȌȍȚ
șȖȖȉȡȍȕȐȍȖȉȖȠȐȉȒȍ
ǫȓȈȊȈǪȣȉȐȘȈȍȔșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈLI
ŜŜŜś
ŜŜŜſɑ ɐ ɑř ƀ
ŜŜŜ
ɐ
Обратите внимание на то, что для проверки на равенство используются два зна-
ка «равно» (ʰʰ). Помните, что один знак «равно» применяется для присваивания
значения переменной.
Если нужно выполнить несколько сравнений одновременно, можно использо-
вать логические (или булевы) операторы , or и not для определения итогового
логического результата.
Булевы операторы имеют более низкий приоритет по сравнению с фрагментами
кода, которые они сравнивают. Это значит, что результаты фрагментов сначала вы-
числяются, а затем сравниваются. Поскольку в данном примере мы устанавливаем
значение ȩ равным 7, проверка ɬ ʳ ȩ возвращает значение , проверка ȩ ʳ ɨɥ также
возвращает , поэтому наше выражение преобразуется в :
ʴʴʴɬʳandʳɨɥ
Если вы используете оператор для того, чтобы объединить несколько про-
верок, Python позволит вам сделать следующее:
ʴʴʴɬʳʳɨɥ
ǿȚȖȍșȚȤȐșȚȐȕȈ"
Что, если элемент, который мы проверяем, не является булевым? Чем Python счи-
тает и ?
Значение false не обязательно должно быть явно логическим . Например,
к приравниваются следующие значения:
булева переменная ;
значение ;
целое число ɥ;
число с плавающей точкой ɥŜɥ;
пустая строка (ɐ ɐ);
пустой список (ƃƄ);
пустой кортеж (ſƀ);
пустой словарь (Ƈƈ);
пустое множество (ſƀ).
Все остальные значения приравниваются к . Программы, написанные на
Python, используют это определение истинности или ложности, чтобы выполнять
проверку на пустоту структуры данных наряду с проверкой на равенство непосред-
ственно значению :
ʴʴʴɏʰƃƄ
ʴʴʴɏś
ŜŜŜſɑɐɑƀ
ŜŜŜś
ŜŜŜſɑ řɐŠɑƀ
ŜŜŜ
řɐŠ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǪȣȗȖȓȕȧȍȔȕȍșȒȖȓȤȒȖșȘȈȊȕȍȕȐȑ
șȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈLQ
Предположим, что у вас есть буква и вы хотите узнать, является ли она гласной.
Одним из вариантов решения может быть создание длинного утверждения if:
ʴʴʴʰɐɐ
ʴʴʴʰʰɐɐorʰʰɐɐorʰʰɐɐɎ
ŜŜŜorʰʰɐɐorʰʰɐɐś
ŜŜŜſřɐɐƀ
ŜŜŜś
ŜŜŜſřɐɐƀ
ŜŜŜ
ʴʴʴ
Каждый раз, когда вам нужно выполнить множество подобных сравнений, раз-
деленных ключевым словом or, используйте оператор членства in. В следующем
примере мы проверяем, является ли буква гласной, более «питонским» способом,
используя строку, состоящую целиком из гласных:
ʴʴʴʰɐɐ
ʴʴʴʰɐɐ
ʴʴʴin
ʴʴʴinś
ŜŜŜſřɐɐƀ
ŜŜŜ
ʴʴʴinɏ
ʴʴʴɏʰſɐɐřɐɐřɐɐřɐɐřɐɐƀ
ʴʴʴinɏ
ʴʴʴɏ ʰƇɐɐśɐɐřɐɐśɐɐř
ŜŜŜɐɐśɐɐřɐɐśɐ ɐřɐɐśɐ ɐƈ
ʴʴʴinɏ
ʴʴʴɏʰɑɑ
ʴʴʴinɏ
ǵȖȊȖȍ,$PWKH:DOUXV
В Python 3.8 появился оператор-морж, который выглядит следующим образом:
ȜȠȳśʰȖȯȤȔȚșȡȜș
1
Название песни группы The Beatles. — Примеч. пер.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǿȐȚȈȑȚȍȌȈȓȍȍ
Поговорим о строках и рассмотрим знаковые символы.
ǻȗȘȈȎȕȍȕȐȧ
4.1. Выберите число от 1 до 10 и присвойте его переменной . Выберите еще
одно число от 1 до 10 и присвойте его переменной guess. Далее напишите услов-
ные проверки (if, else и elif), чтобы вывести строку ɐ ɐ, если значение
переменной guess меньше 7, ɐ ɐ, если оно больше 7, и ɐ ɐ, если
равно .
4.2. Присвойте значения или переменным и green. Напишите не-
сколько утверждений if/else, которые выведут на экран информацию о том,
соответствуют ли заданным условиям следующие растения: вишня, горошек,
арбуз, тыква.
ƋƓƈƊƈ
ǺȍȒșȚȖȊȣȍșȚȘȖȒȐ
ǹȖȏȌȈȍȔșȚȘȖȒȐșȗȖȔȖȡȤȦȒȈȊȣȟȍȒ
Строка в Python создается заключением символов в парные одинарные или двойные
кавычки:
ʴʴʴɐɐ
ɐɐ
ʴʴʴɑ ɑ
ɐ ɐ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
Ǫ3\WKRQșțȡȍșȚȊțȍȚȕȍșȒȖȓȤȒȖȖșȖȉȣȝȚȐȗȖȊșȚȘȖȒȖȗȘȍȌȍȓȧȍȔȣȝȉțȒȊȖȑșȚȖȧȡȍȑ
ȗȍȘȍȌȗȍȘȊȖȑȒȈȊȣȟȒȖȑǹȉțȒȊȣIȐȓȐ)ȕȈȟȐȕȈȍȚșȧIșȚȘȖȒȈȒȖȚȖȘȈȧȐșȗȖȓȤȏțȍȚșȧ
ȌȓȧȜȖȘȔȈȚȐȘȖȊȈȕȐȧȖȕȈȖȗȐșȈȕȈȊȒȖȕȞȍȋȓȈȊȣǹȉțȒȊȣUȐȓȐ5ȕȈȟȐȕȈȍȚșȧȕȍȖȉ
ȘȈȉȖȚȈȕȕȈȧșȚȘȖȒȈ²ȖȕȈȐșȗȖȓȤȏțȍȚșȧȌȓȧȗȘȍȌȖȚȊȘȈȡȍȕȐȧșȖȏȌȈȕȐȧțȗȘȈȊȓȧȦȡȐȝ
șȐȔȊȖȓȖȊȊșȚȘȖȒȍ șȔȘȈȏȌȍȓ©ǹȖȏȌȈȍȔHVFDSHȗȖșȓȍȌȖȊȈȚȍȓȤȕȖșȚȐșȗȖȔȖȡȤȦ
șȐȔȊȖȓȈ?ªȕȈșȐȋȓȈȊțȊȒȖȚȖȘȖȑȘȈșșȒȈȏȣȊȈȍȚșȧȖȉȐȝȐșȗȖȓȤȏȖȊȈȕȐȐȗȘȐ
ȗȘȖȊȍȘȒȍȕȈșȖȖȚȊȍȚșȚȊȐȍȠȈȉȓȖȕț ǪȖȏȔȖȎȕȈȐȒȖȔȉȐȕȈȞȐȧIU ȈȚȈȒȎȍ)5)UȐȓȐ
I5 șȒȖȚȖȘȖȑȕȈȟȐȕȈȍȚșȧȕȍȖȉȘȈȉȖȚȈȕȕȈȧIșȚȘȖȒȈǩțȒȊȖȑXȏȈȗțșȒȈȍȚșȧșȚȘȖȒȈ
ȐȏșȐȔȊȖȓȖȊ8QLFRGHȈȕȈȓȖȋȐȟȕȈȧȗȘȖșȚȖȑșȚȘȖȒȍǹȉțȒȊȣEȕȈȟȐȕȈȍȚșȧȏȕȈȟȍȕȐȍ
ȖȉȢȍȒȚȈȚȐȗȈE\WHV șȔȋȓȈȊț ǭșȓȐȧȕȍțȗȖȔȐȕȈȦȖȌȐȕȐȏȥȚȐȝȖșȖȉȣȝȚȐȗȖȊ
ȏȕȈȟȐȚȘȍȟȤȐȌȍȚȖșȚȈȘȖȑȌȖȉȘȖȑȚȍȒșȚȖȊȖȑșȚȘȖȒȍșȖȌȍȘȎȈȡȍȑșȐȔȊȖȓȣ8QLFRGH
Зачем нужны два вида кавычек? Основная идея заключается в том, чтобы по-
зволить программисту создавать строки, содержащие символы кавычек. Вы можете
пользоваться одинарными кавычками внутри строк, созданных с помощью двойных
кавычек, и наоборот:
ʴʴʴɑɐřɐŜɐţɐŜɑ
ɑɐřɐŜɐţɐŜɑ
ʴʴʴɐ śɑŜɐ
ɐ śɑŜɐ
ʴʴʴɐɑɑ ɨɨŵɩɑʮɪɨŵɩɑŜɐ
ɐɑɑ ɨɨŵɩɑʮɪɨŵɩɑŜɐ
ʴʴʴɑɐɐŠɐ Ŝɑ
ɑɐɐŠɐ Ŝɑ
Допускается также использование трех одинарных (ɐɐɐ) или трех двойных ка-
вычек ("""):
ʴʴʴɐɐɐŠɐɐɐ
ɐɐ
ʴʴʴɑɑɑŠɑɑɑ
ɐŠɐ
Тройные кавычки не очень подходят для таких коротких строк. Обычно они ис-
пользуются для того, чтобы создавать многострочный текст наподобие следующего
классического стихотворения Эдварда Лира:
ʴʴʴʰɐɐɐř
ŜŜŜ Ś
ŜŜŜř
ŜŜŜ řɑţɑ
ŜŜŜ Ŝɐɐɐ
ʴʴʴ
Если вам не нужны пробелы или переход на новую строку, в главе 14 вы узнаете,
как от них избавиться.
Интерактивный интерпретатор выводит строку с одинарными кавычками
и управляющими символами, такими как Ɏ: это объясняется в разделе «Создаем
escape-последовательности с помощью символа \» далее в этой главе.
ʴʴʴɑɑɑɐ ř Šɐ
ŜŜŜŜɑɑɑ
ɑɐ ř ŠɐɎŜɑ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
Наконец, вам может понадобиться поработать с пустой строкой. В ней нет сим-
волов, но она совершенно корректна. Пустая строка создается с помощью любых
упомянутых ранее кавычек:
ʴʴʴɐɐ
ɐɐ
ʴʴʴɑɑ
ɐɐ
ʴʴʴɐɐɐɐɐɐ
ɐɐ
ʴʴʴɑɑɑɑɑɑ
ɐɐ
ʴʴʴ
ǹȖȏȌȈȍȔșȚȘȖȒȐșȗȖȔȖȡȤȦȜțȕȒȞȐȐVWU
Создать строку из другого типа данных можно с помощью функции ſƀ:
ʴʴʴſɰɯŜɭƀ
ɐɰɯŜɭɐ
ʴʴʴſɨŜɥɫƀ
ɐɨɥɥɥɥŜɥɐ
ʴʴʴſƀ
ɐɐ
ǹȖȏȌȈȍȔHVFDSHȗȖșȓȍȌȖȊȈȚȍȓȤȕȖșȚȐ
șȗȖȔȖȡȤȦșȐȔȊȖȓȈ?
Python позволяет использовать escape-последовательности внутри строк, чтобы
добиться эффекта, который по-другому выразить было бы трудно. Символ с раз-
мещенным перед ним обратным слешем (Ɏ) получает особое значение. Наиболее
распространена последовательность Ɏ, которая означает переход на новую строку.
С ее помощью можно создавать многострочные строки из однострочных:
ʴʴʴʰɐř\nř\n ś\nŜɐ
ʴʴʴſƀ
ř
ř
ś
Ŝ
ʴʴʴſɐ\t ɐƀ
ʴʴʴſɐ\t ɐƀ
ʴʴʴſɐ \tɐƀ
А если вам нужен обратный слеш, просто напечатайте два (первый из них экра-
нирует второй):
ʴʴʴ ʰɐ ſ\\ƀ Ŝɐ
ʴʴʴſ ƀ
ſɎƀ Ŝ
ʴʴʴ
ǶȉȢȍȌȐȕȧȍȔșȚȘȖȒȐșȐșȗȖȓȤȏȖȊȈȕȐȍȔșȐȔȊȖȓȈ
В Python вы можете объединить строки или строковые переменные с помощью
оператора ʫ, как показано далее:
ʴʴʴɐŠɐʫɐřŠɐ
ɐŠɐřŠɐ
Python сам не добавляет пробелы при конкатенации строк, поэтому в более ран-
них примерах нам нужно было явно проставлять пробелы. Python добавляет пробел
между каждым аргументом выражения ſƀ и символом новой строки в конце:
ʴʴʴʰɐ Ŝɐ
ʴʴʴʰ
ʴʴʴ ʰɐ Šɐ
ʴʴʴʫʫ
ɐ Ŝ Ŝ Šɐ
ʴʴʴſřř ƀ
Ŝ Ŝ Š
ǸȈȏȔȕȖȎȈȍȔșȚȘȖȒȐșȗȖȔȖȡȤȦșȐȔȊȖȓȈ
Оператор * можно использовать для того, чтобы размножить строку. Попробуйте
ввести в интерактивный интерпретатор следующие строки и посмотрите, что полу-
чится:
ʴʴʴʰɐɐƋɫʫɐɎɐ
ʴʴʴʰɐ ɐƋɪʫɐɎɐ
ʴʴʴʰɐ Ŝɐ
ʴʴʴſʫʫʫƀ
Обратите внимание на то, что оператор * имеет более высокий приоритет, чем ʫ,
поэтому строка будет размножена до того, как к ней добавится символ перехода на
новую строку.
ǫȓȈȊȈǺȍȒșȚȖȊȣȍșȚȘȖȒȐ
ǰȏȊȓȍȒȈȍȔșȐȔȊȖȓșȗȖȔȖȡȤȦșȐȔȊȖȓȖȊ>@
Для получения одного символа из строки укажите его смещение в квадратных
скобках после имени строки. Смещение первого (крайнего слева) символа равно 0,
следующего — 1 и т. д. Чтобы не считать, смещение последнего (крайнего справа)
символа можно указать как –1. В таком случае смещение последующих символов
будет равно –2, –3 и т. д.:
ʴʴʴʰɐ ɐ
ʴʴʴƃɥƄ
ɐɐ
ʴʴʴƃɨƄ
ɐɐ
ʴʴʴƃŞɨƄ
ɐɐ
ʴʴʴƃŞɩƄ
ɐɐ
ʴʴʴƃɩɬƄ
ɐɐ
ʴʴʴƃɬƄ
ɐɐ
Если вы укажете смещение, равное длине строки или больше (помните, смещения
идут от 0 к длине –1), сгенерируется исключение:
ʴʴʴƃɨɥɥƄ
ſ ƀś
ɑʳʴɑřɨřʳʴ
ś
ǰȏȊȓȍȒȈȍȔȗȖȌșȚȘȖȒȐ
ȐșȗȖȓȤȏțȧȘȈȏȌȍȓȍȕȐȍ
Из строки можно извлечь подстроку (часть строки) с помощью разделения.
Вы задаете разделение с помощью квадратных скобок, смещения начала подстро-
ки ȡȔȫȔȟȢ и смещения конца подстроки ȞȢȡșȪ, а также опционального размера шага
между ними ȬȔȗ. Некоторые из этих параметров могут быть пропущены. В подстроку
будут включены символы, расположенные от точки, на которую указывает смещение
ȡȔȫȔȟȢ, до точки, на которую указывает смещение ȞȢȡșȪ.
Оператор ƃśƄ извлекает всю последовательность от начала до конца.
Оператор ƃȡȔȫȔȟȢ śƄ извлекает последовательность с точки, на которую указы-
вает смещение ȡȔȫȔȟȢ, до конца.
Оператор ƃś ȞȢȡșȪƄ извлекает последовательность от начала до точки, на которую
указывает смещение ȞȢȡșȪ минус 1.
Оператор ƃȡȔȫȔȟȢ ś ȞȢȡșȪƄ извлекает последовательность с точки, на которую
указывает смещение ȡȔȫȔȟȢ, до точки, на которую указывает смещение ȞȢȡșȪ
минус 1.
Оператор ƃȡȔȫȔȟȢ ś ȞȢȡșȪ ś ȬȔȗƄ извлекает последовательность с точки, на кото-
рую указывает смещение ȡȔȫȔȟȢ, до точки, на которую указывает смещение ȞȢȡșȪ
минус 1, опуская символы, чье смещение внутри подстроки кратно ȬȔȗ.
Как и ранее, смещение слева направо определяется как 0, 1 и т. д., а справа на-
лево — как –1, –2 и т. д. Если вы не укажете смещение ȡȔȫȔȟȢ, функция будет ис-
пользовать в качестве его значения ɥ (начало строки). Если не укажете смещение
ȞȢȡșȪ, его значением будет считаться конец строки.
Создадим строку, содержащую английские буквы в нижнем регистре:
ʴʴʴʰɐ ɐ
ǰȏȔȍȘȧȍȔȌȓȐȕțșȚȘȖȒȐșȗȖȔȖȡȤȦȜțȕȒȞȐȐOHQ
До этого момента мы использовали специальные знаки, такие как ʫ, для работы
со строками. Но их не так уж и много. Теперь начнем использовать некоторые из
встроенных функций Python: именованные фрагменты кода, которые выполняют
определенные операции.
Функция ſƀ подсчитывает количество символов в строке:
ʴʴʴſƀ
ɩɭ
ʴʴʴʰɑɑ
ʴʴʴſƀ
ɥ
Функцию ſƀ можно использовать и для других типов последовательностей,
о чем мы поговорим в главе 7.
ǸȈȏȌȍȓȧȍȔșȚȘȖȒțșȗȖȔȖȡȤȦȜțȕȒȞȐȐVSOLW
В отличие от ſƀ, некоторые функции применимы только к строкам. Для того чтобы
использовать строковую функцию, следует ввести имя строки, точку, имя функции
и аргументы, которые нужны функции: ȥȦȤȢȞȔŜȨȧȡȞȪȜȳſȔȤȗȧȠșȡȦȯƀ. Более подробно
об этом поговорим в главе 9.
Встроенная функция ſƀ позволяет разбить строку на список строк меньшего
размера с использованием разделителя. Со списками вы познакомитесь в следующей
главе. Список — это последовательность значений, разделенных запятыми и заклю-
ченных в квадратные скобки:
ʴʴʴʰɐřř ř ɐ
ʴʴʴŜſɐřɐƀ
ƃɐɐřɐɐřɐ ɐřɐ ɐƄ
В предыдущем примере строка имела имя , а строковая функция называлась
ſƀ и имела один аргумент-разделитель ɐřɐ. Если вы не укажете разделитель,
ǫȓȈȊȈǺȍȒșȚȖȊȣȍșȚȘȖȒȐ
При вызове функции split без аргументов круглые скобки все равно надо ста-
вить — именно так Python понимает, что вы вызываете функцию.
ǶȉȢȍȌȐȕȧȍȔșȚȘȖȒȐșȗȖȔȖȡȤȦȜțȕȒȞȐȐMRLQ
Легко догадаться, что функция ſƀ является противоположностью функции
ſƀ : она объединяет список строк в одну строку. Вызов функции выглядит
немного запутанно, поскольку сначала вы указываете строку, которая объединяет
остальные, а затем — список строк для объединения: Ŝſƀ. Таким об-
разом, чтобы объединить строки списка lines, разделенные символами новой строки,
вам нужно написать ɐɎɐŜſƀ. В следующем примере мы объединим в спи-
сок несколько имен, разделив их запятыми и пробелами:
ʴʴʴ ɏʰƃɐɐřɐɐřɐ ɐƄ
ʴʴʴ ɏʰɐřɐŜſ ɏƀ
ʴʴʴſɐ śɐř ɏƀ
śřř
ǯȈȔȍȕȧȍȔșȐȔȊȖȓȣșȐșȗȖȓȤȏȖȊȈȕȐȍȔ
ȜțȕȒȞȐȐUHSODFH
Функция ſƀ предназначена для замены одной подстроки другой. Вы ука-
зываете старую подстроку, новую подстроку и то, сколько экземпляров старой
подстроки нужно заменить. Если вы пропустите последний аргумент, функция за-
менит все экземпляры. В этом примере только одна строка (ɐ ɐ) сопоставляется
и заменяется:
ʴʴʴʰɑ ŜŜŜɑ
ʴʴʴŜ ſɐ ɐřɐɐƀ
ɐŜŜŜɐ
ʴʴʴ
ɐ ŜŜŜɐ
Если вы точно знаете, какую подстроку или подстроки хотите заменить, функ-
ция ſƀ окажется для вас хорошим выбором. Но будьте осторожны: если бы
во втором примере вы заменили строку из одного символа ɐȔɐ, а не строку из двух
символов ɐȔ ɐ (после Ȕ идет пробел), символы ɐȔɐ заменились бы и в середине слов:
ʴʴʴŜ ſɐɐřɐɐřɨɥɥƀ
ɐ ŜŜŜɐ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
Иногда вам нужно убедиться в том, что подстрока является целым словом, на-
чалом слова и т. п. В такой ситуации понадобятся регулярные выражения. Они под-
робно описаны в главе 12.
ǻșȚȘȈȕȧȍȔșȐȔȊȖȓȣ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐVWULS
Нередко требуется убрать из строки начальные или конечные символы отступа, чаще
всего пробелы. Представленная здесь функция ſƀ подразумевает, что вы хотите
избавиться от символов-пробелов (ɐ ɐ, ɐɎɐ, ɐɎɐ), если только вы не предоставите
ей аргумент. Функция ſƀ удаляет символы с обоих концов строки, ſƀ —
только в начале, а ſƀ — только в конце. Давайте представим, что строковая
переменная содержит строку earth, окруженную пробелами:
ʴʴʴʰɑɑ
ʴʴʴŜſƀ
ɐɐ
ʴʴʴŜſɐɐƀ
ɐɐ
ʴʴʴŜſƀ
ɐɐ
ʴʴʴŜſƀ
ɐɐ
ǷȖȐșȒȐȊȣȉȖȘ
Python содержит большой набор функций для работы со строками. Рассмотрим
принцип работы самых распространенных из них. Тестовым объектом станет сле-
дующая строка, содержащая текст бессмертного стихотворения «What Is Liquid?»
Маргарет Кавендиш, герцогини Ньюкасл:
ʴʴʴʰɐɐɐ
Ś
Ŝ
ɐ
ɐřŜɐɐɐ
Вдохновляет!
Для начала получим первые 13 символов (их смещения лежат в диапазоне
от 0 до 12):
ʴʴʴƃśɨɪƄ
ɐɐ
Сколько символов содержит это стихотворение? (Пробелы и символы новой
строки учитываются.)
ʴʴʴſƀ
ɩɬɥ
Начинается ли стихотворение с All?
ʴʴʴŜſɐɐƀ
Заканчивается ли оно фразой That’s all, folks!?
ʴʴʴŜſɐɎɐřŠɐƀ
В Python есть два метода поиска смещения подстроки — ſƀ и ſƀ. У каж-
дого метода имеется возможность начинать поиск или с начала, или с конца. В случае
если подстрока присутствует в строке, они работают одинаково. Если подстрока
не найдена, метод ſƀ возвращает ʬɨ, а метод ſƀ генерирует исключение.
Найдем смещение первого появления в стихотворении слова the:
ʴʴʴʰɐɐ
ʴʴʴŜſƀ
ɮɪ
ʴʴʴŜſƀ
ɮɪ
А теперь — последнего:
ʴʴʴʰɐɐ
ʴʴʴŜſƀ
ɩɨɫ
ʴʴʴŜſƀ
ɩɨɫ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǸȍȋȐșȚȘ
В этом разделе мы рассмотрим еще несколько примеров использования встроенных
функций. В качестве тестовой выберем следующую строку:
ʴʴʴʰɐ ŜŜŜɐ
ǷȖșȒȖȓȤȒțșȚȘȖȒȐȕȍȐȏȔȍȕȧȍȔȣȕȐȊȖȌȕȖȔȐȏȥȚȐȝȗȘȐȔȍȘȖȊșȚȘȖȒȈVHWXSȕȈ
șȈȔȖȔȌȍȓȍȕȍȐȏȔȍȕȧȍȚșȧǷȘȖșȚȖȉȍȘȍȚșȧȏȕȈȟȍȕȐȍȗȍȘȍȔȍȕȕȖȑVHWXSȕȈȌȕȐȔ
ȊȣȗȖȓȕȧȍȚșȧȕȍȒȖȚȖȘȖȍȌȍȑșȚȊȐȍȈȏȈȚȍȔȘȍȏțȓȤȚȈȚȊȖȏȊȘȈȡȈȍȚșȧȊȊȐȌȍȕȖȊȖȑ
șȚȘȖȒȐ
ǪȣȘȈȊȕȐȊȈȕȐȍ
Теперь поработаем с функциями выравнивания. Строка выравнивается в пределах
указанного общего количества пробелов (в данном примере 30).
Отцентрируем строку в промежутке из 30 пробелов:
ʴʴʴŜ ſɪɥƀ
ɐ ŜŜŜɐ
А теперь по правому:
ʴʴʴŜſɪɥƀ
ɐ ŜŜŜɐ
ǼȖȘȔȈȚȐȘȖȊȈȕȐȍ
Вы уже видели, как можно конкатенировать строки с помощью оператора ʫ .
А теперь узнаете, как интерполировать данные в строки, используя разные форматы.
Этим приемом можно пользоваться, чтобы создавать отчеты и другие документы,
для которых важен определенный внешний вид.
Помимо функций, рассмотренных в предыдущем разделе, Python имеет три
способа форматирования строк:
старый стиль (поддерживается в Python 2 и 3);
новый стиль (Python 2.6 и выше);
f-строки (Python 3.6 и выше).
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǹȚȈȘȣȑșȚȐȓȤ
Старый стиль форматирования строк имеет форму ȥȦȤȢȞȔ % ȘȔȡȡȯș. Внутри строки
находятся интерполяционные последовательности. В табл. 5.1 показано, что самая
простая последовательность — это символ ʩ и буква. Буква указывает на тип данных,
которые должны быть отформатированы.
ǺȈȉȓȐȞȈǺȐȗȣȗȘȍȖȉȘȈȏȖȊȈȕȐȧ
V ǹȚȘȖȒȈ
%d Целое число в десятичной системе счисления
%x Целое число в шестнадцатеричной системе счисления
%o Целое число в восьмеричной системе счисления
%f Число с плавающей точкой в десятичной системе счисления
%e Число с плавающей точкой в шестнадцатеричной системе счисления
%g Число с плавающей точкой в восьмеричной системе счисления
%% Символ %
ǵȖȊȣȑșȚȐȓȤȐșȗȖȓȤȏțȍȔșȐȔȊȖȓȣ^`ȐȜțȕȒȞȐȦIRUPDW
Старый стиль форматирования все еще поддерживается, и в Python 2, который
остановился на версии 2.7, он будет поддерживаться всегда. В Python 3 применяется
новый стиль форматирования. Если у вас установлен Python 3.6 или выше, реко-
мендую воспользоваться f-строками (см. подраздел «Самый новый стиль: f-строки»
далее в этой главе).
Новый стиль форматирования имеет вид ȥȦȤȢȞȔŜſȘȔȡȡȯșƀ.
Строка формата выглядит немного иначе, чем в предыдущем подразделе. Про-
стейший пример использования этого стиля показан здесь:
ʴʴʴʰɐ ɐ
ʴʴʴɐƇƈɐŜſƀ
ɐ ɐ
ǫȓȈȊȈǺȍȒșȚȖȊȣȍșȚȘȖȒȐ
В следующем примере Ƈɥƈ — это первый аргумент функции ſƀ (словарь ):
ʴʴʴɐƇɥƃƄƈƇɥƃ ƄƈŜɐŜſƀ
ɐ Ŝɐ
ʴʴʴɐƇśʳɨɥƈƇśʳɨɥƈɐŜſř ƀ
ɐɐ
ʴʴʴɐƇśɋɨɥƈƇśɋɨɥƈɐŜſř ƀ
ɐɐ
ʴʴʴɐƇśʴɨɥƈƇśʴɨɥƈɐŜſř ƀ
ɐɐ
ʴʴʴɐƇśŠɋɨɥƈƇśŠɋɨɥƈɐŜſř ƀ
ɐŠŠŠŠŠŠŠŠɐ
ǹȈȔȣȑȕȖȊȣȑșȚȐȓȤIșȚȘȖȒȐ
На данный момент для форматирования строк рекомендуется использовать f-строки,
которые появились в версии Python 3.6.
Чтобы создать f-строку, нужно сделать следующее:
ввести букву f или перед первой кавычкой;
поместить имена переменной или выражения в фигурные скобки (Ƈƈ), чтобы их
значения попали в строку.
Этот способ форматирования похож на новый стиль, но здесь не задействованы
функция ſƀ, пустые скобки (Ƈƈ) и позиционные аргументы (Ƈɨƈ) в строке
формата.
ʴʴʴʰɐ ɐ
ʴʴʴ ʰɐɐ
ʴʴʴɐƇƈƇ ƈɐ
ɐ ɐ
Таким образом, то, что вы могли делать внутри функции ſƀ из предыду-
щего раздела, можно сделать и здесь внутри фигурных скобок в главной строке.
Это упрощает чтение.
Для f-строк используется такой же язык форматирования (ширина, заполнитель,
выравнивание), как и в новом стиле. Выражения размещаются после двоеточия:
ʴʴʴɐƇśʴɩɥƈƇ śŜɋɩɥƈɐ
ɐ ŜŜŜŜŜŜŜŜŜŜŜŜɐ
Этот прием также работает и для выражений. Каждое выражение будет выведено
полностью:
ʴʴʴɐƇƃŞɫśƄʰƈřƇ Ŝſƀʰƈɐ
ƃŞɫśƄʰɐ ɐř Ŝſƀʰɐɐ
ǫȓȈȊȈǺȍȒșȚȖȊȣȍșȚȘȖȒȐ
ǿȚȖȍȡȍȔȖȎȕȖȌȍȓȈȚȤșȖșȚȘȖȒȈȔȐ
В Python имеется гораздо больше функций для работы со строками, нежели
я сейчас описал. Некоторые из них мы рассмотрим в следующих главах (особенно
в главе 12), но описания всех можно найти в стандартной документации (KWWSELWO\
S\GRFVVWULQJV).
ǿȐȚȈȑȚȍȌȈȓȍȍ
Следующая глава посвящена циклам в Python.
ǻȗȘȈȎȕȍȕȐȧ
5.1. Напишите с заглавной буквы слово, которое начинается с буквы m:
ʴʴʴʰɑɑɑř
ŜŜŜ ř
ŜŜŜɐŞŠɑɑɑ
5.2. Выведите на экран все вопросы из списка, а также правильные ответы в таком
виде:
Q: вопрос
A: ответ
ʴʴʴʰƃ
ŜŜŜɑɐŜţɑř
ŜŜŜɑ ɐţɑř
ŜŜŜɑɐŠŠŠɐţɑ
ŜŜŜƄ
ʴʴʴʰƃ
ŜŜŜɑŜɑř
ŜŜŜɑř ɐŜɑř
ŜŜŜɑɐŠɐŜɑ
ŜŜŜƄ
ŜƇ ƈ
ƇƈƇƈŜ
Ƈƈř ƇƈŜ
ƇƈŜ
Ƈ ƈřř
Ƈ ƈʩƇƈŜ
Ŝ
ř
Ƈƈ
Ƈɏƈ
При всем при том, при всем при том, пускай бедны мы
с вами…
ǷȖȊȚȖȘȧȍȔȌȍȑșȚȊȐȧșȗȖȔȖȡȤȦȞȐȒȓȈZKLOH
Самым простым циклическим механизмом в Python является while. Попробуйте
запустить с помощью интерактивного интерпретатора следующий пример — это
простейший цикл, который выводит на экран значения от ɨ до ɬ:
ʴʴʴ ʰɨ
ʴʴʴ ʳʰɬś
ŜŜŜſ ƀ
ŜŜŜ ʫʰɨ
ŜŜŜ
ɨ
ɩ
ɪ
ɫ
ɬ
ʴʴʴ
ǷȘȍȘȣȊȈȍȔȞȐȒȓșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈEUHDN
Если вы хотите, чтобы цикл выполнялся до тех пор, пока что-то не произойдет,
однако вы не знаете точно, когда это событие случится, можно воспользоваться
бесконечным циклом, содержащим оператор . В этот раз мы прочитаем строку
с клавиатуры с помощью функции ſƀ, а затем выведем ее на экран, сделав
первую букву прописной. Цикл прервется, когда будет введена строка, содержащая
только букву q:
ʴʴʴś
ŜŜŜʰſɑ ƃƄśɑƀ
ŜŜŜʰʰɑɑś
ŜŜŜ
ŜŜŜſŜ ſƀƀ
ŜŜŜ
ƃƄś
ƃƄśř
ř
ƃƄś
ʴʴʴ
ǷȘȖȗțșȒȈȍȔȐȚȍȘȈȞȐȐȐșȗȖȓȤȏțȧȖȗȍȘȈȚȖȘFRQWLQXH
Иногда вам нужно не прерывать весь цикл, а пропустить по какой-либо причине
только одну итерацию. Рассмотрим пример: прочитаем целое число, и если оно
четное, выведем на экран его значение в квадрате, если же нечетное — пропустим
его. Мы даже добавим несколько комментариев. И вновь для выхода из цикла ис-
пользуем строку q:
ʴʴʴś
ŜŜŜʰſɑ řƃƄśɑƀ
ŜŜŜʰʰɐɐśɤȖȯȩȢȘ
ŜŜŜ
ŜŜŜʰſƀ
ŜŜŜʩɩʰʰɥśɤȡșȫșȦȡȢșȫȜȥȟȢ
ŜŜŜ
ŜŜŜſřɑɑřƋƀ
ŜŜŜ
řƃƄśɨ
ɨɨ
řƃƄśɩ
řƃƄśɪ
ɪɰ
ǫȓȈȊȈǹȖȏȌȈȍȔȞȐȒȓȣșȗȖȔȖȡȤȦȒȓȦȟȍȊȣȝșȓȖȊZKLOHȐIRU
řƃƄśɫ
řƃƄśɬ
ɬɩɬ
řƃƄś
ʴʴʴ
ǷȘȖȊȍȘȧȍȔȏȈȊȍȘȠȐȓșȧȓȐȞȐȒȓȘȈȕȤȠȍ
șȗȖȔȖȡȤȦȉȓȖȒȈHOVH
Если цикл while завершился нормально (без вызова ), управление передается
в опциональный блок else. Вы пользуетесь этим, когда кодируете цикл так, чтобы,
выполняя некоторую проверку, он прервался, как только проверка успешно выпол-
нится. Блок else запустится в том случае, если цикл while пройдет полностью, но
искомый объект так и не будет найден:
ʴʴʴʰƃɨřɪřɬƄ
ʴʴʴʰɥ
ʴʴʴʳſƀś
ŜŜŜʰƃƄ
ŜŜŜʩɩʰʰɥś
ŜŜŜſɐ ɐřƀ
ŜŜŜ
ŜŜŜʫʰɨ
ŜŜŜśɤȡșȖȯțȯȖȔșȠ
ŜŜŜſɐɐƀ
ŜŜŜ
ǺȈȒȖȍȐșȗȖȓȤȏȖȊȈȕȐȍȒȓȦȟȍȊȖȋȖșȓȖȊȈHOVHȔȖȎȍȚȗȖȒȈȏȈȚȤșȧȕȍȓȖȋȐȟȕȣȔǪȖșȗȘȐ
ȕȐȔȈȑȚȍȍȋȖȒȈȒȗȘȖȊȍȘȒțȕȈȗȘȍȘȣȊȈȕȐȍȞȐȒȓȈ
ǪȣȗȖȓȕȧȍȔȐȚȍȘȈȞȐȐșȐșȗȖȓȤȏȖȊȈȕȐȍȔ
ȒȓȦȟȍȊȣȝșȓȖȊIRUȐLQ
В Python итераторы часто используются по одной простой причине. Они позволяют
вам проходить структуры данных без знания того, насколько эти структуры велики
и как реализованы. Вы даже можете обратиться к данным, которые были созданы
во время работы программы. Это позволяет обрабатывать потоки данных, которые
в противном случае не поместились бы в память компьютера.
Чтобы продемонстрировать итерирование, нам нужно что-то, по чему можно про-
итерировать. Вы уже познакомились со строками в главе 5, но пока не знаете всей
информации о других итерабельных объектах, таких как списки и кортежи (глава 7)
или словари (глава 8). Сейчас я покажу два способа итерирования по строке, а ите-
рирование по другим типам рассмотрим в соответствующих главах.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
Однако существует более характерный для Python способ решения этой задачи:
ʴʴʴś
ŜŜŜſƀ
ŜŜŜ
t
h
u
ǷȘȍȘȣȊȈȍȔȞȐȒȓșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈEUHDN
Оператор прерывает цикл for точно так же, как и цикл while.
ʴʴʴʰɐɐ
ʴʴʴś
ŜŜŜʰʰɐɐś
ŜŜŜ
ŜŜŜſƀ
ŜŜŜ
t
h
ǷȘȖȗțșȒȈȍȔȐȚȍȘȈȞȐȐȐșȗȖȓȤȏțȧȖȗȍȘȈȚȖȘFRQWLQXH
Добавление ключевого слова в цикл for позволяет перейти на следующую
итерацию цикла, как и в случае с циклом while.
ǷȘȖȊȍȘȧȍȔȏȈȊȍȘȠȐȓșȧȓȐȞȐȒȓȘȈȕȤȠȍ
șȗȖȔȖȡȤȦȉȓȖȒȈHOVH
Как и в цикле while, в for имеется опциональный блок else, который проверяет,
выполнился ли цикл for полностью. Если ключевое слово не было вызвано,
будет выполнен блок else.
Это полезно в тех случаях, когда вам нужно убедиться в том, что предыдущий
цикл выполнился полностью, а не был прерван .
ǫȓȈȊȈǹȖȏȌȈȍȔȞȐȒȓȣșȗȖȔȖȡȤȦȒȓȦȟȍȊȣȝșȓȖȊZKLOHȐIRU
ʴʴʴʰɐɐ
ʴʴʴś
ŜŜŜʰʰɐɐś
ŜŜŜſɑŠɐɐŠɑƀ
ŜŜŜ
ŜŜŜſƀ
ŜŜŜś
ŜŜŜſɑɐɐŜɑƀ
ŜŜŜ
t
h
u
ɐɐ
DzȈȒȐȊȞȐȒȓȍZKLOHȊȞȐȒȓȍIRUȐșȗȖȓȤȏȖȊȈȕȐȍȉȓȖȒȈHOVHȔȖȎȍȚȗȖȒȈȏȈȚȤșȧȕȍȓȖȋȐȟ
ȕȣȔǴȖȎȕȖȘȈșșȔȈȚȘȐȊȈȚȤȞȐȒȓIRUȒȈȒȗȖȐșȒȟȍȋȖȓȐȉȖȈȗȖȧȊȓȍȕȐȍHOVH²ȒȈȒșȐȋȕȈȓ
ȟȚȖȊȣȕȐȟȍȋȖȕȍȕȈȠȓȐǿȚȖȉȣȗȖȓțȟȐȚȤȚȖȚȎȍȥȜȜȍȒȚȉȍȏȉȓȖȒȈHOVHȐșȗȖȓȤȏțȑȚȍ
ȗȍȘȍȔȍȕȕțȦȒȖȚȖȘȈȧȉțȌȍȚȗȖȒȈȏȣȊȈȚȤȕȈȠȍȓșȧȓȐȐșȒȖȔȣȑȥȓȍȔȍȕȚȊȞȐȒȓȍIRU
ǫȍȕȍȘȐȘțȍȔȟȐșȓȖȊȣȍȗȖșȓȍȌȖȊȈȚȍȓȤȕȖșȚȐ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐUDQJH
Функция ſƀ выбирает поток чисел в заданном диапазоне без необходимости
создавать и сохранять крупную структуру данных, такую как список или кортеж.
Это позволяет создавать большие диапазоны, не используя всю память на вашем
компьютере и не сбивая программу.
Функцию ſƀ можно применять так же, как функцию ſƀ: range(ȡȔȫȔȟȢř
ȞȢȡșȪř ȬȔȗƀ. Если вы опустите значение ȡȔȫȔȟȢ, диапазон начнется с ɥ. Обязательным
является только значение ȞȢȡșȪ: как и в случае со ſƀ, последнее учтенное зна-
чение будет прямо перед ȞȢȡșȪ. Значение по умолчанию ȬȔȗ равно ɨ, но вы можете
изменить его на ŷɨ.
Как и ſƀ, функция ſƀ возвращает итерабельный объект, поэтому вам
нужно пройти по значениям с помощью конструкции for ŜŜŜ in или преобразовать
объект в последовательность, такую как список. Создадим диапазон ɥ, ɨ, ɩ:
ʴʴʴſɥřɪƀś
ŜŜŜſƀ
ŜŜŜ
ɥ
ɨ
ɩ
ʴʴʴſſɥřɪƀƀ
ƃɥřɨřɩƄ
ŜŜŜ
ɩ
ɨ
ɥ
ʴʴʴſſɩřŞɨřŞɨƀƀ
ƃɩřɨřɥƄ
В следующем фрагменте кода шаг равен 2, что позволяет получить все четные
числа от 0 до 10:
ʴʴʴſſɥřɨɨřɩƀƀ
ƃɥřɩřɫřɭřɯřɨɥƄ
ǷȘȖȟȐȍȐȚȍȘȈȚȖȘȣ
В главе 14 рассматривается итерирование по файлам. В главе 10 вы увидите, как
использовать итерирование для объектов, которые вы сами определили. В главе 11
мы рассмотрим itertools — стандартный модуль Python, содержащий множество
удобных функций.
ǿȐȚȈȑȚȍȌȈȓȍȍ
В следующей главе мы объединим индивидуальные объекты в списки и кортежи.
ǻȗȘȈȎȕȍȕȐȧ
6.1. Используйте цикл for, чтобы вывести на экран значения списка ƃɪř ɩř ɨř ɥƄ.
6.2. Присвойте значение 7 переменной ɏ и значение ɨ переменной .
Напишите цикл while, который сравнивает переменные и ɏ.
Выведите строку ɐ ɐ, если значение переменной start меньше значе-
ния переменной ɏ. Если значение переменной равно значению
переменной ɏ, выведите строку ɐ Šɐ и выйдите из цикла. Если
значение переменной больше значения переменной ɏ, выведите
строку ɐɐ и выйдите из цикла. Увеличьте значение переменной на
выходе из цикла.
6.3. Присвойте значение ɬ переменной ɏ. Используйте цикл for для того,
чтобы проитерировать с помощью переменной по диапазону ſɨɥƀ.
Если значение переменной меньше, чем значение ɏ, выведите
на экран сообщение ɐ ɐ. Если оно равно значению ɏ — выведите
сообщение ɐ Šɐ, а затем выйдите из цикла. Если значение переменной
больше, чем ɏ, выведите на экран сообщение ɐɐ и выйдите
из цикла.
ƋƓƈƊƈ
DzȖȘȚȍȎȐȐșȗȐșȒȐ
В предыдущих главах мы говорили о базовых типах данных Python, таких как бу-
левы значения, целочисленные значения, числа с плавающей точкой и строки. Если
представлять их как атомы, то структуры данных, которые мы рассмотрим в этой
главе, можно назвать молекулами. Так и есть: мы объединим базовые типы в более
сложные структуры, которые вы будете использовать каждый день. Бо' льшая часть
работы программиста состоит из «разрезания» данных и «склеивания» их в конкрет-
ные формы, поэтому сейчас вы узнаете, как пользоваться ножовками и клеевыми
пистолетами.
Большинство языков программирования могут представлять последовательность
в виде объектов, проиндексированных по их позиции, выраженной целым числом:
первый, второй и далее до последнего. Вы уже знакомы со строками — последова-
тельностями символов.
В Python есть еще две структуры-последовательности: кортежи и списки. Они мо-
гут содержать ноль и более элементов. В отличие от строк в кортежах и списках
допускаются элементы разных типов: по факту каждый элемент может быть любым
объектом Python. Это позволяет создавать структуры любой сложности и глубины.
Почему же в Python имеются как списки, так и кортежи? Кортежи неизменяемы.
Когда вы включаете в кортеж элемент (всего один раз), он «запекается» и больше
не изменяется. Списки же можно изменять — добавлять и удалять элементы
в любой удобный момент. Я покажу вам множество примеров использования обоих
типов, сделав акцент на списках.
DzȖȘȚȍȎȐ
Давайте сразу же рассмотрим один очевидный вопрос. Вы могли слышать два
возможных варианта произношения слова tuple (кортеж). Какой же из них явля-
ется правильным? Гвидо ван Россум, создатель языка Python, написал в Twitter
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǹȖȏȌȈȍȔȒȖȘȚȍȎȐșȗȖȔȖȡȤȦȏȈȗȧȚȣȝ
ȐȖȗȍȘȈȚȖȘȈ
Синтаксис создания кортежей несколько необычен, что вы и увидите в следующих
примерах.
Начнем с создания пустого кортежа с помощью оператора ſƀ:
ʴʴʴɏʰſƀ
ʴʴʴɏ
ſƀ
Чтобы создать кортеж, содержащий один элемент и более, после каждого элемен-
та надо ставить запятую. Это вариант для кортежей с одним элементом:
ʴʴʴɏʰɐ ɐř
ʴʴʴɏ
ſɐ ɐřƀ
Однако следует иметь в виду: если в круглые скобки вы поместите один объект
и опустите при этом запятую, в результате вы получите не кортеж, а тот же самый
объект (в этом примере строку ɐ ɐ):
ʴʴʴɏʰſɐ ɐƀ
ʴʴʴɏ
ɐ ɐ
ʴʴʴſɏƀ
ʳ ɐɐʴ
Если в вашем кортеже более одного элемента, ставьте запятую после каждого из
них, кроме последнего:
ʴʴʴɏʰɐ ɐřɐ ɐřɐ ɐ
ʴʴʴɏ
ſɐ ɐřɐ ɐřɐ ɐƀ
При отображении кортежа Python выводит на экран скобки. Как правило, они
не нужны для определения кортежа, но с ними более безопасно, так как они делают
кортеж более заметным:
ʴʴʴɏʰſɐ ɐřɐ ɐřɐ ɐƀ
ʴʴʴɏ
ſɐ ɐřɐ ɐřɐ ɐƀ
ǫȓȈȊȈDzȖȘȚȍȎȐȐșȗȐșȒȐ
ǹȖȏȌȈȍȔȒȖȘȚȍȎȐșȗȖȔȖȡȤȦȜțȕȒȞȐȐWXSOH
Функция преобразования ſƀ создает кортежи из других объектов:
ʴʴʴɏʰƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴſɏƀ
ſɐ ɐřɐ ɐřɐ ɐƀ
ǶȉȢȍȌȐȕȧȍȔȒȖȘȚȍȎȐșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈ
Это похоже на объединение строк:
ʴʴʴſɐ ɐřƀʫſɐ ɐřɐ ɐƀ
ſɐ ɐřɐ ɐřɐ ɐƀ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǸȈȏȔȕȖȎȈȍȔȥȓȍȔȍȕȚȣșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈ
Принцип похож на многократное использование оператора ʫ:
ʴʴʴſɐɐřƀƋɪ
ſɐɐřɐɐřɐɐƀ
ǹȘȈȊȕȐȊȈȍȔȒȖȘȚȍȎȐ
Сравнение кортежей похоже на сравнение списков:
ʴʴʴʰſɮřɩƀ
ʴʴʴʰſɮřɩřɰƀ
ʴʴʴʰʰ
ʴʴʴʳʰ
ʴʴʴʳ
ǰȚȍȘȐȘțȍȔȗȖȒȖȘȚȍȎȈȔșȗȖȔȖȡȤȦIRUȐLQ
Итерирование по кортежам выполняется так же, как и итерирование по другим
типам:
ʴʴʴʰſɐɐřɐɐřɐɐřɐɐƀ
ʴʴʴś
ŜŜŜſƀ
ŜŜŜ
fresh
out
of
ǰȏȔȍȕȧȍȔȒȖȘȚȍȎ
Этого сделать вы не можете! Как и строки, кортежи неизменяемы. Но ранее вы
уже видели на примере строк, что можно сконкатенировать (объединить) кортежи
и создать таким образом новый кортеж:
ʴʴʴɨʰſɐ ɐřɐ ɐřɐ ɐƀ
ʴʴʴɩʰſɐ ɐřƀ
ʴʴʴɨʫɩ
ſɐ ɐřɐ ɐřɐ ɐřɐ ɐƀ
Это уже не тот же самый кортеж ɨ. Python создал новый кортеж из исходных
ɨ и ɩ и присвоил ему имя ɨ. С помощью ſƀ вы можете увидеть, когда имя пере-
менной будет указывать на новое значение:
ʴʴʴɨʰſɐ ɐřɐ ɐřɐ ɐƀ
ʴʴʴɩʰſɐ ɐřƀ
ʴʴʴſɨƀ
ɫɪɭɬɫɥɬɮɨɩ
ʴʴʴɨʫʰɩ
ʴʴʴſɨƀ
ɫɪɭɫɮɮɥɮɫɫ
ǹȗȐșȒȐ
Списки особенно удобны для хранения в них объектов в определенном порядке,
особенно если порядок или содержимое нужно будет изменить. В отличие от строк
список изменяем: вы можете добавить новые элементы, перезаписать существу-
ющие и удалить ненужные. Одно и то же значение может встречаться в списке
несколько раз.
ǹȖȏȌȈȍȔșȗȐșȒȐșȗȖȔȖȡȤȦșȒȖȉȖȒ>@
Список можно создать из нуля и более элементов, разделенных запятыми и заклю-
ченных в квадратные скобки:
ʴʴʴɏʰƃƄ
ʴʴʴʰƃɐɐřɐɐřɐɐřɐɐřɐ ɐƄ
ʴʴʴɏʰƃɐɐřɐ ɐřɐ ɐƄ
ʴʴʴɏʰƃɐ ɐřɐ ɐřɐɐřɐɐřɐ ɐƄ
ʴʴʴɏʰƃɩɥɥɥřɩɥɥɫřɩɥɥɯƄ
ʴʴʴʰƃɐɑřƇɑɑśɑɑƈřɑ Ŝɩɑƈ
ǭșȓȐȊȣȝȖȚȐȚȍȘȈȏȔȍȡȈȚȤȊȗȖșȓȍȌȖȊȈȚȍȓȤȕȖșȚȐȚȖȓȤȒȖțȕȐȒȈȓȤȕȣȍȏȕȈȟȍȕȐȧȐȊȈȔ
ȕȍȊȈȎȍȕȐȝȗȖȘȧȌȖȒȔȕȖȎȍșȚȊȖ VHW ȔȖȎȍȚȖȒȈȏȈȚȤșȧȉȖȓȍȍțȌȖȉȕȣȔȊȈȘȐȈȕȚȖȔ
ȟȍȔșȗȐșȖȒǪȗȘȍȌȣȌțȡȍȔȗȘȐȔȍȘȍșȗȐșȖȒELJBELUGVȊȗȖȓȕȍȔȖȋȉȣȚȤȔȕȖȎȍșȚȊȖȔ
ǶȔȕȖȎȍșȚȊȈȝȊȣȗȘȖȟȐȚȈȍȚȍȊȋȓȈȊȍ
ǹȖȏȌȈȍȔșȗȐșȖȒȐȓȐȗȘȍȖȉȘȈȏțȍȔȊșȗȐșȖȒșȗȖȔȖȡȤȦ
ȜțȕȒȞȐȐOLVW
Вы также можете создать пустой список с помощью функции ſƀ:
ʴʴʴɏɏʰſƀ
ʴʴʴɏɏ
ƃƄ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǹȖȏȌȈȍȔșȗȐșȖȒȐȏșȚȘȖȒȐșȐșȗȖȓȤȏȖȊȈȕȐȍȔȜțȕȒȞȐȐVSOLW
Как я упоминал в разделе «Разделяем строку с помощью функции split()» главы 5,
функцию ſƀ можно использовать для преобразования строки в список, указав
некую строку-разделитель:
ʴʴʴɏɏɏɏʰɐɰŵɨɰŵɩɥɨɰɐ
ʴʴʴɏɏɏɏŜſɐŵɐƀ
ƃɐɰɐřɐɨɰɐřɐɩɥɨɰɐƄ
ǷȖȓțȟȈȍȔȥȓȍȔȍȕȚșȗȖȔȖȡȤȦȒȖȕșȚȘțȒȞȐȐ>șȔȍȡȍȕȐȍ@
Как и в случае со строками, вы можете извлечь одно значение из списка, указав его
смещение:
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴƃɥƄ
ɐ ɐ
ʴʴʴƃɨƄ
ɐ ɐ
ʴʴʴƃɩƄ
ɐ ɐ
ǫȓȈȊȈDzȖȘȚȍȎȐȐșȗȐșȒȐ
ǹȔȍȡȍȕȐȍȌȖȓȎȕȖȉȣȚȤȌȖȗțșȚȐȔȣȔȌȓȧȥȚȖȋȖșȗȐșȒȈ²ȗȖȏȐȞȐȍȑȒȖȚȖȘȖȑȊȣȘȈȕȍȍ
ȗȘȐșȊȖȐȓȐȏȕȈȟȍȕȐȍǭșȓȐȊȣțȒȈȎȍȚȍȗȖȏȐȞȐȦȒȖȚȖȘȈȧȕȈȝȖȌȐȚșȧȗȍȘȍȌșȗȐșȒȖȔ
ȐȓȐȗȖșȓȍȕȍȋȖȉțȌȍȚșȋȍȕȍȘȐȘȖȊȈȕȖȐșȒȓȦȟȍȕȐȍ ȖȠȐȉȒȈ ǪȖȚȟȚȖșȓțȟȐȚșȧȍșȓȐ
ȔȣȗȖȗȘȖȉțȍȔȗȖȓțȟȐȚȤȠȍșȚȖȋȖȉȘȈȚȈǴȈȘȒș 0DU[HV șȔȍȡȍȕȐȍȘȈȊȕȖȍșȓȐ
șȟȐȚȈȚȤȖȚȕțȓȧ ȐȓȐȎȍȗȧȚȖȋȖȗȍȘȍȌșȗȐșȒȖȔ
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴƃɬƄ
ſ ƀś
ɑʳʴɑřɨřʳʴ
ś
ʴʴʴƃŞɬƄ
ſ ƀś
ɑʳʴɑřɨřʳʴ
ś
ǰȏȊȓȍȒȈȍȔȥȓȍȔȍȕȚȣșȗȖȔȖȡȤȦȘȈȏȌȍȓȍȕȐȧ
Можно извлечь из списка подсписок, использовав разделение (slice):
ʴʴʴʰƃɐ ɐřɐ řɐɐ ɐƄ
ʴʴʴƃɥśɩƄ
ƃɐ ɐřɐ ɐƄ
ǼțȕȒȞȐȧUHYHUVH ȐȏȔȍȕȧȍȚșȗȐșȖȒȕȖȕȍȊȖȏȊȘȈȡȈȍȚȍȋȖȏȕȈȟȍȕȐȧ
ǬȖȉȈȊȓȧȍȔȥȓȍȔȍȕȚȊȒȖȕȍȞșȗȐșȒȈ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐDSSHQG
Традиционный способ добавления элементов в список — вызов метода ſƀ,
который один за одним добавит их в конец списка. В предыдущих примерах мы за-
были о Zeppo, но ничего страшного не случилось, поскольку список можно изменить.
Добавим его прямо сейчас:
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴŜſɐɐƀ
ʴʴʴ
ƃɐ ɐřɐ ɐřɐ ɐřɐɐƄ
ǬȖȉȈȊȓȧȍȔȥȓȍȔȍȕȚȕȈȖȗȘȍȌȍȓȍȕȕȖȍȔȍșȚȖ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐLQVHUW
Функция ſƀ добавляет элементы только в конец списка. Когда вам нужно
добавить элемент и поставить его на заданную позицию, используйте функцию
ſƀ. Если вы укажете смещение ɥ, элемент будет добавлен в начало списка.
Если значение смещения выходит за пределы списка, элемент будет добавлен в ко-
ǫȓȈȊȈDzȖȘȚȍȎȐȐșȗȐșȒȐ
нец, как делает и функция ſƀ: таким образом, вам не нужно беспокоиться
о том, что Python сгенерирует исключение:
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴŜſɩřɐ ɐƀ
ʴʴʴ
ƃɐ ɐřɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴŜſɨɥřɐɐƀ
ʴʴʴ
ƃɐ ɐřɐ ɐřɐ ɐřɐ ɐřɐɐƄ
ǸȈȏȔȕȖȎȈȍȔȥȓȍȔȍȕȚȣșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈ
В главе 5 вы видели, что можно размножить символы строки с помощью оператора *.
Точно так же можно сделать и со списками:
ʴʴʴƃɑɑƄƋɪ
ƃɐɐřɐɐřɐɐƄ
ǶȉȢȍȌȐȕȧȍȔșȗȐșȒȐșȗȖȔȖȡȤȦȔȍȚȖȌȈH[WHQG
ȐȓȐȖȗȍȘȈȚȖȘȈ
Можно объединить один список с другим, используя ſƀ. Предположим, что
некий добрый человек дал нам новый список братьев Маркс, который называется
others, и мы хотим добавить его в основной список :
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐřɐɐƄ
ʴʴʴʰƃɐ ɐřɐɐƄ
ʴʴʴŜſƀ
ʴʴʴ
ƃɐ ɐřɐ ɐřɐ ɐřɐɐřɐ ɐřɐɐƄ
Это еще раз показывает, что список может содержать элементы разных типов.
В этом случае — четыре строки и список из двух строк.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǰȏȔȍȕȧȍȔȥȓȍȔȍȕȚșȗȖȔȖȡȤȦȒȖȕșȚȘțȒȞȐȐ>șȔȍȡȍȕȐȍ@
Так же как значение какого-либо элемента из списка можно получить по смещению,
его можно и изменить:
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴƃɩƄʰɐɐ
ʴʴʴ
ƃɐ ɐřɐ ɐřɐɐƄ
ǰȏȔȍȕȧȍȔȥȓȍȔȍȕȚȣșȗȖȔȖȡȤȦȘȈȏȌȍȓȍȕȐȧ
В предыдущем разделе вы увидели, как получить подсписок с помощью разделе-
ния. Помимо этого, с помощью разделения можно присвоить значения под-
списку:
ʴʴʴʰƃɨřɩřɪřɫƄ
ʴʴʴƃɨśɪƄʰƃɯřɰƄ
ʴʴʴ
ƃɨřɯřɰřɫƄ
ʴʴʴʰƃɨřɩřɪřɫƄ
ʴʴʴƃɨśɪƄʰƃƄ
ʴʴʴ
ƃɨřɫƄ
На самом деле то, что находится справа от оператора присваивания, может даже
не быть списком. Подойдет любой итерабельный объект, элементы которого можно
сделать элементами списка:
ʴʴʴʰƃɨřɩřɪřɫƄ
ʴʴʴƃɨśɪƄʰſɰɯřɰɰřɨɥɥƀ
ʴʴʴ
ƃɨřɰɯřɰɰřɨɥɥřɫƄ
ʴʴʴʰƃɨřɩřɪřɫƄ
ʴʴʴƃɨśɪƄʰɐţɐ
ʴʴʴ
ƃɨřɐɐřɐɐřɐɐřɐţɐřɫƄ
ǫȓȈȊȈDzȖȘȚȍȎȐȐșȗȐșȒȐ
ǻȌȈȓȧȍȔȏȈȌȈȕȕȣȑȥȓȍȔȍȕȚșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈGHO
Только что наши консультанты проинформировали нас о том, что Гуммо (Gummo)
был одним из братьев Маркс, а Карл (Karl) — не был, и кто бы ни добавил его ранее,
он поступил очень неосмотрительно. Давайте это исправим:
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐřɐ ɐřɐɐƄ
ʴʴʴƃŞɨƄ
ɐɐ
ʴʴʴƃŞɨƄ
ʴʴʴ
ƃɐ ɐřɐ ɐřɐ ɐřɐ ɐƄ
GHOȧȊȓȧȍȚșȧȖȗȍȘȈȚȖȘȖȔ3\WKRQȈȕȍȔȍȚȖȌȖȔșȗȐșȒȈ²ȕȍȓȤȏȧȕȈȗȐșȈȚȤPDU[HV>±@GHO
ȅȚȖșȊȖȍȋȖȘȖȌȈȖȉȘȈȚȕȖȍȗȘȐșȊȈȐȊȈȕȐȍȚȈȒȒȈȒGHOȊȣȗȖȓȕȧȍȚȗȘȖȚȐȊȖȗȖȓȖȎȕțȦ
ȗȘȐșȊȈȐȊȈȕȐȦ ȖȗȍȘȈȞȐȦȖȚȒȘȍȗȓȧȍȚȐȔȧȖȚȖȉȢȍȒȚȈ3\WKRQȐȔȖȎȍȚȖșȊȖȉȖȌȐȚȤ
ȔȍșȚȖȖȉȢȍȒȚȈȊȗȈȔȧȚȐȍșȓȐȥȚȖȐȔȧȧȊȓȧȓȖșȤȗȖșȓȍȌȕȍȑșșȣȓȒȖȑȕȈȕȍȋȖ
ǻȌȈȓȧȍȔȥȓȍȔȍȕȚȗȖȏȕȈȟȍȕȐȦ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐUHPRYH
Если вы не знаете точно или вам все равно, в какой позиции находится элемент,
используйте функцию ſƀ, чтобы удалить его по значению. Прощай, Groucho:
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴŜſɐ ɐƀ
ʴʴʴ
ƃɐ ɐřɐ ɐƄ
ǷȖȓțȟȈȍȔȐțȌȈȓȧȍȔȏȈȌȈȕȕȣȑȥȓȍȔȍȕȚ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐSRS
Получить элемент из списка и так же удалить его можно с помощью функции
ſƀ. Если вызвать функцию ſƀ и указать смещение, она возвратит элемент,
находящийся в заданной позиции. Если аргумент не указать, будет использовано
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
значение ŷɨ. Так, вызов ſɥƀ вернет начальный элемент списка, а вызов ſƀ или
ſʬɨƀ — конечный, как показано далее:
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐřɐɐƄ
ʴʴʴŜſƀ
ɐɐ
ʴʴʴ
ƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴŜſɨƀ
ɐ ɐ
ʴʴʴ
ƃɐ ɐřɐ ɐƄ
ǷȘȐȠȓȖ ȊȘȍȔȧ Ȍȓȧ ȒȖȔȗȤȦȚȍȘȕȖȋȖ ȎȈȘȋȖȕȈ ǵȍ ȊȖȓȕțȑȚȍșȤ ȥȚȖȋȖ ȕȍ ȉțȌȍȚ ȕȈ
ȐȚȖȋȖȊȖȔȥȒȏȈȔȍȕȍǭșȓȐȊȣȐșȗȖȓȤȏțȍȚȍȜțȕȒȞȐȦDSSHQG ȟȚȖȉȣȌȖȉȈȊȐȚȤȕȖ
ȊȣȍȥȓȍȔȍȕȚȣȊȒȖȕȍȞșȗȐșȒȈȐȜțȕȒȞȐȦSRS ȟȚȖȉȣțȌȈȓȐȚȤȟȚȖȓȐȉȖȐȏȒȖȕȞȈ
ȚȖȋȖȎȍșȗȐșȒȈȊȣȘȈȉȖȚȈȍȚȍșȖșȚȘțȒȚțȘȖȑȌȈȕȕȣȝȐȏȊȍșȚȕȖȑȒȈȒȖȟȍȘȍȌȤ/,)2
ODVWLQILUVWRXW²©ȗȖșȓȍȌȕȐȔȗȘȐȠȍȓȗȍȘȊȣȔțȠȍȓª ǭȍȟȈȡȍȕȈȏȣȊȈȦȚșȚȍȒȖȔ
ǪȣȏȖȊSRS șȖȏȌȈȍȚȖȟȍȘȍȌȤ),)2 ILUVWLQILUVWRXW²©ȗȍȘȊȣȔȗȘȐȠȍȓȗȍȘȊȣȔ
țȠȍȓª ȅȚȖțȌȖȉȕȣȑșȗȖșȖȉșȖȉȐȘȈȚȤȌȈȕȕȣȍȗȖȔȍȘȍȐȝȗȖșȚțȗȓȍȕȐȧȐȘȈȉȖȚȈȚȤ
ȓȐȉȖșșȈȔȣȔȐșȚȈȘȣȔȐ ),)2 ȓȐȉȖșșȈȔȣȔȐȕȖȊȣȔȐ /,)2
ǻȌȈȓȧȍȔȊșȍȥȓȍȔȍȕȚȣșȗȖȔȖȡȤȦȜțȕȒȞȐȐFOHDU
В Python 3.3 появился метод, позволяющий удалить все элементы из списка:
ʴʴʴɏʰƃɐţɐřɐ ŠɐřɐŠɐƄ
ʴʴʴɏ
ƃɐţɐřɐ ŠɐřɐŠɐƄ
ʴʴʴɏŜ ſƀ
ʴʴʴɏ
ƃƄ
ǶȗȘȍȌȍȓȧȍȔșȔȍȡȍȕȐȍȗȖȏȕȈȟȍȕȐȦ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐLQGH[
Если вы хотите узнать смещение элемента в списке по его значению, используйте
функцию ſƀ:
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐřɐɐƄ
ʴʴʴŜſɐ ɐƀ
ɨ
ǷȘȖȊȍȘȧȍȔȕȈȕȈȓȐȟȐȍȥȓȍȔȍȕȚȈȊșȗȐșȒȍ
șȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈLQ
В Python наличие элемента в списке проверяется с помощью оператора in:
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐřɐɐƄ
ʴʴʴɐ ɐ
ʴʴʴɐɐ
ǭșȓȐ Ȋȣ ȟȈșȚȖ ȗȘȖȊȍȘȧȍȚȍ ȕȈȓȐȟȐȍ ȥȓȍȔȍȕȚȈ Ȋ șȗȐșȒȍ Ȑ ȊȈȔ ȕȍȊȈȎȍȕ ȗȖȘȧȌȖȒ
ȥȓȍȔȍȕȚȖȊ ȚȖ Ȍȓȧ ȝȘȈȕȍȕȐȧ Ȑ ȗȖȐșȒȈ țȕȐȒȈȓȤȕȣȝ ȏȕȈȟȍȕȐȑ ȉȖȓȤȠȍ ȗȖȌȖȑȌȍȚ
ȔȕȖȎȍșȚȊȖǶȔȕȖȎȍșȚȊȈȝȔȣȗȖȋȖȊȖȘȐȔȟțȚȤȗȖȏȎȍȊȋȓȈȊȍ
ǷȖȌșȟȐȚȣȊȈȍȔȒȖȓȐȟȍșȚȊȖȊȒȓȦȟȍȕȐȑȏȕȈȟȍȕȐȧ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐFRXQW
Чтобы подсчитать, сколько раз какое-либо значение встречается в списке, исполь-
зуйте функцию ſƀ:
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴŜ ſɐ ɐƀ
ɨ
ʴʴʴŜ ſɐɐƀ
ɥ
ǷȘȍȖȉȘȈȏțȍȔșȗȐșȖȒȊșȚȘȖȒțșȗȖȔȖȡȤȦȜțȕȒȞȐȐMRLQ
В разделе «Объединяем строки с помощью функции join()» главы 5 функция ſƀ
рассматривается более подробно, но вот еще один пример того, что можно сделать
с ее помощью:
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴɐřɐŜſƀ
ɐ ř ř ɐ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǴȍȕȧȍȔȗȖȘȧȌȖȒȥȓȍȔȍȕȚȖȊșȗȖȔȖȡȤȦȜțȕȒȞȐȑVRUW
ȐȓȐVRUWHG
Часто вам будет нужно сортировать элементы в списке по значению, а не по смеще-
нию. Для этого Python предоставляет две функции:
функцию списка ſƀ, которая сортирует сам список;
общую функцию ſƀ, которая возвращает отсортированную копию списка.
Если элементы списка являются числами, они по умолчанию сортируются по
возрастанию. Если строками — сортируются в алфавитном порядке:
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴɏʰſƀ
ʴʴʴɏ
ƃɐ ɐřɐ ɐřɐ ɐƄ
Если все элементы списка одного типа (в списке находятся только стро-
ки), функция ſƀ отработает корректно. Иногда можно даже смешать типы, на-
ǫȓȈȊȈDzȖȘȚȍȎȐȐșȗȐșȒȐ
ǷȖȓțȟȈȍȔȌȓȐȕțșȗȐșȒȈșȗȖȔȖȡȤȦȜțȕȒȞȐȐOHQ
Функция ſƀ возвращает количество элементов списка:
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴſƀ
ɪ
ǷȘȐșȊȈȐȊȈȍȔșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈ
Когда вы присваиваете один список более чем одной переменной, изменение списка
в одном месте также меняет его и в других, как показано далее:
ʴʴʴʰƃɨřɩřɪƄ
ʴʴʴ
ƃɨřɩřɪƄ
ʴʴʴʰ
ʴʴʴ
ƃɨřɩřɪƄ
ʴʴʴƃɥƄʰɐɐ
ʴʴʴ
ƃɐɐřɩřɪƄ
ʴʴʴ
ƃɐ ɐřɩřɪƄ
ʴʴʴ
ƃɐ ɐřɩřɪƄ
DzȖȗȐȘțȍȔșȗȐșȒȐșȗȖȔȖȡȤȦȜțȕȒȞȐȑFRS\ ȐOLVW
ȐȓȐȗțȚȍȔȘȈȏȌȍȓȍȕȐȧ
Вы можете скопировать значения в отдельный новый список с помощью любого из
этих методов:
функции ſƀ;
функции преобразования ſƀ;
разделения списка ƃśƄ.
Оригинальный список снова будет присвоен переменной Ȕ. Мы создадим b с по-
мощью функции списка ſƀ, — с помощью функции преобразования ſƀ,
а — с помощью разделения списка:
ʴʴʴʰƃɨřɩřɪƄ
ʴʴʴʰŜ ſƀ
ʴʴʴ ʰſƀ
ʴʴʴʰƃśƄ
DzȖȗȐȘțȍȔȊșȍșȗȖȔȖȡȤȦȜțȕȒȞȐȐGHHSFRS\
Функция ſƀ хорошо работает, если все элементы списка являются неизменя-
емыми. Как вы видели ранее, изменяемые значения (например, списки, кортежи
или словари) являются ссылками. Изменение оригинала или копии отразится на
каждом из них.
Воспользуемся предыдущим примером, но в качестве последнего элемента спи-
ска a вместо целого числа ɪ используем список ƃɯř ɰƄ:
ʴʴʴʰƃɨřɩřƃɯřɰƄƄ
ʴʴʴʰŜ ſƀ
ʴʴʴ ʰſƀ
ʴʴʴʰƃśƄ
ǫȓȈȊȈDzȖȘȚȍȎȐȐșȗȐșȒȐ
ʴʴʴ
ƃɨřɩřƃɯřɰƄƄ
ʴʴʴ
ƃɨřɩřƃɯřɰƄƄ
ʴʴʴ
ƃɨřɩřƃɯřɰƄƄ
ʴʴʴ
ƃɨřɩřƃɯřɰƄƄ
Значение элемента ƃɩƄ теперь является списком, и его элементы могут быть
изменены. Все методы копирования списков, которые мы уже рассмотрели, были
поверхностными: это не оценочное суждение — речь идет именно о том, насколько
глубоко распространяется копирование.
Для того чтобы это исправить, нужно использовать функцию ſƀ:
ʴʴʴ
ʴʴʴʰƃɨřɩřƃɯřɰƄƄ
ʴʴʴʰ Ŝ ſƀ
ʴʴʴ
ƃɨřɩřƃɯřɰƄƄ
ʴʴʴ
ƃɨřɩřƃɯřɰƄƄ
ʴʴʴƃɩƄƃɨƄʰɨɥ
ʴʴʴ
ƃɨřɩřƃɯřɨɥƄƄ
ʴʴʴ
ƃɨřɩřƃɯřɰƄƄ
ǹȘȈȊȕȐȊȈȍȔșȗȐșȒȐ
Сравнить списки можно с помощью операторов сравнения, таких как ʰʰ, ʳ и дру-
гие. Операторы проходят по обоим спискам, сравнивая элементы с одинаковым
смещением. Если список a короче списка b и все элементы списка a присутствуют
в списке b, будет считаться, что список a меньше списка b:
ʴʴʴʰƃɮřɩƄ
ʴʴʴʰƃɮřɩřɰƄ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ʴʴʴʰʰ
ʴʴʴʳʰ
ʴʴʴʳ
ǰȚȍȘȐȘțȍȔȗȖșȗȐșȒȈȔșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȖȊIRUȐLQ
Из главы 6 вы узнали, как можно проитерировать по строке с помощью цикла for.
Однако гораздо чаще доводится выполнять итерирование по спискам:
ʴʴʴ ʰƃɐɐřɐɐřɐɐƄ
ʴʴʴ ś
ŜŜŜſ ƀ
ŜŜŜ
brie
havarti
Как и раньше, ключевое слово завершает выполнение цикла for, а ключевое
слово позволяет перейти к следующей итерации:
ʴʴʴ ʰƃɐɐřɐɐřɐɐƄ
ʴʴʴ ś
ŜŜŜ Ŝſɐɐƀś
ŜŜŜſɑ ɐɐɐɑƀ
ŜŜŜ
ŜŜŜś
ŜŜŜſ ƀ
ŜŜŜ
brie
ɐɐɐ
Если цикл for не отработал ни разу, выполнение также продолжится в блоке else:
ʴʴʴ ʰƃƄ
ʴʴʴ ś
ŜŜŜſɐɐř ƀ
ŜŜŜ
ŜŜŜśɤȢȦȥȧȦȥȦȖȜșȢțȡȔȫȔșȦȢȦȥȧȦȥȦȖȜșȥȯȤȔ
ŜŜŜſɐ řţɐƀ
ŜŜŜ
řţ
Поскольку список в этом примере был пуст, цикл for in
ни разу не отработал, а оператор не был применен.
ǰȚȍȘȐȘțȍȔȗȖȕȍșȒȖȓȤȒȐȔȗȖșȓȍȌȖȊȈȚȍȓȤȕȖșȚȧȔ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐ]LS
Есть еще один хороший прием — параллельное итерирование по нескольким по-
следовательностям с помощью функции ſƀ:
ʴʴʴʰƃɐɐřɐɐřɐɐƄ
ʴʴʴʰƃɐɐřɐɐřɐ ɐƄ
ʴʴʴʰƃɐ ɐřɐɐřɐɐƄ
ʴʴʴʰƃɐɐřɐ ɐřɐɐřɐɐƄ
ʴʴʴřřřſřřřƀś
ŜŜŜſřɑśɑřřɑɑřřɑɑřƀ
ŜŜŜ
ś ŹŹ
śŹŹ
śŹ Ź
Функция ſƀ прекратит свою работу, когда будет выполнена самая короткая
последовательность. Один из списков () оказался длиннее остальных, по-
этому никто не получит пудинг, пока мы не увеличим остальные списки.
В главе 8 показывается, как с помощью функции ſƀ можно создавать словари
из двухэлементных последовательностей, таких как кортежи, списки или строки.
Функция ſƀ позволяет пройти по нескольким последовательностям и создать
кортежи из элементов с одинаковым смещением. Создадим два кортежа из соот-
ветствующих друг другу английских и французских слов:
ʴʴʴʰɐɐřɐɐřɐɐ
ʴʴʴ ʰɐɐřɐɐřɐ ɐ
ǹȖȏȌȈȍȔșȗȐșȖȒșȗȖȔȖȡȤȦșȗȐșȒȖȊȣȝȊȒȓȦȟȍȕȐȑ
Вы уже знаете, что список можно создать с помощью квадратных скобок и функции
ſƀ. Сейчас мы рассмотрим создание списка с помощью списковых включений
(их еще называют генераторами списков, представлением списков и т. д.): этот
механизм использует итерирование с помощью ключевых слов for/in, которое мы
только что рассмотрели.
Вы можете создать список целых чисел от 1 до 5, добавляя их по одному, напри-
мер так:
ʴʴʴɏʰƃƄ
ʴʴʴɏŜſɨƀ
ʴʴʴɏŜſɩƀ
ʴʴʴɏŜſɪƀ
ʴʴʴɏŜſɫƀ
ʴʴʴɏŜſɬƀ
ʴʴʴɏ
ƃɨřɩřɪřɫřɬƄ
Все эти приемы абсолютно корректны с точки зрения Python и приводят к одина-
ковому результату. Однако более характерным для Python является создание списка
с помощью списковых включений. Простейшая форма такого включения выглядит
следующим образом:
ƃȖȯȤȔȚșȡȜșȱȟșȠșȡȦȜȦșȤȔȕșȟȰȡȯȝȢȕȮșȞȦƄ
Первая переменная нужна для формирования значений для списка, то есть
для размещения результата работы цикла в переменной ɏ. Вторая пере-
ǫȓȈȊȈDzȖȘȚȍȎȐȐșȗȐșȒȐ
менная является частью цикла for. Чтобы показать, что первая переменная
является выражением, попробуем такой вариант:
ʴʴʴɏʰƃŞɨſɨřɭƀƄ
ʴʴʴɏ
ƃɥřɨřɩřɪřɫƄ
Наконец, точно так же, как и при работе с вложенными циклами, можно написать
более чем один набор операторов for ŜŜŜ в соответствующем включении. Чтобы про-
демонстрировать это, сначала создадим старый добрый вложенный цикл и выведем
на экран результат:
ʴʴʴʰſɨřɫƀ
ʴʴʴ ʰſɨřɪƀ
ʴʴʴś
ŜŜŜ ś
ŜŜŜſř ƀ
ŜŜŜ
ɨɨ
ɨɩ
ɩɨ
ɩɩ
ɪɨ
ɪɩ
ŜŜŜſ ƀ
ŜŜŜ
ſɨřɨƀ
ſɨřɩƀ
ſɩřɨƀ
ſɩřɩƀ
ſɪřɨƀ
ſɪřɩƀ
Фрагменты for row ŜŜŜ и for ŜŜŜ в списковом включении также могут иметь
свои проверки if.
ǹȗȐșȒȐșȗȐșȒȖȊ
Списки могут содержать элементы различных типов, в том числе и другие списки,
как показано далее:
ʴʴʴɏʰƃɐɐřɐ ɐƄ
ʴʴʴ ɏʰƃɐɐřɐɐřɐɐƄ
ʴʴʴ ɏʰƃɪřɐ ɐřɩřɐɐƄ
ʴʴʴɏʰƃɏř ɏřɐ ɐř ɏƄ
Это второй указанный нами элемент, ɏ. Если нам понадобится по-
лучить первый элемент списка ɏ, извлечь его из списка ɏ мы
можем, указав два индекса:
ʴʴʴɏƃɨƄƃɥƄ
ɐɐ
DzȖȘȚȍȎȐȐȓȐșȗȐșȒȐ"
Вместо списков можно использовать кортежи, однако у них меньше возможно-
стей — нет функций ſƀ, ſƀ и т. д., поскольку кортеж не может быть
изменен после создания. Почему бы тогда не работать всегда со списками вместо
кортежей?
Кортежи занимают меньше места.
Вы не сможете уничтожить элементы кортежа по ошибке.
Вы можете использовать кортежи в качестве словарных ключей (см. главу 8).
Именованные кортежи (см. раздел «Именованные кортежи» в главе 10) могут
служить более простой альтернативой объектам.
Здесь я не буду вдаваться в подробности использования кортежей. Чаще при
решении повседневных задач вам доведется обращаться именно к спискам и сло-
варям.
ǪȒȓȦȟȍȕȐȑȒȖȘȚȍȎȍȑȕȍșțȡȍșȚȊțȍȚ
Изменяемые типы (списки, словари и множества) имеют включения. Неизменяе-
мые типы, такие как строки и кортежи, нужно создавать другими методами, описан-
ными в соответствующих разделах.
Вы можете подумать, что замена квадратных скобок спискового включения
круглыми скобками создаст кортежное включение. Может даже показаться, что это
работает, поскольку исключение не сгенерируется:
ʴʴʴɏʰſſɨřɭƀƀ
ǿȐȚȈȑȚȍȌȈȓȍȍ
Следующие темы — словари и множества — настолько объемные, что заслужили
отдельную главу.
ǻȗȘȈȎȕȍȕȐȧ
Используйте списки и кортежи из чисел (глава 3) и строки (глава 3), чтобы пред-
ставить самые разные элементы реального мира.
7.1. Создайте список ɏ, содержащий год, в который вы родились, и каждый
последующий год вплоть до вашего пятого дня рождения. Например, если вы
родились в 1980 году, список будет выглядеть так: ɏ ʰ ƃɨɰɯɥř ɨɰɯɨř
ɨɰɯɩř ɨɰɯɪř ɨɰɯɫř ɨɰɯɬƄ.
Если вам меньше пяти лет, но вы уже читаете эту книгу, то я даже не знаю, что
сказать.
7.2. В какой год из списка ɏ был ваш третий день рождения? Учтите,
в первый год вам было 0 лет.
7.3. В какой год из списка ɏ вам было больше всего лет?
7.4. Создайте список things, содержащий три элемента: ɑɑ, ɑ ɑ,
ɑɑ.
7.5. Напишите с большой буквы тот элемент списка things, который означает чело-
века, а затем выведите список. Изменился ли элемент списка?
7.6. Переведите сырный элемент списка things в верхний регистр целиком и вы-
ведите список.
7.7. Удалите из списка things заболевание, получите Нобелевскую премию и затем
выведите список на экран.
7.8. Создайте список с элементами ɑ ɑ , ɑ ɑ и ɑ ɑ ; назовите его
surprise.
7.9. Напишите последний элемент списка surprise со строчной буквы, затем вы-
ведите эту строку в обратном порядке и с прописной буквы.
7.10. Используйте списковое включение, чтобы создать список с именем even, в ко-
тором будут содержаться четные числа в промежутке ſɨɥƀ.
7.11. Попробуйте создать генератор рифм для прыжков через скакалку. Напечатайте
последовательность двухстрочных рифм. Начните программу с этого фраг-
мента:
ɨʰƃɑɑřɑɑřɑɑƄ
ʰƃ
ſɑɑřɑɑƀř
ſɑɑřɑɑƀř
ſɑɑřɑɑƀř
ſɑɑřɑ ɑƀř
ſɑɑřɑ ɑƀř
ǫȓȈȊȈDzȖȘȚȍȎȐȐșȗȐșȒȐ
ſɑɑřɑɑƀř
ſɑɑřɑɐɑƀř
Ƅ
ɩʰɑɑ
Стивен Райт
ǹȓȖȊȈȘȐ
Словарь очень похож на список, но порядок элементов в нем не имеет значения и они
не выбираются смещением, таким как 0 и 1. Вместо этого для каждого значения вы
указываете связанный с ним уникальный ключ. Этот ключ чаще всего представляет
собой строку, но, в принципе, может быть любым из неизменяемых типов: булевой
переменной, целым числом, числом с плавающей точкой, кортежем, строкой, а также
другими объектами, с которыми вы познакомитесь далее. Словари являются изме-
няемыми, а это значит, что вы можете добавить, удалить и изменить их элементы,
имеющие вид «ключ — значение».
Если вы работали с другими языками программирования, которые поддерживают
только массивы и списки, то полюбите словари.
ǹȖȏȌȈȍȔșȓȖȊȈȘȤșȗȖȔȖȡȤȦ^`
Чтобы создать словарь, нужно заключить в фигурные скобки (Ƈƈ) разделенные за-
пятыми пары ȞȟȲȫ : țȡȔȫșȡȜș. Самым простым словарем является пустой словарь,
не содержащий ни ключей, ни значений:
ʴʴʴɏ ʰƇƈ
ʴʴʴɏ
Ƈƈ
ǫȓȈȊȈǹȓȖȊȈȘȐȐȔȕȖȎȍșȚȊȈ
Ǫ3\WKRQȌȖȗțșȒȈȍȚșȧȕȈȓȐȟȐȍȏȈȗȧȚȖȑȗȖșȓȍȗȖșȓȍȌȕȍȋȖȥȓȍȔȍȕȚȈșȗȐșȒȈȒȖȘȚȍȎȈ
ȐȓȐșȓȖȊȈȘȧDzȘȖȔȍȚȖȋȖȕȍȖȉȧȏȈȚȍȓȤȕȖȌȍȓȈȚȤȖȚșȚțȗȣȒȈȒȌȍȓȈȓȧȊȗȘȍȌȣȌț
ȡȍȔȗȘȐȔȍȘȍȒȖȋȌȈȊȣȊȊȖȌȐȚȍȒȓȦȟȐȐȏȕȈȟȍȕȐȧȊȕțȚȘȐȜȐȋțȘȕȣȝșȒȖȉȖȒ²ȥȚȖ
ȗȘȖșȚȖțȓțȟȠȈȍȚȟȐȚȈȉȍȓȤȕȖșȚȤ
ǹȖȏȌȈȍȔșȓȖȊȈȘȤșȗȖȔȖȡȤȦȜțȕȒȞȐȐGLFW
Некоторым людям не нравится печатать так много фигурных скобок и кавычек.
И вы можете создать словарь, передав именованные аргументы и значения в функ-
цию ſƀ.
Традиционный способ создания словаря:
ʴʴʴ ɏ ʰƇɐɐśɐɐřɐɐśɐɐřɐɐśɐɐƈ
ʴʴʴ ɏ
Ƈɐɐśɐɐřɐɐśɐɐřɐɐśɐɐƈ
С использованием ſƀ:
ʴʴʴ ɏ ʰ ſʰɑɑřʰɑɑřʰɑɑƀ
ʴʴʴ ɏ
Ƈɐɐśɐɐřɐɐśɐɐřɐɐśɐɐƈ
ǷȘȍȖȉȘȈȏțȍȔșȗȖȔȖȡȤȦȜțȕȒȞȐȐGLFW
С помощью функции ſƀ можно преобразовывать двузначные последователь-
ности в словари. (Иногда вы можете столкнуться с такими последовательностями
«ключ — значение», как «Стронций, 90, углерод, 14»1.) Первый элемент каждой по-
следовательности применяется как ключ, второй — как значение.
Для начала рассмотрим небольшой пример использования lol — списка, состо-
ящего из двузначных списков:
ʴʴʴʰƃƃɐɐřɐɐƄřƃɐ ɐřɐɐƄřƃɐɐřɐɐƄƄ
ʴʴʴ ſƀ
Ƈɐ ɐśɐɐřɐɐśɐɐřɐɐśɐɐƈ
ǬȖȉȈȊȓȧȍȔȐȓȐȐȏȔȍȕȧȍȔȥȓȍȔȍȕȚșȗȖȔȖȡȤȦ
ȒȖȕșȚȘțȒȞȐȐ>ȒȓȦȟ@
Добавить элемент в словарь довольно легко. Просто обратитесь к элементу по его
ключу и присвойте ему значение. Если ключ уже существует в словаре, имеющееся
значение будет заменено новым. Если ключ новый, он и указанное значение будут
добавлены в словарь. В отличие от списков, здесь вам не нужно беспокоиться о том,
1
Очень похоже на финальный счет матча «Стронций» — «Углерод».
ǫȓȈȊȈǹȓȖȊȈȘȐȐȔȕȖȎȍșȚȊȈ
ǷȖȓțȟȈȍȔȥȓȍȔȍȕȚșȓȖȊȈȘȧșȗȖȔȖȡȤȦ
ȒȖȕșȚȘțȒȞȐȐ>ȒȓȦȟ@ȐȓȐȜțȕȒȞȐȐJHW
Этот вариант использования словаря — самый распространенный. Вы указываете
словарь и ключ, чтобы получить соответствующее значение. Применим ɏ
из предыдущего подраздела:
ʴʴʴɏƃɐ ɐƄ
ɐɐ
ǷȖȓțȟȈȍȔȊșȍȒȓȦȟȐ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐNH\V
Вы можете использовать функцию ſƀ , чтобы получить все ключи словаря.
Для следующих примеров обратимся к другому словарю:
ʴʴʴʰƇɐɐśɐɐřɐɐśɐɐřɐɐśɐ ɐƈ
ʴʴʴŜſƀ
ɏſƃɐɐřɐɐřɐɐƄƀ
ǫȓȈȊȈǹȓȖȊȈȘȐȐȔȕȖȎȍșȚȊȈ
ʴʴʴſŜſƀƀ
ƃɐɐřɐɐřɐɐƄ
ǷȖȓțȟȈȍȔȊșȍȏȕȈȟȍȕȐȧșȗȖȔȖȡȤȦȜțȕȒȞȐȐYDOXHV
Чтобы получить все значения словаря, используйте функцию ſƀ:
ʴʴʴſŜſƀƀ
ƃɐɐřɐ ɐřɐɐƄ
ǷȖȓțȟȈȍȔȊșȍȗȈȘȣ©ȒȓȦȟ²ȏȕȈȟȍȕȐȍª
șȗȖȔȖȡȤȦȜțȕȒȞȐȐLWHPV
Когда вам нужно получить все пары «ключ — значение» из словаря, используйте
функцию ſƀ:
ʴʴʴſŜſƀƀ
ƃſɐɐřɐɐƀřſɐɐřɐ ɐƀřſɐɐřɐɐƀƄ
ǷȖȓțȟȈȍȔȌȓȐȕțșȓȖȊȈȘȧșȗȖȔȖȡȤȦȜțȕȒȞȐȐOHQ
Количество пар «ключ — значение» определяется так:
ʴʴʴſƀ
ɪ
ǶȉȢȍȌȐȕȧȍȔșȓȖȊȈȘȐșȗȖȔȖȡȤȦȒȖȕșȚȘțȒȞȐȐ^ D E`
В версиях Python 3.5 и выше есть новый способ объединять словари с помощью
конструкции **, которая в главе 9 применяется совершенно по-иному:
ʴʴʴʰƇɐɐśɐɐřɐɐśɐɐƈ
ʴʴʴ ʰƇɐɐśɐɐřɐ ɐśɐ ɐƈ
ʴʴʴƇƋƋřƋƋ ƈ
Ƈɐɐśɐɐřɐɐśɐɐřɐ ɐśɐ ɐƈ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǶȉȢȍȌȐȕȧȍȔșȓȖȊȈȘȐ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐXSGDWH
Вы можете использовать функцию ſƀ, чтобы скопировать ключи и значения
из одного словаря в другой.
Определим словарь pythons, содержащий имена всех участников:
ʴʴʴʰƇ
ŜŜŜɐɐśɐ ɐř
ŜŜŜɐɐśɐ ɐř
ŜŜŜɐ ɐśɐɐř
ŜŜŜɐ ɐśɐ ɐř
ŜŜŜɐ ɐśɐɐř
ŜŜŜɐɐśɐ ɐř
ƈ
ʴʴʴ
Ƈɐɐśɐ ɐřɐɐśɐ ɐřɐ ɐśɐɐř
ɐ ɐśɐ ɐřɐ ɐśɐɐřɐɐśɐ ɐƈ
Кроме того, у нас есть еще один словарь — others, содержащий имена других
юмористов:
ʴʴʴʰƇɐɐśɐ ɐřɐ ɐśɐɐƈ
Теперь появляется еще один программист, который решил, что члены словаря
others должны быть членами Monty Python:
ʴʴʴŜſƀ
ʴʴʴ
Ƈɐɐśɐ ɐřɐɐśɐ ɐřɐ ɐśɐɐř
ɐ ɐśɐ ɐřɐ ɐśɐɐřɐɐśɐ ɐř
ɐɐśɐ ɐřɐ ɐśɐɐƈ
Что произойдет, если во втором словаре будут находиться такие же ключи, что
и в первом? Победит значение из второго словаря:
ʴʴʴʰƇɐɐśɨřɐɐśɩƈ
ʴʴʴ ʰƇɐɐśɐɐƈ
ʴʴʴŜſ ƀ
ʴʴʴ
Ƈɐɐśɨřɐɐśɐɐƈ
ǫȓȈȊȈǹȓȖȊȈȘȐȐȔȕȖȎȍșȚȊȈ
ǻȌȈȓȧȍȔȥȓȍȔȍȕȚȣȗȖȐȝȒȓȦȟțșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈGHO
Код нашего анонимного программиста Ŝſƀ был корректным
технически, но не фактически. Члены словаря others, несмотря на свою известность
и чувство юмора, не участвовали в Monty Python. Отменим добавление последних
двух элементов:
ʴʴʴƃɐɐƄ
ʴʴʴs
Ƈɐɐśɐ ɐřɐɐśɐ ɐřɐ ɐśɐɐř
ɐ ɐśɐ ɐřɐ ɐśɐɐřɐɐśɐ ɐř
ɐ ɐśɐɐƈ
ʴʴʴƃɐ ɐƄ
ʴʴʴ
Ƈɐɐśɐ ɐřɐɐśɐ ɐřɐ ɐśɐɐř
ɐ ɐśɐ ɐřɐ ɐśɐɐřɐɐśɐ ɐƈ
ǷȖȓțȟȈȍȔȥȓȍȔȍȕȚȗȖȒȓȦȟțȐțȌȈȓȧȍȔȍȋȖ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐSRS
В этой функции объединены функции ſƀ и . Если вы передадите функции
ſƀ ключ в качестве аргумента и такой ключ имеется в словаре, она вернет соот-
ветствующее значение и удалит пару. Если ключа в словаре нет, будет сгенериро-
вано исключение:
ʴʴʴſƀ
6
ʴʴʴŜſɐɐƀ
ɐ ɐ
ʴʴʴſƀ
ɬ
ʴʴʴŜſɐɐƀ
ſ ƀś
ɑʳʴɑřɨřʳʴ
śɐɐ
ǻȌȈȓȧȍȔȊșȍȥȓȍȔȍȕȚȣșȗȖȔȖȡȤȦȜțȕȒȞȐȐFOHDU
Чтобы удалить все ключи и значения из словаря, вам следует использовать функцию
ſƀ или просто переназначить заданному имени пустой словарь:
ʴʴʴŜ ſƀ
ʴʴʴ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
Ƈƈ
ʴʴʴʰƇƈ
ʴʴʴ
Ƈƈ
ǷȘȖȊȍȘȧȍȔȕȈȕȈȓȐȟȐȍȒȓȦȟȈșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈLQ
Если вы хотите узнать, содержится ли в словаре определенный ключ, используйте
ключевое слово in. Снова переопределим словарь pythons, но на этот раз пропустим
имена одного-двух участников:
ʴʴʴʰƇɐɐśɐ ɐřɐɐśɐ ɐř
ŜŜŜɐ ɐśɐɐřɐɐśɐ ɐřɐ ɐśɐ ɐƈ
Черт!
ǷȘȐșȊȈȐȊȈȍȔȏȕȈȟȍȕȐȧșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈ
Как и в случае со списками, если вы внесете в словарь изменение, оно отразится на
всех именах, которые на него ссылаются:
ʴʴʴʰƇɐɐśɐɐř
ŜŜŜɐɐśɐɐř
ŜŜŜɐɐśɐ ɐƈ
ʴʴʴɏʰ
ʴʴʴƃɐɐƄʰɐ ɐ
ʴʴʴɏ
Ƈɐɐśɐɐř
ɐɐśɐɐř
ɐɐśɐ ɐř
ɐɐśɐ ɐƈ
DzȖȗȐȘțȍȔȏȕȈȟȍȕȐȧșȗȖȔȖȡȤȦȜțȕȒȞȐȐFRS\
Чтобы скопировать ключи и значения из одного словаря в другой и запретить из-
меняться остальным словарям при изменении данных в одном из них, можно вос-
пользоваться функцией ſƀ:
ʴʴʴʰƇɐɐśɐɐř
ŜŜŜɐɐśɐɐř
ŜŜŜɐɐśɐ ɐƈ
ʴʴʴɏʰŜ ſƀ
ǫȓȈȊȈǹȓȖȊȈȘȐȐȔȕȖȎȍșȚȊȈ
ʴʴʴƃɐɐƄʰɐ ɐ
ʴʴʴ
Ƈɐɐśɐɐř
ɐɐśɐɐř
ɐɐśɐ ɐř
ɐɐśɐ ɐƈ
ʴʴʴɏ
Ƈɐɐśɐɐř
ɐɐśɐɐř
ɐɐśɐ ɐƈ
ʴʴʴ
DzȖȗȐȘțȍȔȊșȍșȗȖȔȖȡȤȦȜțȕȒȞȐȐGHHSFRS\
Если бы значением по ключу в предыдущем примере был список, а не обычная
строка:
ʴʴʴʰƇɐɐśɐɐř
ŜŜŜɐɐśɐɐř
ŜŜŜɐɐśƃɐɐřɐɐƄƈ
ʴʴʴɏ ʰŜ ſƀ
ʴʴʴ
Ƈɐɐśɐɐř
ɐɐśɐɐř
ɐɐśƃɐɐřɐɐƄƈ
ʴʴʴɏ
Ƈɐɐśɐɐř
ɐɐśɐɐř
ɐɐśƃɐɐřɐɐƄƈ
ʴʴʴ
Вы видите типичную картину, когда при внесении изменений в один объект из-
меняются оба объекта. Метод ſƀ копировал значения как есть — это значит, что
ɏ получил тот же список значений для ɐɐ, которые имел и signals.
Решением проблемы является функция ſƀ:
ʴʴʴ
ʴʴʴʰƇɐɐśɐɐř
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ŜŜŜɐɐśɐɐř
ŜŜŜɐɐśƃɐɐřɐɐƄƈ
ʴʴʴɏ ʰ Ŝ ſƀ
ʴʴʴ
Ƈɐɐśɐɐř
ɐɐśɐɐř
ɐɐśƃɐɐřɐɐƄƈ
ʴʴʴɏ
Ƈɐɐśɐɐř
ɐɐśɐɐř
ɐɐśƃɐɐřɐɐƄƈ
ʴʴʴƃɐɐƄƃɨƄʰɐɐ
ʴʴʴ
Ƈɐɐśɐɐř
ɐɐśɐɐř
ɐśƃɐɐřɐɐƄƈ
ʴʴʴɏ
Ƈɐɐśɐɐř
ɐɐśɐɐř
ɐśƃɐɐřɐɐƄƈ
ǹȘȈȊȕȐȊȈȍȔșȓȖȊȈȘȐ
Как и в случае со списками и кортежами, рассмотренными в предыдущей главе,
словари можно сравнивать с помощью операторов ʰʰ и Šʰ:
ʴʴʴʰƇɨśɨřɩśɩřɪśɪƈ
ʴʴʴʰƇɪśɪřɨśɨřɩśɩƈ
ʴʴʴʰʰ
Другие операторы не будут работать:
ʴʴʴʰƇɨśɨřɩśɩřɪśɪƈ
ʴʴʴʰƇɪśɪřɨśɨřɩśɩƈ
ʴʴʴʳʰ
ſ ƀś
ɑʳʴɑřɨřʳʴ
śɐʳʰɐ ɐ ɐɐ ɐ
Python сравнивает ключи и значения по одному. Порядок, в котором они создава-
лись, не имеет значения. В этом примере словари a и b равны, за исключением того,
что по ключу ɨ в словаре Ȕ находится список ƃɨř ɩƄ, а в словаре b — список ƃɨř ɨƄ.
ʴʴʴʰƇɨśƃɨřɩƄřɩśƃɨƄřɪśƃɨƄƈ
ʴʴʴʰƇɨśƃɨřɨƄřɩśƃɨƄřɪśƃɨƄƈ
ʴʴʴʰʰ
ǰȚȍȘȐȘțȍȔȗȖșȓȖȊȈȘȧȔșȗȖȔȖȡȤȦIRUȐLQ
Итерирование по словарю (или его функция ſƀ) возвращает ключи. В этом
примере в качестве ключей используются типы карт для настольной игры Clue
(за пределами Северной Америки она называется Cluedo):
ǫȓȈȊȈǹȓȖȊȈȘȐȐȔȕȖȎȍșȚȊȈ
ʴʴʴ ʰƇɐɐśɐɐřɐɐśɐɐř
ŜŜŜɐɐśɐŜɐƈ
ʴʴʴ śɤȜȟȜ Ŝſƀś
ŜŜŜſ ƀ
ŜŜŜ
weapon
person
ǪȒȓȦȟȍȕȐȧșȓȖȊȈȘȍȑ
У словарей также существуют включения.
Простейшая форма выглядит знакомо:
ƇȖȯȤȔȚșȡȜșȘȟȳȞȟȲȫȔśȖȯȤȔȚșȡȜșȘȟȳțȡȔȫșȡȜȳȖȯȤȔȚșȡȜșȜȦșȤȔȕșȟȰȡȯȝȢȕȮșȞȦƈ
ʴʴʴʰɐɐ
ʴʴʴɏ ʰƇśŜ ſƀƈ
ʴʴʴɏ
Ƈɐɐśɨřɐɐśɩřɐɐśɩřɐɐśɨřɐɐśɨƈ
ʴʴʴʰɐɐ
ʴʴʴʰɐɐ
ʴʴʴɏ ʰƇśŜ ſƀſƀ
ƈ
ʴʴʴɏ
Ƈɐɐśɨřɐɐśɨřɐɐśɫřɐɐśɩƈ
ǴȕȖȎȍșȚȊȈ
Множество похоже на словарь, в котором значения отброшены, а оставлены только
ключи. Как и в словаре, ключи должны быть уникальными. Вы используете множе-
ство, если хотите знать только, существует что-то или нет, а другая информация вам
неважна. Это как сумка с ключами. Если же вам нужно прикрепить к ключу некую
информацию, воспользуйтесь словарем.
Было время, когда теорию множеств
преподавали в некоторых начальных
школах наряду с основами математи-
ки. Если в вашей школе такого не было
(или было, но вы в это время смотре-
ли в окно), на рис. 8.1 можно увидеть,
как объединяются и пересекаются мно-
жества.
Предположим, вы хотите объединить
два множества, у которых есть несколь-
ко общих ключей. Поскольку множество
должно содержать только уникальные
значения, объединение двух множеств
будет иметь всего лишь один такой оди-
наковый ключ. Пустое множество — это ǸȐșǶȉȣȟȕȣȍȖȗȍȘȈȞȐȐșȔȕȖȎȍșȚȊȈȔȐ
ǫȓȈȊȈǹȓȖȊȈȘȐȐȔȕȖȎȍșȚȊȈ
ǹȖȏȌȈȍȔȔȕȖȎȍșȚȊȖșȗȖȔȖȡȤȦȜțȕȒȞȐȐVHW
Чтобы создать множество, воспользуйтесь функцией ſƀ. Можно также разме-
стить в фигурных скобках одно или несколько разделенных запятыми значений,
как показано здесь:
ʴʴʴɏʰſƀ
ʴʴʴɏ
ſƀ
ʴʴʴɏʰƇɥřɩřɫřɭřɯƈ
ʴʴʴɏ
Ƈɥřɩřɫřɭřɯƈ
ʴʴʴɏʰƇɨřɪřɬřɮřɰƈ
ʴʴʴɏ
Ƈɨřɪřɬřɮřɰƈ
ǷȖșȒȖȓȤȒțȗțșȚȣȍȒȊȈȌȘȈȚȕȣȍșȒȖȉȒȐ>@șȖȏȌȈȦȚȗțșȚȖȑșȗȐșȖȒȔȖȎȕȖȉȣȓȖȉȣ
ȗȘȍȌȗȖȓȖȎȐȚȤȟȚȖȗțșȚȣȍȜȐȋțȘȕȣȍșȒȖȉȒȐ^`șȖȏȌȈȦȚȗțșȚȖȍȔȕȖȎȍșȚȊȖǪȔȍșȚȖ
ȥȚȖȋȖȗțșȚȣȍȜȐȋțȘȕȣȍșȒȖȉȒȐșȖȏȌȈȦȚȗțșȚȖȑșȓȖȊȈȘȤǰȔȍȕȕȖȗȖȥȚȖȔțȐȕȚȍȘ
ȗȘȍȚȈȚȖȘȊȣȊȖȌȐȚȗțșȚȖȍȔȕȖȎȍșȚȊȖȒȈȒVHW ȊȔȍșȚȖ^`ǷȖȟȍȔțȚȈȒȗȘȖȐșȝȖȌȐȚ"
ǹȓȖȊȈȘȐȗȖȧȊȐȓȐșȤȊ3\WKRQȘȈȕȤȠȍȐțșȗȍȓȐȏȈȝȊȈȚȐȚȤȜȐȋțȘȕȣȍșȒȖȉȒȐȊșȊȖȍ
ȘȈșȗȖȘȧȎȍȕȐȍǨȊȓȈȌȍȕȐȍ²ȥȚȖȌȍȊȧȚȤȌȍșȧȚȣȝȏȈȒȖȕȕȖȋȖȗȘȈȊȈ
ǷȘȍȖȉȘȈȏțȍȔȌȘțȋȐȍȚȐȗȣȌȈȕȕȣȝ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐVHW
Вы можете создать множество из списка, строки, кортежа или словаря, отбрасывая
любые повторяющиеся значения.
Для начала взглянем на строку, в которой отдельные буквы встречаются не-
сколько раз:
ʴʴʴſɐɐƀ
Ƈɐɐřɐɐřɐɐřɐɐřɐɐƈ
А теперь из кортежа:
ʴʴʴſſɐɐřɐ ɐřɐ ɐƀƀ
Ƈɐɐřɐ ɐřɐ ɐƈ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǷȖȓțȟȈȍȔȌȓȐȕțȔȕȖȎȍșȚȊȈșȗȖȔȖȡȤȦȜțȕȒȞȐȐOHQ
Пересчитаем наших оленей:
ʴʴʴʰſƃɐɐřɐ ɐřɐ ɐřɐŞɐƄƀ
ʴʴʴſƀ
ɫ
ǬȖȉȈȊȓȧȍȔȥȓȍȔȍȕȚșȗȖȔȖȡȤȦȜțȕȒȞȐȐDGG
Добавим во множество еще один элемент с помощью метода ſƀ:
ʴʴʴʰſſɨřɩřɪƀƀ
ʴʴʴ
Ƈɨřɩřɪƈ
ʴʴʴŜſɫƀ
ʴʴʴ
Ƈɨřɩřɪřɫƈ
ǻȌȈȓȧȍȔȥȓȍȔȍȕȚșȗȖȔȖȡȤȦȜțȕȒȞȐȐUHPRYH
Вы можете удалить выбранное значение из множества:
ʴʴʴʰſſɨřɩřɪƀƀ
ʴʴʴŜſɪƀ
ʴʴʴ
Ƈɨřɩƈ
ǰȚȍȘȐȘțȍȔȗȖȔȕȖȎȍșȚȊȈȔșȗȖȔȖȡȤȦIRUȐLQ
Как и в случае со словарями, вы можете проитерировать по всем элементам мно-
жества:
ʴʴʴʰſſɐɐřɐɐřɐɐƀƀ
ʴʴʴ ś
ŜŜŜſ ƀ
ŜŜŜ
table
sofa
ǷȘȖȊȍȘȧȍȔȕȈȕȈȓȐȟȐȍȏȕȈȟȍȕȐȧșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȈLQ
Такое использование множеств — самое распространенное. Мы создадим словарь,
который называется . Каждый ключ будет названием коктейля, а соответству-
ющее значение — множеством с ингредиентами этого напитка:
ǫȓȈȊȈǹȓȖȊȈȘȐȐȔȕȖȎȍșȚȊȈ
ʴʴʴʰƇ
ŜŜŜɐɐśƇɐɐřɐɐƈř
ŜŜŜɐ ɐśƇɐɐřɐɐƈř
ŜŜŜɐɐśƇɐ ɐřɐɐřɐɐƈř
ŜŜŜɐɐśƇɐɐřɐɐřɐɐƈř
ŜŜŜɐ ɐśƇɐ ɐřɐɐƈ
ŜŜŜƈ
DzȖȔȉȐȕȈȞȐȐȐȖȗȍȘȈȚȖȘȣ
Что, если вам нужно проверить наличие сразу нескольких значений множества?
Предположим, вы хотите найти какой-нибудь напиток с апельсиновым соком или
вермутом. Для этого мы используем оператор пересечения множеств (ĺ):
ʴʴʴř Ŝſƀś
ŜŜŜ ĺƇɐɐřɐ ɐƈś
ŜŜŜſƀ
ŜŜŜ
ʴʴʴŷ
ſƀ
ʴʴʴŷ
Ƈɐ ɐƈ
Самыми распространенными операциями с множествами являются объединение,
пересечение и разность. Для полноты картины я включил в этот подраздел и осталь-
ные операции, но, возможно, вам никогда не придется их использовать.
Для выполнения исключающего ИЛИ (элементы или первого, или второго мно-
жества, но не общие) используйте оператор ɋ или функцию ɏ ſƀ:
ʴʴʴɋ
Ƈɨřɪƈ
ʴʴʴŜ ɏ ſƀ
Ƈɨřɪƈ
В этом примере определяется эксклюзивный ингредиент для русских напитков:
ʴʴʴɋ
Ƈɐ ɐƈ
Проверить, является ли одно множество подмножеством другого (когда все чле-
ны первого множества являются членами второго), можно с помощью оператора ʳʰ
или функции ſƀ:
ʴʴʴʳʰ
ʴʴʴŜſƀ
Добавление сливок в коктейль «Черный русский» сделает его «Белым русским»,
поэтому wruss является подмножеством bruss:
ʴʴʴʳʰ
Является ли любое множество подмножеством самого себя? Ага1.
ʴʴʴʳʰ
ʴʴʴŜſƀ
Для того чтобы стать собственным подмножеством, второе множество должно
содержать все члены первого и несколько других. Определяется это с помощью
оператора ʳ, как показано в следующем примере:
ʴʴʴʳ
ʴʴʴʳ
ʴʴʴʳ
1
Однако, перефразируя Граучо Маркса, «я бы не хотел состоять в клубе, в который при-
нимают таких людей, как я».
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ʴʴʴʴʰ
Любое множество является надмножеством самого себя:
ʴʴʴʴʰ
ʴʴʴŜſƀ
И наконец, вы можете встретить правильное надмножество (первое множество
содержит все члены второго и несколько других) с помощью оператора ʴ, как по-
казано здесь:
ʴʴʴʴ
ʴʴʴʴ
Множество не может быть правильным надмножеством самого себя:
ʴʴʴʴ
ǪȒȓȦȟȍȕȐȍȔȕȖȎȍșȚȊȈ
Никто не хочет оставаться в стороне, поэтому даже у множеств есть включения.
Простейшая версия выглядит как включение списка или словаря, которые вы
только что видели:
ƇȖȯȤȔȚșȡȜșȖȯȤȔȚșȡȜșȜȦșȤȔȕșȟȰȡȯȝȢȕȮșȞȦƈ
Здесь также могут быть необязательные проверки условий:
ƇȖȯȤȔȚșȡȜșȖȯȤȔȚșȡȜșȜȦșȤȔȕșȟȰȡȯȝȢȕȮșȞȦȧȥȟȢȖȜșƈ
ʴʴʴɏʰƇſɨřɭƀʩɪʰʰɨƈ
ʴʴʴɏ
Ƈɨřɫƈ
ǹȖȏȌȈȍȔȕȍȐȏȔȍȕȧȍȔȖȍȔȕȖȎȍșȚȊȖ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐIUR]HQVHW
Если вы хотите создать множество, которое нельзя будет изменить, вызовите функ-
цию ſƀ, передав в нее любой итерабельный аргумент:
ǫȓȈȊȈǹȓȖȊȈȘȐȐȔȕȖȎȍșȚȊȈ
ʴʴʴſƃɪřɩřɨƄƀ
ſƇɨřɩřɪƈƀ
ʴʴʴſſƃɩřɨřɪƄƀƀ
ſƇɨřɩřɪƈƀ
ʴʴʴſƇɪřɨřɩƈƀ
ſƇɨřɩřɪƈƀ
ʴʴʴſſɩřɪřɨƀƀ
ſƇɨřɩřɪƈƀ
ǹȚȘțȒȚțȘȣȌȈȕȕȣȝȒȖȚȖȘȣȍȔȣțȎȍȘȈșșȔȖȚȘȍȓȐ
Напомню, структуры данных создаются следующим образом:
список — с помощью квадратных скобок (ƃƄ);
кортеж — с помощью запятых (и опциональных скобок);
словарь и множество — с помощью фигурных скобок (Ƈƈ).
Во всех случаях, за исключением множеств, вы получаете доступ к отдельному
элементу с помощью квадратных скобок. Для списка и кортежа значение, находя-
щееся в квадратных скобках, является целочисленным смещением. Для словаря же
оно является ключом. Везде результатом будет значение. Для множества: значение
либо есть, либо нет; ключей и индексов нет.
ʴʴʴɏʰƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴɏʰɐ ɐřɐ ɐřɐ ɐ
ʴʴʴɏ ʰƇɐ ɐśɐɐřɐ ɐśɐɐřɐ ɐśɐɐƈ
ʴʴʴɏʰƇɐ ɐřɐ ɐřɐ ɐƈ
ʴʴʴɏƃɩƄ
ɐ ɐ
ʴʴʴɏƃɩƄ
ɐ ɐ
ʴʴʴɏ ƃɐ ɐƄ
ɐɐ
ʴʴʴɐ ɐɏ
ʴʴʴɐ ɐɏ
ʴʴʴɐ ɐɏ
ʴʴʴɐ ɐɏ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǹȖȏȌȈȕȐȍȒȘțȗȕȣȝșȚȘțȒȚțȘȌȈȕȕȣȝ
Ранее мы работали с простыми булевыми значениями, числами и строками.
Теперь же мы работаем со списками, кортежами, множествами и словарями. Вы мо-
жете объединить эти встроенные структуры данных в свои более крупные и сложные
структуры. Начнем с трех разных списков:
ʴʴʴʰƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴʰƃɐɐřɐɐřɐ ɐřɐ ɐřɐɐƄ
ʴʴʴʰƃɐɐřɐɐřɐɐƄ
ǿȐȚȈȑȚȍȌȈȓȍȍ
Мы вернемся к структурам кода. Покажем, как «завернуть» код в функцию и как
работать с исключениями, когда что-то идет не так.
ǫȓȈȊȈǹȓȖȊȈȘȐȐȔȕȖȎȍșȚȊȈ
ǻȗȘȈȎȕȍȕȐȧ
8.1. Создайте англо-французский словарь с названием ɩ и выведите его на экран.
Вот ваши первые слова: / , / и walrus/.
8.2. Используя словарь ɩ, выведите французский вариант слова walrus.
8.3. Создайте французско-английский словарь ɩ на основе словаря ɩ .
Используйте метод .
8.4. Используя словарь ɩ, выведите английский вариант слова .
8.5. Выведите на экран множество английских слов из ключей словаря ɩ.
8.6. Создайте многоуровневый словарь life. Используйте следующие строки для
ключей верхнего уровня: ɐɐ, ɐɐ и ɐɐ. Сделайте так, чтобы
ключ ɐɐ ссылался на другой словарь, имеющий ключи ɐ ɐ, ɐ ɐ
и ɐɐ. Сделайте так, чтобы ключ ɐ ɐ ссылался на список строк со значени-
ями ɐ ɐ, ɐ ɐ и ɐ ɐ. Остальные ключи должны ссылаться на пустые
словари.
8.7. Выведите на экран высокоуровневые ключи словаря life.
8.8. Выведите на экран ключи ƃɐɐƄ.
8.9. Выведите значения ƃɐɐƄƃɐ ɐƄ.
8.10. Используйте генератор словаря, чтобы создать словарь squares. Используйте
ſɨɥƀ, чтобы получить ключи. В качестве значений используйте возведен-
ное в квадрат значение каждого ключа.
8.11. Используйте генератор множества, чтобы создать множество из нечетных
чисел диапазона ſɨɥƀ.
8.12. Используйте включение генератора, чтобы вернуть строку ɐ ɐ и числа из
диапазона ſɨɥƀ. Итерируйте по этой конструкции с помощью цикла for.
8.13. Используйте функцию ſƀ , чтобы создать словарь из кортежа ключей
(ɐɐ, ɐɐ, ɐɐ) и кортежа значений (ɐ glass is half ɐ,
ɐ glass is half ɐ, ɐ you get a ţɐ).
8.14. Используйте функцию ſƀ, чтобы создать словарь с именем , в котором
объединены списки titles ʰ ƃɐ of ɐř ɐ ɐř ɐ
a ɐƄ и plots ʰ ƃɐ nun turns into a ɐř ɐ yarn ɐř ɐ
your ɐƄ.
ƋƓƈƊƈ
ǼțȕȒȞȐȐ
До этого момента все наши примеры кода были небольшими фрагментами. Они под-
ходят для решения небольших задач, но никому не хочется раз за разом эти фраг-
менты перепечатывать. Нужна какая-то форма преобразования большого кода в ряд
удобных в применении частей.
Первый шаг к повторному использованию кода — создание функций. Функция —
это именованный фрагмент кода, отделенный от других. Она может принимать
любое количество любых входных параметров и возвращать любое количество
любых результатов.
С функцией можно сделать две вещи:
определить ее, указав ноль или больше параметров;
вызвать ее и получить ноль или больше результатов.
ǶȗȘȍȌȍȓȧȍȔȜțȕȒȞȐȦ
șȗȖȔȖȡȤȦȒȓȦȟȍȊȖȋȖșȓȖȊȈGHI
Чтобы определить функцию, вам нужно написать , имя функции, входные
параметры, заключенные в скобки, и, наконец, двоеточие (ś ). Имена функций
подчиняются тем же правилам, что и имена переменных (они должны начинаться
с буквы или символа подчеркивания и содержать только буквы, цифры или символ
подчеркивания).
Будем действовать пошагово. Сначала определим и вызовем функцию, которая
не имеет параметров. Перед вами пример простейшей функции:
ʴʴʴɏſƀś
ŜŜŜ
Даже если функции не нужны параметры, вам все равно придется указать кру-
глые скобки и двоеточие в ее определении. Следующую строку необходимо вы-
делить пробелами точно так же, как если бы это был оператор if. Python требует
ǫȓȈȊȈǼțȕȒȞȐȐ
использовать выражение pass для демонстрации того, что функция ничего не делает.
Оно эквивалентно утверждению «Эта страница специально оставлена пустой» (хотя
теперь это и не так).
ǪȣȏȣȊȈȍȔȜțȕȒȞȐȦșȗȖȔȖȡȤȦșȒȖȉȖȒ
Функцию можно вызвать, просто написав ее имя и скобки. Она сработает так, как
я и обещал, вполне успешно не сделав ничего:
ʴʴʴɏſƀ
ʴʴʴ
Теперь определим и вызовем другую функцию, которая не имеет параметров
и выводит на экран одно слово:
ʴʴʴɏɏſƀś
ŜŜŜſɐ ɐƀ
ŜŜŜ
ʴʴʴɏɏſƀ
Когда вы вызываете функцию ɏɏſƀ, Python выполняет код, располо-
женный внутри ее описания. В этом случае он выводит одно слово и возвращает
управление основной программе.
Попробуем написать функцию, которая не имеет параметров, но возвращает
значение:
ʴʴʴſƀś
ŜŜŜ
ŜŜŜ
Вы можете вызвать эту функцию и проверить значение, которое она вернула,
с помощью if:
ʴʴʴſƀś
ŜŜŜſɐŠɐƀ
ŜŜŜś
ŜŜŜſɐ Ŝɐƀ
ŜŜŜ
Š
Только что вы шагнули далеко вперед. Комбинация функций с проверками вроде
if и циклами вроде while позволяет вам делать то, чего вы раньше не могли.
ǨȘȋțȔȍȕȚȣȐȗȈȘȈȔȍȚȘȣ
Пришло время поместить что-нибудь в эти скобки. Определим функцию ſƀ,
имеющую один параметр anything. Она использует оператор return, чтобы отпра-
вить значение anything вызывающей стороне дважды, разделив их пробелом:
ʴʴʴ ſƀś
ŜŜŜʫɐɐʫ
ŜŜŜ
ʴʴʴ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
1RQH²ȥȚȖȗȖȓȍȏȕȖ
— это специальное значение в Python, которое заполняет собой пустое место,
если функция ничего не возвращает. Оно не является булевым значением , хоть
и похоже на него при проверке булевой переменной. Рассмотрим пример:
ʴʴʴʰ
ʴʴʴś
ŜŜŜſɑ ɐɑƀ
ŜŜŜś
ŜŜŜſɑ ɐɑƀ
ŜŜŜ
ɐ
Чтобы отличить от булева значения , используйте оператор is:
ʴʴʴʰ
ʴʴʴś
ŜŜŜſɑ ɐɑƀ
ŜŜŜś
ŜŜŜſɑ ɐɑƀ
ŜŜŜ
ɐ
Разница кажется небольшой, однако в Python она важна: потребуется вам,
чтобы различать отсутствующие значения и пустые. Помните, что целочисленные
нули, нули с плавающей точкой, пустые строки (ɐɐ), списки (ƃƄ), кортежи (ſřƀ),
словари (Ƈƈ) и множества (ſƀ) все равны , но это не то же самое, что .
Напишем небольшую функцию, которая выводит на экран, является ли ее аргу-
мент , или :
ʴʴʴſƀś
ŜŜŜś
ŜŜŜſřɑɑƀ
ŜŜŜś
ŜŜŜſřɑɑƀ
ŜŜŜś
ŜŜŜſřɑ ɑƀ
ŜŜŜ
Теперь выполним несколько проверок:
ʴʴʴſƀ
ʴʴʴſƀ
ʴʴʴſ ƀ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ʴʴʴſɥŜɥɥɥɥɨƀ
ɨŞɥɬ
ʴʴʴſƃɥƄƀ
ƃɥƄ
ʴʴʴſƃɐɐƄƀ
ƃɐɐƄ
ʴʴʴſɐɐƀ
ǷȖȏȐȞȐȖȕȕȣȍȈȘȋțȔȍȕȚȣ
Python довольно гибко обрабатывает аргументы функций в сравнении со мно-
гими другими языками. Наиболее распространенный тип аргументов — это по-
зиционные аргументы, чьи значения копируются в соответствующие параметры
по порядку.
Эта функция создает словарь из позиционных входных аргументов и возвра-
щает его:
ʴʴʴſřřƀś
ŜŜŜƇɐɐśřɐɐśřɐɐśƈ
ŜŜŜ
ʴʴʴſɐ ɐřɐ ɐřɐ ɐƀ
Ƈɐɐśɐ ɐřɐɐśɐ ɐřɐɐśɐ ɐƈ
ǨȘȋțȔȍȕȚȣ²ȒȓȦȟȍȊȣȍșȓȖȊȈ
Для того чтобы избежать путаницы с позиционными аргументами, вы можете ука-
зать аргументы с помощью имен соответствующих параметров. Порядок следования
аргументов в этом случае может быть иным:
ʴʴʴſʰɐɐřʰɐɐřʰɐɐƀ
Ƈɐɐśɐɐřɐɐśɐɐřɐɐśɐɐƈ
ǻȒȈȏȣȊȈȍȔȏȕȈȟȍȕȐȍȗȈȘȈȔȍȚȘȈȗȖțȔȖȓȟȈȕȐȦ
Вы можете указать для параметров значения по умолчанию. Значения по умолчанию
используются в том случае, если вызывающая сторона не предоставила соответ-
ствующий аргумент. Это стандартное действие оказывается достаточно полезным.
Обратимся к предыдущему примеру:
ʴʴʴſřřʰɐɐƀś
ŜŜŜƇɐɐśřɐɐśřɐɐśƈ
ǯȕȈȟȍȕȐȍȗȈȘȈȔȍȚȘȖȊȗȖțȔȖȓȟȈȕȐȦȊȣșȟȐȚȣȊȈȍȚșȧȒȖȋȌȈȜțȕȒȞȐȧȖȗȘȍȌȍȓȧȍȚșȧ
Ȉ ȕȍ ȊȣȗȖȓȕȧȍȚșȧ ǸȈșȗȘȖșȚȘȈȕȍȕȕȖȑ ȖȠȐȉȒȖȑ ȕȖȊȐȟȒȖȊ Ȉ ȐȕȖȋȌȈ Ȑ ȕȍ șȖȊșȍȔ
ȕȖȊȐȟȒȖȊ ȧȊȓȧȍȚșȧ ȐșȗȖȓȤȏȖȊȈȕȐȍ ȐȏȔȍȕȧȍȔȖȋȖ ȚȐȗȈ ȌȈȕȕȣȝ ȚȈȒȐȝ ȒȈȒ șȗȐșȖȒ
ȐȓȐșȓȖȊȈȘȤȊȒȈȟȍșȚȊȍȗȈȘȈȔȍȚȘȈȗȖțȔȖȓȟȈȕȐȦ
только при первом вызове. Во второй раз список result будет содержать элемент,
оставшийся после предыдущего вызова:
ʴʴʴſřʰƃƄƀś
ŜŜŜŜſƀ
ŜŜŜſƀ
ŜŜŜ
ʴʴʴſɐɐƀ
ƃɐɐƄ
ʴʴʴſɐɐƀɤȢȚȜȘȔșȠȧȖȜȘșȦȰƃɐɐƄ
ƃɐɐřɐɐƄ
ǷȖȓțȟȈȍȔȘȈȏȉȐȊȈȍȔȈȘȋțȔȍȕȚȣ²ȒȓȦȟȍȊȣȍșȓȖȊȈ
șȗȖȔȖȡȤȦșȐȔȊȖȓȈ
Если вы работали с языками программирования C или C++, то можете предположить,
что астериск (*) в Python имеет какое-то отношение к указателям. Нет, у Python нет
указателей.
Если символ * будет использован внутри функции с параметром, произвольное
количество позиционных аргументов сгруппируется в один кортеж. В следующем
примере args является кортежем параметров, который был создан из нуля или более
аргументов, переданных в функцию ɏſƀ:
ǫȓȈȊȈǼțȕȒȞȐȐ
ʴʴʴɏſƋƀś
ŜŜŜſɐśɐřƀ
ŜŜŜ
Все аргументы, которые вы передадите, будут выведены на экран как кортеж args:
ʴʴʴɏſɪřɩřɨřɐŠɐřɐŜŜŜɐƀ
śſɪřɩřɨřɐŠɐřɐŜŜŜɐƀ
Это удобно при написании таких функций, как ſƀ, которые принимают
произвольное количество аргументов. Если в вашей функции имеются также обяза-
тельные позиционные аргументы, поместите их в начало — *args отправится в конец
списка и получит все остальные аргументы:
ʴʴʴɏſɨřɩřƋƀś
ŜŜŜſɐśɐřɨƀ
ŜŜŜſɐśɐřɩƀ
ŜŜŜſɐśɐřƀ
ŜŜŜ
ʴʴʴɏſɐ ɐřɐɐřɐ ɐřɐ ɐřɐ ɐƀ
ś
ś
śſɐ ɐřɐ ɐřɐ ɐƀ
ǷȘȐȐșȗȖȓȤȏȖȊȈȕȐȐ ȊȈȔȕȍȕțȎȕȖȖȉȧȏȈȚȍȓȤȕȖȕȈȏȣȊȈȚȤȒȖȘȚȍȎȈȘȋțȔȍȕȚȖȊDUJV
ȖȌȕȈȒȖȥȚȖȘȈșȗȘȖșȚȘȈȕȍȕȕȈȧȐȌȐȖȔȈȊ3\WKRQǺȈȒȎȍȟȈșȚȖȊȕțȚȘȐȜțȕȒȞȐȐȐș
ȗȖȓȤȏțȍȚșȧȒȖȕșȚȘțȒȞȐȧ DUJVȒȈȒȥȚȖȗȖȒȈȏȈȕȖȊȗȘȍȌȣȌțȡȍȔȗȘȐȔȍȘȍȕȍșȔȖȚȘȧ
ȕȈȚȖȟȚȖȚȍȝȕȐȟȍșȒȐȖȕȈȧȊȓȧȍȚșȧȗȈȘȈȔȍȚȘȖȔȐȌȖȓȎȕȈȕȈȏȣȊȈȚȤșȧ SDUDPV
Подведем итоги.
Можно передавать позиционный аргумент в функцию, которая соотнесет его
с позиционным параметром. Подобные примеры вы уже видели в этой книге.
Можно передать в функцию кортеж, и внутри он также останется кортежем.
Это более простой вариант предыдущей ситуации.
Можно передать позиционные аргументы в функцию и объединить их в пара-
метр *args, который будет развернут в кортеж args. Эту ситуацию мы описали
в текущем подразделе.
Можно «разбить» кортеж с именем args на позиционные параметры *args внутри
функции, которые затем будут пересобраны в кортеж-параметр args:
ʴʴʴɏſɩřɬřɮřɐɐƀ
śſɩřɬřɮřɐɐƀ
ʴʴʴʰſɩřɬřɮřɐɐƀ
ʴʴʴɏſƀ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
śſſɩřɬřɮřɐɐƀřƀ
ʴʴʴɏſƋƀ
śſɩřɬřɮřɐɐƀ
Итак:
находясь за пределами функции, *args разбивает кортеж args на разделенные
запятыми позиционные параметры;
будучи внутри функции, *args собирает все позиционные аргументы в единый
кортеж args. Вы можете использовать имена Ƌ и , но чаще всего имя
*args используется как для аргументов, так и для параметров.
Читатели, обладающие синестезией, могут неявно услышать, что *args произ-
носится как выдох-args снаружи и вдох-args изнутри.
ǷȖȓțȟȈȍȔȘȈȏȉȐȊȈȍȔȈȘȋțȔȍȕȚȣ²ȒȓȦȟȍȊȣȍșȓȖȊȈ
șȗȖȔȖȡȤȦșȐȔȊȖȓȖȊ
Вы можете использовать два астериска (**), чтобы сгруппировать аргументы — клю-
чевые слова в словарь, где имена аргументов станут ключами, а их значения — соот-
ветствующими значениями в словаре. В следующем примере определяется функция
ɏſƀ, в которой выводятся ее аргументы — ключевые слова:
ʴʴʴɏſƋƋƀś
ŜŜŜſɐśɐřƀ
ŜŜŜ
1
Имена Args и Kwargs очень хорошо подошли бы пиратским попугаям.
ǫȓȈȊȈǼțȕȒȞȐȐ
Подведем итоги:
вы можете передавать аргументы в функцию по ключевым словам — они будут
соотнесены с параметрами. Вы уже видели этот подход на практике;
вы можете передать в функцию словарь — внутри он также будет представлять
собой словарь с параметрами. Это частный случай предыдущей ситуации;
вы можете передать в функцию один или несколько аргументов по ключевым
словам (в формате ȜȠȳʰțȡȔȫșȡȜș ) и собрать их внутри в виде конструкции
ƋƋ, которая будет преобразована в параметр-словарь с именем .
Такую ситуацию мы рассмотрели в этом подразделе;
находясь за пределами функции, ƋƋ разбивает словарь на аргумен-
ты в формате ȜȠȳʰțȡȔȫșȡȜș;
находясь внутри функции, ƋƋ собирает аргументы в формате ȜȠȳʰțȡȔȫșȡȜș
в словарь с именем .
Если вам помогает аналогия со слуховыми образами, представьте, что при раз-
биении аргументов для каждой звездочки делается выдох, а при их сборе — вдох.
ǨȘȋțȔȍȕȚȣȗȍȘȍȌȈȊȈȍȔȣȍȚȖȓȤȒȖ
ȗȖȒȓȦȟȍȊȣȔșȓȖȊȈȔ
В функцию можно передать аргумент — ключевое слово с тем же самым именем, что
и у позиционного параметра. Однако, скорее всего, это приведет не к тому результату,
который вы ожидаете. Python 3 позволяет указывать аргументы, которые передают-
ся только по ключевым словам. Соответственно названию их нужно предоставлять
в формате ȜȠȳʰțȡȔȫșȡȜș, а не позиционно, как значение. Знак * в определении функ-
ции говорит о том, что параметры start и нужно предоставлять как именованные
аргументы, если мы не хотим использовать их значения по умолчанию:
ʴʴʴɏſřƋřʰɥřʰɨɥɥƀś
ŜŜŜſƃśƄƀś
ŜŜŜſƀ
ŜŜŜ
ʴʴʴʰƃɐɐřɐɐřɐ ɐřɐɐřɐɐřɐɐƄ
ʴʴʴɏſƀ
a
1
А также, начиная с версии Python 3.5, при объединении словарей с помощью конструкции
{**a, **b}, которую вы видели в главе 8.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
e
f
ʴʴʴɏſřʰɫƀ
e
f
ʴʴʴɏſřʰɩƀ
a
b
ǰȏȔȍȕȧȍȔȣȍȐȕȍȐȏȔȍȕȧȍȔȣȍȈȘȋțȔȍȕȚȣ
Вы не забыли, что, если присвоить один список двум переменным, вы сможете из-
менить его, используя любую из этих переменных? И что это не сработает, если
обе переменные ссылаются, например, на целое число или строку? Это происходит
потому, что список является изменяемым, а строка и целое число — нет. Вам нужно
помнить про эту особенность при передаче аргументов в функцию. Если аргумент
изменяемый, то его значение можно изменить изнутри функции с помощью соот-
ветствующего параметра1:
ʴʴʴʰƃɐɐřɐɐřɐɐƄ
ʴʴʴſƀś
ŜŜŜƃɨƄʰɐŠɐ
ŜŜŜ
ʴʴʴ
ƃɐɐřɐɐřɐɐƄ
ʴʴʴſƀ
ʴʴʴ
ƃɐɐřɐŠɐřɐɐƄ
ǹȚȘȖȒȐȌȖȒțȔȍȕȚȈȞȐȐ
В Python удобочитаемость имеет значение. Вы можете прикрепить документацию
к определению функции, включив в начало ее тела строку, которая и называется
строкой документации:
ʴʴʴ ſƀś
ŜŜŜɐ ɐ
ŜŜŜ
1
Как в подростковых фильмах ужасов, когда герои узнают: «Звонок идет изнутри дома!»
2
Как в старом врачебном анекдоте: «Мне больно, когда я делаю вот так». — «Значит, боль-
ше так не делайте».
ǫȓȈȊȈǼțȕȒȞȐȐ
ſƀ
ǼțȕȒȞȐȐ²ȥȚȖȖȉȢȍȒȚȣȗȍȘȊȖȋȖȒȓȈșșȈ
Я уже упоминал мантру Python: все является объектом. Числа, строки, кортежи, спи-
ски, словари и даже функции — это объекты. Функции в Python выступают объектами
первого класса. Вы можете присвоить их переменным, использовать как аргументы
для других функций и возвращать из функций. Это дает возможность решать в Python
такие задачи, которые трудно выполнить во многих других языках.
Для того чтобы убедиться в этом, определим простую функцию ſƀ, которая
не имеет аргументов и просто выводит число ɫɩ:
ʴʴʴſƀś
ŜŜŜſɫɩƀ
Теперь определим еще одну функцию с именем ɏ. Она имеет один
аргумент с именем , представляющий собой функцию, которую нужно запустить
и которая просто вызывает другую функцию:
ʴʴʴɏſ ƀś
ŜŜŜ ſƀ
ʴʴʴɏɏɏſ řɨřɩƀś
ŜŜŜ ſɨřɩƀ
ǪȕțȚȘȍȕȕȐȍȜțȕȒȞȐȐ
Вы можете определить функцию внутри другой функции:
ʴʴʴſřƀś
ŜŜŜſ řƀś
ŜŜŜ ʫ
ŜŜŜſřƀ
ŜŜŜ
ʴʴʴ
ʴʴʴſɫřɮƀ
ɨɨ
ŜŜŜɑśɐʩɐɑʩ
ŜŜŜſƀ
ŜŜŜ
ʴʴʴſɐŠɐƀ
ɑśɐŠɐɑ
Если мы вызовем их, они запомнят значение переменной saying, которое было
использовано, когда они создавались функцией ɩ:
ʴʴʴſƀ
ɑśɐ ɐɑ
ʴʴʴſƀ
ɑśɐ ɐɑ
ǫȓȈȊȈǼțȕȒȞȐȐ
ǨȕȖȕȐȔȕȣȍȜțȕȒȞȐȐȓȧȔȉȌȈȊȣȘȈȎȍȕȐȧ
В Python лямбда-функция — это анонимная функция, выраженная в виде одного
оператора. Ее можно использовать вместо обычной небольшой функции.
Чтобы проиллюстрировать анонимные функции, сначала создадим пример,
в котором используются обычные функции. В первую очередь определим функцию
ɏſƀ. Она имеет следующие аргументы:
Теперь нам нужны список слов и функция, которую требуется к ним применить.
В качестве слов я возьму список звуков (гипотетических), которые мог бы издать
мой кот, если бы (гипотетически) он не заметил одну из лестниц:
ʴʴʴʰƃɐɐřɐɐřɐɐřɐɐƄ
ǫȍȕȍȘȈȚȖȘȣ
В Python генератор — это объект, который предназначен для создания последова-
тельностей. С его помощью вы можете итерировать потенциально огромные после-
довательности, не создавая и не сохраняя всю последовательность в памяти сразу.
Генераторы часто становятся источником данных для итераторов. Как вы помните,
один из них, ſƀ, мы уже использовали в примерах кода для того, чтобы сгене-
рировать последовательность целых чисел. В Python 2 функция ſƀ возвращает
список, ограниченный так, чтобы он помещался в память. В Python 2 также есть
функция ſƀ, которая стала обычной функцией ſƀ в Python 3. В этом
примере складываются все целые числа от 1 до 100:
ʴʴʴſſɨřɨɥɨƀƀ
ɬɥɬɥ
ǼțȕȒȞȐȐȋȍȕȍȘȈȚȖȘȣ
Если вы хотите создать потенциально большую последовательность, вы можете на-
писать функцию-генератор. Это обычная функция, однако она возвращает значение
с помощью выражения , а не return. Напишем собственную функцию ſƀ:
ʴʴʴɏſʰɥřʰɨɥřʰɨƀś
ŜŜŜʰ
ŜŜŜʳś
ŜŜŜber
ŜŜŜʫʰ
ŜŜŜ
ǫȍȕȍȘȈȚȖȘȔȖȎȕȖȏȈȗțșȚȐȚȤȓȐȠȤȖȌȕȈȎȌȣǹȗȐșȒȐȔȕȖȎȍșȚȊȈșȚȘȖȒȐȐșȓȖȊȈȘȐ
șțȡȍșȚȊțȦȚȊȗȈȔȧȚȐȈȋȍȕȍȘȈȚȖȘȣșȖȏȌȈȦȚșȊȖȐȏȕȈȟȍȕȐȧȕȈȓȍȚțȐȊȣȌȈȦȚȐȝ
ȗȖȖȌȕȖȔțșȗȖȔȖȡȤȦȐȚȍȘȈȚȖȘȈǫȍȕȍȘȈȚȖȘȕȍȏȈȗȖȔȐȕȈȍȚȏȕȈȟȍȕȐȧȗȖȥȚȖȔțȊȣ
ȕȍȔȖȎȍȚȍȗȍȘȍȏȈȗțșȚȐȚȤȍȋȖȐȓȐșȖȏȌȈȚȤȘȍȏȍȘȊȕțȦȒȖȗȐȦ
ǪȒȓȦȟȍȕȐȧȋȍȕȍȘȈȚȖȘȖȊ
Вы уже сталкивались с включениями списков, словарей и множеств. Включение
генератора выглядит так же, но заключается в круглые скобки, а не в квадратные
или фигурные. Оно похоже на сокращенную функцию-генератор, которая неявно
выполняет и возвращает объект генератора:
ʴʴʴʰſſƃɐɐřɐɐƄřƃɐɨɐřɐɩɐƄƀƀ
ʴʴʴ
ʳ ʳʴɥɨɥɪɥɯɥʴ
ʴʴʴś
ŜŜŜſƀ
ŜŜŜ
ſɐɐřɐɨɐƀ
ſɐɐřɐɩɐƀ
ǬȍȒȖȘȈȚȖȘȣ
Иногда вам нужно модифицировать существующую функцию, не меняя при этом ее
исходный код. Чаще всего добавляется выражение для отладки, чтобы посмотреть,
какие аргументы были переданы.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ʴʴʴɒ ɏ
ŜŜŜɏſřƀś
ŜŜŜʫ
ŜŜŜ
ʴʴʴɏſɪřɬƀ
ɏ
śſɪřɬƀ
śƇƈ
śɯ
ɯ
У каждой функции может быть больше одного декоратора. Напишем еще один
с именем ɏſƀ, который возводит результат в квадрат:
ʴʴʴɏſ ƀś
ŜŜŜɏ ſƋřƋƋƀś
ŜŜŜʰ ſƋřƋƋƀ
ŜŜŜƋ
ŜŜŜɏ
ŜŜŜ
Декоратор, размещенный ближе всего к функции (прямо над ), будет выпол-
нен первым, а затем выполнится тот, что находится сразу над ним. Любой порядок
вызова вернет один и тот же конечный результат, но вы можете увидеть все про-
межуточные этапы:
ʴʴʴɒ ɏ
ŜŜŜɒɏ
ŜŜŜɏſřƀś
ŜŜŜʫ
ŜŜŜ
ʴʴʴɏſɪřɬƀ
śɏ
śſɪřɬƀ
śƇƈ
śɭɫ
ɭɫ
ǷȘȖșȚȘȈȕșȚȊȈȐȔȍȕȐȖȉȓȈșȚȤȖȗȘȍȌȍȓȍȕȐȧ
С тем, кто в искусстве больше преуспел…
Уильям Шекспир
Имя может ссылаться на несколько разных объектов в зависимости от того, где оно
используется. Программы на Python имеют различные пространства имен — раз-
делы, внутри которых определенное имя уникально и не связано с таким же именем
в других пространствах имен.
Каждая функция определяет собственное пространство имен. Если вы опреде-
лите переменную с именем ȩ в основной программе и другую переменную ȩ в от-
дельной функции, они будут ссылаться на разные значения. Но эту стену можно
пробить: если нужно, вы можете получить доступ к именам в других пространствах
имен разными способами.
В основной программе определяется глобальное пространство имен, поэтому
переменные, находящиеся в нем, являются глобальными.
Значение глобальной переменной можно получить внутри функции:
ʴʴʴʰɐɐ
ʴʴʴɏſƀś
ŜŜŜſɐɏśɐřƀ
ŜŜŜ
ʴʴʴſɐśɐřƀ
ś
ʴʴʴɏſƀ
ɏś
śƇɐɐśɐɐƈ
ʴʴʴſɐśɐřſƀƀɤȡșȠȡȢȗȢȣșȤșȨȢȤȠȔȦȜȤȢȖȔȡȢȘȟȳȣȤșȘȥȦȔȖȟșȡȜȳ
śƇɐɐśɐɐř
ɐɏɏ ɏɏɐśř
ɐ ɏ ɐśʳ ɏɥɨɥɥɭ ɥɨɮɥʴř
ɐɏɏ ɏɏɐśř
ɐɏɏɏɏɐśɐɏɏɏɏɐř
ɐɏɏɏɏɐśʳ ɐɏɏŜ ɐʴř
ɐɏɏɏɏɐśʳɐɐʴƈ
ʴʴʴ
ɐɐ
ǰșȗȖȓȤȏȖȊȈȕȐȍșȐȔȊȖȓȖȊBȐBBȊȐȔȍȕȈȝ
Имена, которые начинаются с двух нижних подчеркиваний (ɏɏ) и заканчиваются
ими, зарезервированы для использования внутри Python, поэтому вам не следует
применять их к своим собственным переменным. Подобный шаблон именования
был выбран потому, что разработчики, скорее всего, не стали бы им пользоваться
для создания имен своих переменных.
Например, имя функции находится в системной переменной Ŝɏɏɏɏ,
а имя ее строки документации — в Ŝɏɏ ɏɏ:
ʴʴʴſƀś
ŜŜŜɐɐɐ Ŝ
ŜŜŜţɐɐɐ
ŜŜŜſɐ śɐřŜɏɏɏɏƀ
ŜŜŜſɐ śɐřŜɏɏ ɏɏƀ
ŜŜŜ
ʴʴʴſƀ
ś
ś Ŝ
ţ
ǸȍȒțȘșȐȧ
До сих пор мы видели функции, которые выполняют какие-то определенные дей-
ствия и, возможно, вызывают другие функции. Но что, если функция вызовет саму
себя?1 Это называется рекурсией. Так же как не нужны бесконечные циклы while
1
Это как сказать: «Я хочу, чтоб мне давали монетку каждый раз, когда я хочу, чтобы мне
дали монетку».
ǫȓȈȊȈǼțȕȒȞȐȐ
Рекурсия может быть полезна, если вы работаете с чем-то вроде списков, содер-
жащих списки, которые содержат списки.
Предположим, вы хотите «уплотнить» все подсписки1 независимо от того, на-
сколько глубоко они вложены. Для этого отлично подойдет функция-генератор:
ʴʴʴſƀś
ŜŜŜś
ŜŜŜ ſřƀś
ŜŜŜſƀś
ŜŜŜ
ŜŜŜś
ŜŜŜ
ŜŜŜ
ʴʴʴʰƃɨřɩřƃɪřɫřɬƄřƃɭřƃɮřɯřɰƄřƃƄƄƄ
ʴʴʴſƀ
ʳ ɥɨɥɬɥɰɮɬɥʴ
ʴʴʴſſƀƀ
ƃɨřɩřɪřɫřɬřɭřɮřɯřɰƄ
1
Это еще один популярный вопрос на собеседованиях. Давайте соберем всю коллекцию!
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǨșȐȕȝȘȖȕȕȣȍȜțȕȒȞȐȐ
Ключевые слова и await были добавлены в Python 3.5 для того, чтобы можно
было определять и запускать асинхронные функции. Их можно описать так:
они относительно новые;
они значительно отличаются друг от друга, чтобы их сложнее было понять;
они станут более важными и более изученными со временем.
По этим причинам я перенес рассмотрение вопросов, связанных с асинхронно-
стью, в приложение В. Сейчас вам нужно знать, что, если вы в объявлении функции
перед словом видите слово , это значит, что функция асинхронная. Ана-
логично, если перед вызовом функции вы видите слово await, эта функция также
является асинхронной. Основное различие между асинхронными и обычными
функциями заключается в том, что асинхронные могут «передавать управление»
вместо того, чтобы заставлять основной поток выполнения ждать до конца их вы-
полнения.
ǰșȒȓȦȟȍȕȐȧ
В некоторых языках программирования ошибки отображаются с помощью специ-
альных возвращаемых значений. В Python, если дело пахнет жареным1, используется
исключение: код, который выполняется, когда происходит связанная с ним ошибка.
Какие-то из исключений вы уже видели, пытаясь получить доступ к позиции,
не входящей в список/кортеж, или к словарю с несуществующим ключом. Когда
вы выполняете код, который при определенных условиях может не сработать, вам
также понадобятся обработчики исключений для перехвата любых потенциальных
ошибок.
Чтобы пользователь знал о происходящем, рекомендуется добавлять обработчи-
ки исключений везде, где исключение может быть сгенерировано. Не всегда у вас
получится исправить ошибку, но вы хотя бы будете знать, при каких обстоятельствах
она появилась, и аккуратно завершите программу. Если исключение сгенерирова-
лось в функции и там не обработалось, оно будет всплывать до тех пор, пока его
не поймает соответствующий обработчик в одной из вызывающих функций. Если вы
не предоставите собственный обработчик исключений, Python выведет сообщение
об ошибке и некоторую информацию о том, где произошла ошибка, а затем завершит
программу, как показано в следующем фрагменте кода:
ʴʴʴɏʰƃɨřɩřɪƄ
ʴʴʴʰɬ
ʴʴʴɏƃƄ
ſ ƀś
ɑʳʴɑřɨřʳʴ
ś
1
Интересно, это выражение характерно только для северного полушария? Говорят ли
австралийцы и новозеландцы«дело пахнет вареным», когда все идет не так, как хотелось бы?
ǫȓȈȊȈǼțȕȒȞȐȐ
ǶȉȘȈȉȈȚȣȊȈȍȔȖȠȐȉȒȐșȗȖȔȖȡȤȦȖȗȍȘȈȚȖȘȖȊWU\ȐH[FHSW
Делай или не делай. Не надо пытаться.
Йода
Вместо того чтобы полагаться на волю случая, размещайте свой код в блоке try
и используйте блок для обработки ошибки:
ʴʴʴɏʰƃɨřɩřɪƄ
ʴʴʴʰɬ
ʴʴʴś
ŜŜŜɏƃƄ
ŜŜŜ ś
ŜŜŜſɐɥɐřſɏƀŞɨřɐɐř
ŜŜŜƀ
ŜŜŜ
ɥɩɬ
Запускается код внутри блока try. Если произошла ошибка, генерируется ис-
ключение и выполняется код, расположенный внутри блока . Если ошибок
не произошло, блок пропускается.
Отсутствие аргументов в блоке , как в предыдущем примере, позволяет
ловить исключения любого типа. Если предполагается, что могут возникнуть не-
сколько типов исключений, лучшим решением будет предоставить отдельный об-
работчик для каждого из них. Никто не заставляет это делать — можно использовать
блок без аргументов, но тогда обработка будет достаточно поверхностной
(что-то вроде вывода на экран строки ǷȘȖȐȏȖȠȓȈ ȖȠȐȉȒȈ). Разрешается использовать
любое количество обработчиков исключений.
Иногда вам будут нужны и другие подробности исключения, а не только его тип.
Вы можете получить объект исключения целиком в переменной ȜȠȳ, если исполь-
зуете такую форму:
ȦȜȣɕȜȥȞȟȲȫșȡȜȳȜȠȳ
ŜŜŜſɐśɐřƀ
ŜŜŜ ś
ŜŜŜſɐśɐřƀ
ŜŜŜ
ƃƄţɨ
ɩ
ƃƄţɥ
ɨ
ƃƄţɩ
ɪ
ƃƄţɪ
śɪ
ƃƄţɩ
ɪ
ƃƄţ
śſƀɨɥśɐɐ
ƃƄţ
ǹȖȏȌȈȍȔșȖȉșȚȊȍȕȕȣȍȐșȒȓȦȟȍȕȐȧ
В предыдущем подразделе обсуждалась обработка исключений, но все исключения
(такие как ) заранее определены в Python или его стандартных библиоте-
ках. Вы можете использовать любые из этих исключений, но можете также и опреде-
лять собственные типы исключений, чтобы обрабатывать особые ситуации, которые
могут возникнуть в ваших программах.
ǬȓȧȥȚȖȋȖȗȖȚȘȍȉțȍȚșȧȖȗȘȍȌȍȓȐȚȤȕȖȊȣȑȚȐȗȖȉȢȍȒȚȈșȗȖȔȖȡȤȦȒȓȈșșȈǯȈȕȐȔȈȚȤ
șȧȒȓȈșșȈȔȐȔȣȕȈȟȕȍȔȊȋȓȈȊȍȗȖȥȚȖȔțȍșȓȐȊȣșȕȐȔȐȕȍȏȕȈȒȖȔȣȔȖȎȍȚȍ
ȖȉȘȈȚȐȚȤșȧȒșȖȖȚȊȍȚșȚȊțȦȡȍȔțȘȈȏȌȍȓț
ǿȐȚȈȑȚȍȌȈȓȍȍ
Объекты! В книге, посвященной объектно-ориентированному языку, мы когда-ни-
будь обязаны были до них добраться.
ǻȗȘȈȎȕȍȕȐȧ
9.1. Определите функцию ſƀ , которая возвращает следующий список:
ƃɐ ɐř ɐɐř ɐ ɐƄ.
9.2. Определите функцию генератора ɏſƀ, которая возвращает нечетные
числа из диапазона ſɨɥƀ. Используйте цикл for, чтобы найти и вывести
третье возвращенное значение.
9.3. Определите декоратор test, который выводит строку ɐɐ при вызове функ-
ции и строку ɐɐ, когда функция завершает свою работу.
9.4. Определите исключение . Сгенерируйте его и посмотрите, что
произойдет. Затем напишите код, позволяющий поймать это исключение и вы-
вести строку ɐ an ɐ.
ƋƓƈƊƈ
ǶȑȖȑȖȑȖȉȢȍȒȚȣȐȒȓȈșșȣ
Элизабет Боуэн
Джаспер Джонс
Как я уже говорил ранее, в Python все, от чисел до функций, является объектами.
Однако Python скрывает бо' льшую часть функционирования объектных механизмов
с помощью особого синтаксиса. Вы можете написать ʰ 7, и, таким образом, у вас
появится объект типа int со значением 7 и назначится ссылка на объект по имени
. Заглядывать внутрь объектов нужно только в случае, если вам необходимо
создать собственный объект или модифицировать поведение уже существующих.
В этой главе вы увидите, как сделать и то и другое.
ǿȚȖȚȈȒȖȍȖȉȢȍȒȚȣ
Объект — это пользовательская структура данных, которая содержит как данные
(переменные, называемые атрибутами), так и код (функции, называемые мето-
дами). Он представляет собой уникальный экземпляр чего-то конкретного. Можно
думать об объектах как о существительных, а об их методах — как о глаголах. Объект
представляет собой единичный экземпляр, методы определяют его взаимодействие
с другими объектами.
Например, целочисленный объект со значением 7 может использовать такие
методы, как сложение и умножение, что показано в главе 3. ɯ — другой объект.
Это значит, что существует класс , встроенный в Python, которому принад-
лежат объекты 7 и ɯ. Строки ɐ ɐ и ɐ ɐ также являются объектами и имеют
ǫȓȈȊȈǶȑȖȑȖȑȖȉȢȍȒȚȣȐȒȓȈșșȣ
ǷȘȖșȚȣȍȖȉȢȍȒȚȣ
Начнем мы с простых классов, а разговор о наследовании перенесем на несколько
страниц вперед.
ǶȗȘȍȌȍȓȧȍȔȒȓȈșșșȗȖȔȖȡȤȦȒȓȦȟȍȊȖȋȖșȓȖȊȈFODVV
Чтобы создать новый объект, который никто раньше не создавал, вам сначала нужно
определить класс, который укажет на то, что в объекте содержится.
В главе 2 я сравнил объект с пластмассовой коробкой. Класс похож на форму, по
образцу которой создается эта коробка. Например, в Python есть встроенный класс,
создающий строковые объекты, такие как ɐ ɐ и ɐ ɐ. Python имеет и множество
других встроенных классов, позволяющих создавать другие стандартные типы дан-
ных, в том числе списки, словари и т. д. Чтобы создать собственный объект в Python,
вам сначала нужно определить класс с помощью ключевого слова . Рассмотрим
несколько простых примеров.
Предположим, вы хотите определить объекты для представления информации
о котах1. Каждый объект будет представлять одного кота. Сначала вам нужно опре-
делить класс в качестве формы. В последующих примерах мы попробуем ис-
пользовать больше версий этого класса, продвигаясь от простейшего класса к тому,
который действительно может делать что-то полезное.
ǴȣșȓȍȌțȍȔȒȖȕȞȍȗȞȐȧȔȖȉȐȔȍȕȖȊȈȕȐȐțȒȈȏȈȕȕȣȔȊ3(3 KWWSVRUHLOO\J$-2)
Можно и так:
ʴʴʴ ś
ŜŜŜ
Как и в случае с функциями, нам нужно сказать pass, чтобы указать, что этот
класс пуст. Такое определение является минимально необходимым для создания
1
Мы это сделаем, даже если вы не хотите.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
объекта. Вы создаете объект из класса, вызывая имя класса так, как если бы это
была функция:
ʴʴʴɏ ʰſƀ
ʴʴʴɏ ʰſƀ
В этом случае вызов ſƀ создаст два отдельных объекта класса , и мы при-
своим им имена ɏ и ɏ . Но наш класс пуст, поэтому объекты,
которые мы создали, просто занимают место и ничего не делают.
Хотя нет, кое-что они могут.
ǨȚȘȐȉțȚȣ
Атрибут — это переменная, расположенная внутри класса или объекта. Во время
и после создания объекта или класса вы можете присвоить им атрибуты. Атрибутом
может быть любой другой объект. Давайте снова создадим два объекта типа :
ʴʴʴ ś
ŜŜŜ
ŜŜŜ
ʴʴʴɏ ʰſƀ
ʴʴʴɏ
ʳɏɏɏɏŜ ɥɨɥɥ ɨɥʴ
ʴʴʴɏ ʰſƀ
ʴʴʴɏ
ʳɏɏɏɏŜ ɥɨɥɥ ɨɫɯʴ
Когда мы определили класс , мы не указали, в каком виде его объект будет
выведен на экран. Тут в дело вмешивается Python и выводит на экран что-то вроде
ʳɏɏɏɏŜ at ɥɨɥɥ ɨɥʴ. В разделе «Магические методы» на с. 215 вы
увидите, как можно изменить это поведение, используемое по умолчанию.
Теперь назначим несколько атрибутов нашему первому объекту:
ʴʴʴɏ Ŝʰɪ
ʴʴʴɏ ŜʰɑŜ ɑ
ʴʴʴɏ Ŝʰɏ
ǴȍȚȖȌȣ
Метод — это функция класса или объекта. Метод выглядит так же, как и любая
другая функция, но может быть использован особым образом — этот вопрос мы
рассмотрим далее в этой главе, в подразделе «Свойства для доступа к атрибутам»
и в разделе «Типы методов».
ǰȕȐȞȐȈȓȐȏȈȞȐȧ
Если вы хотите присвоить атрибуты объекту во время его создания, вам понадобится
специальный метод инициализации ɏɏɏɏ:
ʴʴʴ ś
ŜŜŜɏɏɏɏſƀś
ŜŜŜ
Так выглядят реальные определения классов в Python. Согласен, ɏɏɏɏſƀ
и self смотрятся странно. ɏɏɏɏſƀ — это особое имя метода, который инициа-
лизирует отдельный объект с помощью определения его класса1. Аргумент self
указывает на сам объект.
Когда вы указываете ɏɏɏɏſƀ в определении класса, его первым параметром
должен быть объект с именем self. Несмотря на то что в Python self не является
зарезервированным словом, оно применяется довольно часто. Никому из тех, кто
будет читать ваш код позже (включая вас!), не придется гадать, что вы имели в виду,
когда использовали слово self.
Но даже в этом случае второе определение класса создает объект, который
ничего не делает. Наша третья попытка покажет, насколько легко создать простой
объект в Python и присвоить значение одному из его атрибутов. В этот раз мы до-
бавим параметр в метод инициализации:
ʴʴʴ ſƀś
ŜŜŜɏɏɏɏſřƀś
ŜŜŜŜʰ
ŜŜŜ
ʴʴʴ
1
Вы встретите множество примеров двойных подчеркиваний в именах Python. Для эконо-
мии времени некоторые люди называют их dunder.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
Теперь мы можем создать объект класса , передав строку для параметра :
ʴʴʴʰſɐ ɐƀ
Помните, внутри определения класса вы получаете доступ к атрибуту с по-
мощью конструкции Ŝ. Когда вы создаете реальный объект и присваиваете
его переменной вроде furball, то ссылаетесь на этот атрибут как Ŝ.
Не обязательно иметь метод ɏɏɏɏſƀ в описании каждого класса — он исполь-
зуется для того, чтобы различать объекты одного класса. Это не то, что в некоторых
других языках называется конструктором. Python уже создал объект для вас. Метод
ɏɏɏɏſƀ следует рассматривать скорее как средство инициализации.
ǪȣȔȖȎȍȚȍșȖȏȌȈȚȤȔȕȖȋȖȖȚȌȍȓȤȕȣȝȖȉȢȍȒȚȖȊȐȏȖȌȕȖȋȖȒȓȈșșȈǵȖȗȖȔȕȐȚȍȟȚȖ
Ȋ3\WKRQȌȈȕȕȣȍȘȍȈȓȐȏȖȊȈȕȣȒȈȒȖȉȢȍȒȚȣȗȖȥȚȖȔțȐșȈȔȒȓȈșșȧȊȓȧȍȚșȧȖȉȢȍȒȚȖȔ
ǶȌȕȈȒȖȊȊȈȠȍȑȗȘȖȋȘȈȔȔȍȔȖȎȍȚșțȡȍșȚȊȖȊȈȚȤȚȖȓȤȒȖȖȌȐȕȖȉȢȍȒȚȌȓȧȒȈȎȌȖȋȖ
ȒȓȈșșȈ ǭșȓȐ ȒȓȈșș &DW țȎȍ ȖȗȘȍȌȍȓȍȕ ȒȈȒ Ȕȣ șȌȍȓȈȓȐ Ȋ ȥȚȖȑ ȋȓȈȊȍ ȚȖ ȊȚȖȘȖȑ
ȚȈȒȖȑȒȓȈșșșȖȏȌȈȚȤȕȍȗȖȓțȟȐȚșȧǶȕșȚȈȕȖȊȐȚșȧȟȍȔȚȖȊȘȖȌȍǫȖȘȞȈ²ȌȖȓȎȍȕ
ȖșȚȈȚȤșȧȚȖȓȤȒȖȖȌȐȕ
ǵȈșȓȍȌȖȊȈȕȐȍ
Предположим, вы пытаетесь решить какую-то задачу и узнаете, что уже существует
класс, создающий объекты, которые делают почти все из того, что вам нужно. Как по-
ступить? Вы можете модифицировать данный класс: однако при этом вы сделаете
его более сложным и, вполне вероятно, испортите то, что раньше работало.
ǫȓȈȊȈǶȑȖȑȖȑȖȉȢȍȒȚȣȐȒȓȈșșȣ
ǵȈșȓȍȌȖȊȈȕȐȍȖȚȘȖȌȐȚȍȓȤșȒȖȋȖȒȓȈșșȈ
Вы определяете только то, что вам нужно добавить или изменить в новом классе,
и этот код переопределяет поведение старого класса. Оригинальный класс назы-
вается родительским классом, суперклассом или базовым классом, а новый класс
именуется потомком, подклассом или производным классом. Эти термины в объек-
тно-ориентированном программировании взаимозаменяемы.
Итак, попробуем что-нибудь унаследовать. В следующем примере мы определим
пустой класс, который называется . Далее мы определим подкласс класса ,
который называется 1. Вы определяете подкласс с помощью все того же клю-
чевого слова , но указываете внутри скобок имя родительского класса
ſƀ, как показано ниже:
ʴʴʴ ſƀś
ŜŜŜ
ŜŜŜ
ʴʴʴ ſƀś
ŜŜŜ
ŜŜŜ
1
Недорогая и не очень качественная машина 1980-х годов.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
Не сделав ничего особенного, класс унаследовал метод ſƀ класса .
Фактически класс говорит, что он является классом , а это может привести
к кризису самоопределения. Посмотрим, как решить проблему.
ǻȚȈȒȖȋȖȗȘȐȍȔȈȒȈȒȕȈșȓȍȌȖȊȈȕȐȍȍșȚȤȖȗȘȍȌȍȓȍȕȕȣȍȗȘȍȐȔțȡȍșȚȊȈȕȖȐȕȖȋȌȈ
ȐȔȗȖȓȤȏțȦȚșȧșȓȐȠȒȖȔȟȈșȚȖǴȕȖȋȖȓȍȚȕȐȑȖȗȣȚȘȈȉȖȚȣȊȖȉȢȍȒȚȕȖȖȘȐȍȕȚȐȘȖ
ȊȈȕȕȖȔ ȗȘȖȋȘȈȔȔȐȘȖȊȈȕȐȐ ȗȖȒȈȏȈȓ ȟȚȖ ȟȘȍȏȔȍȘȕȖȍ țȊȓȍȟȍȕȐȍ ȕȈșȓȍȌȖȊȈȕȐȍȔ
ȔȖȎȍȚȏȈȚȘțȌȕȐȚȤțȗȘȈȊȓȍȕȐȍȗȘȖȋȘȈȔȔȈȔȐǪȔȍșȚȖȥȚȖȋȖȘȍȒȖȔȍȕȌțȍȚșȧșȌȍȓȈȚȤ
ȈȒȞȍȕȚȕȈȐșȗȖȓȤȏȖȊȈȕȐȐȌȘțȋȐȝȗȘȐȍȔȖȊȚȈȒȐȝȒȈȒȈȋȘȍȋȐȘȖȊȈȕȐȍȐȒȖȔȗȖȏȐȞȐȧ
ǰȝȔȣȘȈșșȔȖȚȘȐȔȚȈȒȎȍȊȥȚȖȑȋȓȈȊȍ
ǷȍȘȍȖȗȘȍȌȍȓȍȕȐȍȔȍȚȖȌȖȊ
Как вы только что увидели, новый класс изначально наследует все, что находится
в его родительском классе. Далее вы узнаете, как можно заменить, или переопреде-
лить, родительские методы. Класс должен как-то отличаться от класса , ина-
че зачем вообще создавать новый класс. Изменим способ работы метода ſƀ
для класса :
ʴʴʴ ſƀś
ŜŜŜ ſƀś
ŜŜŜſɑ ɐŠɑƀ
ŜŜŜ
ʴʴʴ ſƀś
ŜŜŜ ſƀś
ŜŜŜſɑ ɐŠ řŞŜɑƀ
ŜŜŜ
ǫȓȈȊȈǶȑȖȑȖȑȖȉȢȍȒȚȣȐȒȓȈșșȣ
ǬȖȉȈȊȓȍȕȐȍȔȍȚȖȌȈ
В производный класс можно добавить и метод, которого не было в родительском
классе. Вернемся к классам и и определим новый метод ɏɏſƀ
только для класса :
ʴʴʴ ſƀś
ŜŜŜ ſƀś
ŜŜŜſɑ ɐŠɑƀ
ŜŜŜ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ʴʴʴ ſƀś
ŜŜŜ ſƀś
ŜŜŜſɑ ɐŠ řŞŜɑƀ
ŜŜŜɏɏſƀś
ŜŜŜſɑţɑƀ
ŜŜŜ
К этому моменту класс может делать то, чего не может делать класс ,
и, таким образом, мы ясно видим отличительные особенности класса .
ǷȖȓțȟȈȍȔȗȖȔȖȡȤȖȚșȊȖȍȋȖȘȖȌȐȚȍȓȧ
șȐșȗȖȓȤȏȖȊȈȕȐȍȔȔȍȚȖȌȈVXSHU
Мы видели, как производный класс может добавить или переопределить метод
родительского класса. Но что, если нужно будет вызвать этот родительский метод?
«Рад, что вы спросили», — говорит метод ſƀ. Сейчас мы определим новый класс
, который представляет объект класса с адресом электронной по-
чты. Для начала запишем наше привычное определение класса :
ʴʴʴ ſƀś
ŜŜŜɏɏɏɏſřƀś
ŜŜŜŜʰ
ŜŜŜ
Почему бы нам просто не определить новый класс так, как показано далее?
ʴʴʴ ſƀś
ŜŜŜɏɏɏɏſřřƀś
ŜŜŜŜʰ
ŜŜŜŜʰ
ǴȕȖȎȍșȚȊȍȕȕȖȍȕȈșȓȍȌȖȊȈȕȐȍ
Вы только что видели несколько примеров классов, у которых нет родительского
класса, и несколько примеров, у которых есть. Однако объекты могут наследовать
и от нескольких родительских классов.
Если ваш класс ссылается на метод или атрибут, которого у него нет, Python
будет искать его в родительском классе. Что, если у нескольких классов будут атри-
буты с одинаковыми именами? Кто победит?
В отличие от наследования у людей, когда доминантный ген побеждает незави-
симо от того, кому он принадлежит, наследование в Python зависит от порядка раз-
решения методов. Каждый класс Python имеет особый метод ſƀ, возвращающий
список классов, в которых будет выполнен поиск метода или атрибута для объекта
этого класса. Похожий атрибут с именем ɏɏɏɏ представляет собой кортеж, содер-
жащий имена этих классов. Как и в плей-офф, когда действует принцип «внезапной
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
Если нам понадобится метод или атрибут класса , Python будет искать его
в следующих классах по порядку.
1. Сам объект (типа ).
2. Класс объекта ().
3. Первый родительский класс этого класса ().
4. Второй родительский класс этого класса ( ).
5. Прародительский класс этого класса ().
Для класса список выглядит примерно так же, только класс распо-
ложится перед классом :
ʴʴʴŜſƀ
ƃʳ ɐɏɏɏɏŜɐʴřʳ ɐɏɏɏɏŜɐʴř
ʳ ɐɏɏɏɏŜ ɐʴřʳ ɐɏɏɏɏŜɐʴř
ʳ ɐ ɐʴƄ
ʴʴʴ Ŝſƀ
ƃʳ ɐɏɏɏɏŜ ɐʴřʳ ɐɏɏɏɏŜ ɐʴř
ʳ ɐɏɏɏɏŜɐʴřʳ ɐɏɏɏɏŜɐʴř
ɐ ɐʴƄ
1
У мула (mule) папа — осел, а мама — лошадь. У лошака (hinny) папа — конь, а мама — ослица.
ǫȓȈȊȈǶȑȖȑȖȑȖȉȢȍȒȚȣȐȒȓȈșșȣ
ǷȘȐȔȍșȐ
Вы можете включить дополнительный родительский класс в определение вашего
класса, но только в качестве вспомогательного. Таким образом, он не будет иметь
общих методов с другими родительскими классами, что позволит избежать неодно-
значности при разрешении методов, о которой я говорил ранее.
Такой родительский класс называют классом-примесью или миксином. Приме-
си можно использовать для выполнения «сторонних» задач, таких, например, как
ведение журнала. Рассмотрим класс-примесь, который форматирует и выводит на
экран атрибуты объекта:
ʴʴʴ ſƀś
ŜŜŜſƀś
ŜŜŜ
ŜŜŜŜſſƀƀ
ŜŜŜ
ʴʴʴ ſƀś
ŜŜŜ
ŜŜŜ
ʴʴʴʰſƀ
ʴʴʴŜʰɑɑ
ʴʴʴŜʰɑ ɑ
ʴʴʴŜʰɑ ɑ
ʴʴʴŜſƀ
Ƈɐɐśɐ ɐřɐɐśɐ ɐřɐɐśɐɐƈ
ǪȏȈȡȐȚțVHOI
Помимо применения пробелов, Python критикуют и за то, что необходимо вклю-
чать self в качестве первого аргумента методов экземпляра класса (методов,
которые вы видели в предыдущих примерах). Python использует аргумент self,
чтобы найти атрибуты и методы правильного объекта. Например, я покажу, как
вы можете вызвать метод объекта и что Python при этом сделает за кулисами на
самом деле.
Помните класс из предыдущих примеров? Снова вызовем метод ſƀ:
ʴʴʴɏ ʰſƀ
ʴʴʴɏ Ŝ ſƀ
ɐŠ
Тем не менее нет никаких причин использовать этот более длинный стиль.
ǬȖșȚțȗȒȈȚȘȐȉțȚȈȔ
В Python атрибуты объектов и методы обычно являются общедоступными, поэтому
предполагается, что тот, кто их использует, не станет этим злоупотреблять (это ино-
гда называют «установкой на взрослых людей»). Давайте сравним прямой доступ
и его альтернативы.
ǷȘȧȔȖȑȌȖșȚțȗ
Как вы уже видели, вы можете получать и задавать значения атрибутов напрямую:
ʴʴʴ ś
ŜŜŜɏɏɏɏſřɏƀś
ŜŜŜŜʰɏ
ŜŜŜ
ʴʴʴʰ ſɐɐƀ
ʴʴʴŜ
ɐɐ
ǫȍȚȚȍȘȣȐșȍȚȚȍȘȣ
Отдельные объектно-ориентированные языки поддерживают закрытые атрибуты
объектов, к которым нельзя получить доступ напрямую. Программистам часто при-
ходится писать геттеры и сеттеры, чтобы прочитать и записать значения таких
атрибутов.
В Python нет закрытых атрибутов, но вы можете написать геттеры и сеттеры для
атрибутов с обфусцированными именами, чтобы создать нечто подобное (Лучшим
решением будет использование свойств, они описаны в следующем подразделе.)
Далее в примере мы определим класс , имеющий один атрибут экземпляра
ɏ. Мы не хотим, чтобы кто-то мог обратиться к атрибуту напрямую, по-
ǫȓȈȊȈǶȑȖȑȖȑȖȉȢȍȒȚȣȐȒȓȈșșȣ
ʴʴʴʰ ſɐɐƀ
ʴʴʴŜɏſƀ
ɐɐ
ʴʴʴŜɏſɐɐƀ
ʴʴʴŜɏſƀ
ɐɐ
ǹȊȖȑșȚȊȈȌȓȧȌȖșȚțȗȈȒȈȚȘȐȉțȚȈȔ
Более питонским решением для закрытия атрибутов является использование
свойств.
Существует два способа сделать это. Первый — добавить конструкцию ʰ Ş
ſɏř ɏƀ последней строкой в предыдущее определение клас-
са :
ʴʴʴ ſƀś
ʴʴʴɏɏɏɏſřɏƀś
ʴʴʴŜɏʰɏ
ʴʴʴɏſƀś
ʴʴʴſɐɐƀ
ʴʴʴŜɏ
ʴʴʴɏſřɏƀś
ʴʴʴſɐɐƀ
ʴʴʴŜɏʰɏ
ʴʴʴʰſɏřɏƀ
ʴʴʴŜɏſƀ
ɐɐ
Вы все еще можете получить доступ к , как будто это атрибут:
ʴʴʴʰ ſɐ ɐƀ
ʴʴʴŜ
ɐ ɐ
ʴʴʴŜʰɐɐ
ʴʴʴŜ
ɐɐ
ǭșȓȐȒȚȖȚȖȐȌȖȋȈȌȈȍȚșȧȟȚȖȔȣȕȈȏȊȈȓȐȕȈȠȈȚȘȐȉțȚKLGGHQBQDPHșȟȐȚȈȚȤȐȏȈ
ȗȐșȈȚȤȍȋȖȖȕȊșȍȘȈȊȕȖȔȖȎȍȚȕȍȗȖșȘȍȌșȚȊȍȕȕȖȒȈȒIRZOKLGGHQBQDPHǪȗȖȌȘȈȏ
Ȍȍȓȍ©ǰșȒȈȎȍȕȐȍȐȔȍȕȌȓȧȉȍȏȖȗȈșȕȖșȚȐªȌȈȓȍȍȊȥȚȖȑȋȓȈȊȍȊȣțȊȐȌȐȚȍȖșȖȉȣȑ
șȗȖșȖȉ3\WKRQȗȖȏȊȖȓȧȦȡȐȑșȒȘȣȚȤȐȔȍȕȈȈȚȘȐȉțȚȖȊ
ǫȓȈȊȈǶȑȖȑȖȑȖȉȢȍȒȚȣȐȒȓȈșșȣ
ǹȊȖȑșȚȊȈȌȓȧȊȣȟȐșȓȧȍȔȣȝȏȕȈȟȍȕȐȑ
В предыдущих примерах мы использовали свойство , чтобы обратиться к от-
дельному атрибуту (в нашем случае ɏ), который хранится внутри объекта.
Свойство может возвращать и вычисляемое значение. Определим класс ,
который имеет атрибут и вычисляемое свойство :
ʴʴʴ ſƀś
ŜŜŜɏɏɏɏſřƀś
ŜŜŜŜʰ
ŜŜŜɒ
ŜŜŜſƀś
ŜŜŜɩƋŜ
ŜŜŜ
Мы создаем объект класса , задав значение его атрибута :
ʴʴʴ ʰ ſɬƀ
ʴʴʴ Ŝ
ɬ
Мы можем обратиться к свойству точно так же, как если бы это был
атрибут, подобный :
ʴʴʴ Ŝ
ɨɥ
А вот и самое интересное — мы можем изменить значение атрибута в лю-
бой момент, и свойство будет рассчитано на основе текущего значения
атрибута :
ʴʴʴ Ŝʰ7
ʴʴʴ Ŝ
ɨɫ
Если вы не укажете сеттер для атрибута, то не сможете устанавливать его значе-
ние извне. Это удобно для атрибутов, которые должны быть доступны только для
чтения:
ʴʴʴ Ŝʰɩɥ
ſ ƀś
ɑʳʴɑřɨřʳʴ
ś ɐ
У использования свойств вместо непосредственного доступа к атрибутам имеется
еще одно преимущество: если вы измените определение атрибута, вам нужно будет
поправить только код внутри определения класса вместо того, чтобы править все
вызовы.
ǰșȒȈȎȍȕȐȍȐȔȍȕȌȓȧȉȍȏȖȗȈșȕȖșȚȐ
В рассмотренном ранее примере с классом мы назвали наш (не полностью)
скрытый атрибут ɏ. Python предлагает соглашения по именованию для
атрибутов, которые не должны быть видимы за пределами определения их классов:
имена начинаются с двух нижних подчеркиваний (ɏɏ).
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
Обратите внимание на то, что на экране не появилась надпись the getter.
Хотя эта защита неидеальна, искажение имен препятствует случайному или пред-
намеренному доступу к атрибуту.
ǨȚȘȐȉțȚȣȒȓȈșșȖȊȐȖȉȢȍȒȚȖȊ
Вы можете присвоить атрибуты классам, и они будут унаследованы их объектами-
потомками:
ʴʴʴ ś
ŜŜŜ ʰɐɐ
ŜŜŜ
1
Вы умеете хранить секреты? Я, кажется, нет.
ǫȓȈȊȈǶȑȖȑȖȑȖȉȢȍȒȚȣȐȒȓȈșșȣ
ʴʴʴʰ ſƀ
ʴʴʴ Ŝ
ɐɐ
ʴʴʴŜ
ɐɐ
ǺȐȗȣȔȍȚȖȌȖȊ
Одни методы являются частью самого класса, другие — частью объектов, созданных
из этого класса, а какие-то не являются ни тем ни другим.
Если перед методом нет декоратора, то это метод объекта и его первым аргумен-
том должен быть self, который ссылается на объект.
Если у метода есть декоратор ɒ , то это метод класса и его первым
аргументом должен быть (имя может быть любым, кроме зарезервированного
слова ), который ссылается на класс.
Если у метода есть декоратор ɒ , то это статический метод и его
первым аргументом будет не объект и не класс.
В следующих подразделах мы рассмотрим эти вопросы более детально.
ǴȍȚȖȌȣȖȉȢȍȒȚȖȊ
Когда вы видите начальный аргумент self в методах внутри определения класса,
вы имеете дело с методом объекта: такие методы вы обычно пишете, когда создаете
собственный класс. Первый параметр метода экземпляра — это self, Python пере-
дает объект методу, когда вы его вызываете. Это единственные методы, которые мы
уже рассмотрели.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǴȍȚȖȌȣȒȓȈșșȖȊ
В противоположность ему метод класса влияет на весь класс целиком. Любое из-
менение, которое происходит с классом, влияет на все его объекты. Внутри опреде-
ления класса декоратор ɒ показывает, что следующая функция является
методом класса. Первым параметром метода также является сам класс. По традиции
этот параметр называется , поскольку слово зарезервировано и не может
быть использовано в данной ситуации. Определим метод класса для Ǡ, который будет
подсчитывать количество созданных объектов:
ʴʴʴ ſƀś
ŜŜŜ ʰɥ
ŜŜŜɏɏɏɏſƀś
ŜŜŜŜ ʫʰɨ
ŜŜŜ ſƀś
ŜŜŜſɑ ɐŠɑƀ
ŜŜŜɒ
ŜŜŜſ ƀś
ŜŜŜſɑɑř Ŝ řɑ Ŝɑƀ
ŜŜŜ
ʴʴʴ
ʴʴʴɏʰſƀ
ʴʴʴɏʰſƀ
ʴʴʴɏʰſƀ
ʴʴʴŜſƀ
ɪ Ŝ
Обратите внимание на то, что мы вызвали метод Ŝ (атрибут класса) вместо
Ŝ (который является атрибутом объекта). В методе ſƀ мы использова-
ли вызов Ŝ , но с тем же успехом могли бы применить вызов Ŝ .
ǹȚȈȚȐȟȍșȒȐȍȔȍȚȖȌȣ
Третий тип методов не влияет ни на классы, ни на объекты: он находится внутри
класса только для удобства, чтобы не располагаться где-то отдельно. Это статиче-
ский метод, которому предшествует декоратор ɒ , не имеющий в каче-
стве начального параметра ни self, ни класс . Рассмотрим пример, который
является рекламой класса :
ʴʴʴ ſƀś
ŜŜŜɒ
ŜŜŜ ſƀś
ŜŜŜſɐ ɐƀ
ŜŜŜ
ʴʴʴ
ʴʴʴŜ ſƀ
Обратите внимание на то, что нам не нужно создавать объект класса ,
чтобы получить доступ к этому методу. И это замечательно.
ǫȓȈȊȈǶȑȖȑȖȑȖȉȢȍȒȚȣȐȒȓȈșșȣ
ǻȚȐȕȈȧȚȐȗȐȏȈȞȐȧ
В Python имеется также реализация полиморфизма — это значит, что одна операция
может быть произведена над разными объектами, основываясь на имени метода и его
аргументах, независимо от их класса.
Используем уже знакомый нам инициализатор ɏɏɏɏſƀ для всех трех классов
, но добавим две новые функции:
ʴʴʴɨʰſɐɐřɑɐř ɑƀ
ʴʴʴſɨŜſƀřɐśɐřɨŜſƀƀ
śɐř ţ
Три разные версии метода ſƀ обеспечивают разное поведение трех классов.
Так выглядит традиционный полиморфизм в объектно-ориентированных языках.
Python пошел немного дальше и позволяет вызывать методы ſƀ и ſƀ для
любых объектов, в том числе и для этих методов. Определим класс ,
который не имеет никакого отношения к нашим охотнику и его жертвам (потомкам
класса ), созданным ранее:
ʴʴʴ ſƀś
ŜŜŜſƀś
ŜŜŜɐɐ
ŜŜŜſƀś
ŜŜŜɐɐ
ŜŜŜ
ʴʴʴʰſƀ
Теперь запустим методы ſƀ и ſƀ разных объектов, один из которых ()
совершенно не связан с остальными:
ʴʴʴɏſƀś
ŜŜŜſŜſƀřɐɐřŜſƀƀ
ŜŜŜ
ʴʴʴɏſƀ
ɐŜ
ʴʴʴɏſɨƀ
ɐř ţ
ʴʴʴɏſɩƀ
ɐŠ
ʴʴʴɏſƀ
Благодаря старинной поговорке «Если нечто выглядит как утка, плавает как утка
и крякает как утка, то, скорее всего, это и есть утка» подобное поведение иногда на-
зывают утиной типизацией (рис. 10.1). Кто мы такие, чтобы спорить с мудрецом,
рассуждающим об утках?
ǸȐșǻȚȐȕȈȧȚȐȗȐȏȈȞȐȧ²ȥȚȖȕȍȏȕȈȟȐȚȗȍȟȈȚȈȚȤȚȍȒșȚșȓȖȎȐȊȋțȉȣțȚȖȟȒȖȑ
ǫȓȈȊȈǶȑȖȑȖȑȖȉȢȍȒȚȣȐȒȓȈșșȣ
ǴȈȋȐȟȍșȒȐȍȔȍȚȖȌȣ
Теперь вы можете создавать и использовать простые объекты. То, что мы изучим
в этом разделе, может вас удивить — в хорошем смысле этого слова.
Когда вы пишете что-то вроде a ʰ ɪ ʫ ɯ , откуда целочисленные объекты со
значениями ɪ и ɯ узнают, как реализовать операцию ʫ? А если вы введете конструк-
цию ʰ ɑɑ ʫ " " ʫ ɑ ɑ, как Python узнает, что оператор ʫ теперь означает
конкатенацию строк? И что подскажет переменным a и , как применить ʰ, чтобы
получить результат? Вы можете получить доступ к этим операторам, используя спе-
циальные методы Python (или, что звучит более драматично, магические методы).
Имена этих методов начинаются и заканчиваются двойными подчеркиваниями
(ɏɏ). Почему? Как правило, такие имена не выбирают в качестве имен для пере-
менных. Вы уже видели один такой метод: ɏɏɏɏſƀ инициализирует только что
созданный объект с помощью описания его класса и любых аргументов, которые
передаются в этот метод. Вы также видели (см. подраздел «Искажение имен для
безопасности»), как использование в именах двойного нижнего подчеркивания по-
могает исказить имена атрибутов класса и его методов.
Предположим, у вас есть простой класс и вы хотите написать для него ме-
тод ſƀ, который сравнивает два слова, игнорируя регистр. Так и есть, объект
класса , содержащий значение ɐɐ, будет считаться равным другому объекту,
который содержит значение ɐ ɐ.
В следующем примере показана наша первая попытка, где мы вызываем ſƀ —
обычный метод. Ŝ — это текстовая строка, которую содержит объект класса
. Метод ſƀ сравнивает ее с текстовой строкой, содержащейся в объекте
ɩ (другом объекте класса ):
ʴʴʴ ſƀś
ŜŜŜɏɏɏɏſřƀś
ŜŜŜŜʰ
ŜŜŜ
ŜŜŜſřɩƀś
ŜŜŜŜŜſƀʰʰɩŜŜſƀ
ŜŜŜ
Далее создадим три объекта с помощью трех разных текстовых строк:
ʴʴʴʰſɐɐƀ
ʴʴʴ ʰſɐ ɐƀ
ʴʴʴʰſɐɐƀ
Магия! Все, что нам было нужно, — указать особое имя метода для проверки на
равенство ɏɏɏɏſƀ. В табл. 10.1 и 10.2 приведены имена самых полезных магических
методов.
ǺȈȉȓȐȞȈǴȈȋȐȟȍșȒȐȍȔȍȚȖȌȣȌȓȧșȘȈȊȕȍȕȐȧ
ǺȈȉȓȐȞȈǴȈȋȐȟȍșȒȐȍȔȍȚȖȌȣȌȓȧȊȣȟȐșȓȍȕȐȑ
__str__(self) str(self)
__repr__(self) repr(self)
__len__(self) len(self)
ǨȋȘȍȋȐȘȖȊȈȕȐȍȐȒȖȔȗȖȏȐȞȐȧ
Наследование может сослужить хорошую службу, когда вы хотите, чтобы класс-
потомок бо' льшую часть времени вел себя как родительский класс (потомок является
родителем). Возможность создавать иерархии наследования довольно заманчива,
но иногда композиция или агрегирование имеет больше смысла. В чем разница?
При композиции один объект является частью другого. Утка является птицей (на-
следование), но имеет хвост (композиция). Хвост не похож на утку — он является
частью утки. В следующем примере создадим объекты bill и tail и предоставим
их новому объекту :
ʴʴʴ ſƀś
ŜŜŜɏɏɏɏſř ƀś
ŜŜŜŜ ʰ
ŜŜŜ
ʴʴʴ ſƀś
ŜŜŜɏɏɏɏſřƀś
ŜŜŜŜʰ
ŜŜŜ
ʴʴʴ ſƀś
ŜŜŜɏɏɏɏſřřƀś
ŜŜŜŜʰ
ŜŜŜŜʰ
ŜŜŜſƀś
ŜŜŜſɐ ɐřŜŜ řɐɐř
ŜŜřɐɐƀ
ŜŜŜ
ʴʴʴȔɏʰſɐɐƀ
ʴʴʴȔɏʰſɐɐƀ
ʴʴʴ ʰ ſȔɏřȔɏƀ
ʴʴʴ Ŝſƀ
DzȖȋȌȈȐșȗȖȓȤȏȖȊȈȚȤȖȉȢȍȒȚȣ
ȈȒȖȋȌȈ²ȟȚȖȚȖȌȘțȋȖȍ
Рассмотрим несколько рекомендаций, которые помогут вам понять, где лучше раз-
местить свой код и данные — в классе, в модуле (их мы рассмотрим в главе 11) или
в чем-то совершенно ином.
Объекты наиболее полезны, когда вам нужно иметь несколько отдельных экзем-
пляров с одинаковым поведением (методы), но разным внутренним состоянием
(атрибуты).
Классы, в отличие от модулей, поддерживают наследование.
ǫȓȈȊȈǶȑȖȑȖȑȖȉȢȍȒȚȣȐȒȓȈșșȣ
Если вам нужен только один объект, модуль может быть лучшим выбором.
Независимо от того, сколько обращений к модулю имеется в программе, загру-
зится только одна копия. (Программистам на Java и С++: можете использовать
модули в Python как синглтоны.)
Если у вас есть несколько переменных, которые содержат разные значения
и могут быть переданы в качестве аргументов в несколько функций, лучше всего
определить их как классы. Например, вы можете использовать словарь с ключами
и , чтобы представить цветное изображение. Вы можете создать раз-
ные словари для каждого изображения в программе и передавать их в качестве
аргументов в функции ſƀ и ſƀ. Правда, по мере добавления новых
ключей и функций разбираться со всем этим станет трудно. Поэтому более пред-
почтительно определить класс с атрибутами или и методами
ſƀ и ſƀ. Тогда все данные и методы для работы с цветными изо-
бражениями будут определены в одном месте.
Используйте самые простые решения. Словарь, список или кортеж проще, ком-
пактнее и быстрее, чем модуль, который, в свою очередь, проще, чем класс.
Совет от Гвидо ван Россума: «Избегайте усложнения структур данных. Кортежи
лучше объектов (можно воспользоваться именованными кортежами). Пред-
почитайте простые поля функциям, геттерам и сеттерам. (Встроенные типы
данных — ваши друзья.) Используйте больше чисел, строк, кортежей, списков,
множеств, словарей. Взгляните также на библиотеку , особенно на
класс ».
Более новой альтернативой является класс данных, он рассматривается далее
в этой главе.
ǰȔȍȕȖȊȈȕȕȣȍȒȖȘȚȍȎȐ
Поскольку Гвидо только что упомянул их, а я еще не говорил, самое время рас-
смотреть именованные кортежи. Именованный кортеж — это подкласс кортежей,
с помощью которых вы можете получить доступ к значениям по имени (используя
конструкцию ŜȜȠȳ) и позиции (используя конструкцию ƃȥȠșȭșȡȜșƄ).
Рассмотрим пример из предыдущего раздела и преобразуем класс в имено-
ванный кортеж, сохранив bill и tail как простые строковые аргументы. Функцию
можно вызвать, передав ей два аргумента:
имя;
строку, содержащую имена полей, разделенные пробелами.
Именованные кортежи не поддерживаются Python автоматически: чтобы их ис-
пользовать, вам понадобится загрузить отдельный модуль. Мы сделаем это в первой
строке следующего примера:
ʴʴʴ
ʴʴʴ ʰſɐ ɐřɐɐƀ
ʴʴʴ ʰ ſɐɐřɐɐƀ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ʴʴʴ
ſʰɐɐřʰɐɐƀ
ʴʴʴ Ŝ
ɐɐ
ʴʴʴ Ŝ
ɐɐ
Но не в именованный кортеж:
ʴʴʴ Ŝ ʰɐɐ
ſ ƀś
ɑʳʴɑřɨřʳʴ
śɐ ɐ ɐ ɐ
DzȓȈșșȣȌȈȕȕȣȝ
Многие люди создают объекты для хранения данных (с помощью атрибутов объ-
ектов), а не для задания определенного поведения (с помощью методов). Вы уже
видели, как именованные кортежи могут стать альтернативным хранилищем данных.
В Python 3.7 появились классы данных.
Перед вами простой старый объект, имеющий один атрибут :
ʴʴ ſƀś
ŜŜŜɏɏɏɏſřƀś
ŜŜŜŜʰ
ŜŜŜ
ʴʴʴʰſɐɐƀ
ʴʴʴŜ
ɐɐ
Помимо декоратора ɒ , вам нужно определить атрибуты класса с помо-
щью аннотаций переменных (KWWSVZZZS\WKRQRUJGHYSHSVSHS). Это выглядит
как ȜȠȳś ȦȜȣ или ȜȠȳś ȦȜȣ = țȡȔȫșȡȜș, например ś str или ś str ʰ ɑɑ.
Типом может быть любой тип объектов в Python, включая созданные вами классы,
а не только встроенные, такие как str или int.
Когда вы создаете объект класса данных, вы предоставляете аргументы в том по-
рядке, в котором они указаны в классе, или используете именованные аргументы,
передавая их в любом порядке:
ʴʴʴ
ʴʴʴɒ
ŜŜŜ ś
ŜŜŜś
ŜŜŜś
ŜŜŜśʰɥ
ŜŜŜ
ʴʴʴʰſɐɐřɐ ɐřɫɭƀ
ʴʴʴ ʰſʰɐɐřʰɐ ɐƀ
ʴʴʴ
ſʰɐɐřʰɐ ɐřʰɫɭƀ
ʴʴʴ
ſʰɐ ɐřʰɐɐřʰɥƀ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
DWWUV
Вы уже видели, как создаются классы и как в них добавляются атрибуты, а также
как много текста для этого требуется набрать: надо определить метод-инициализатор
ɏɏɏɏſƀ, присвоить значения его аргументов атрибутам класса и создать мето-
ды, в имени которых присутствует двойное подчеркивание, например ɏɏɏɏſƀ.
Именованные кортежи и классы данных предлагают альтернативное решение, кото-
рое можно встретить в стандартной библиотеке, — если вам нужно создать простую
коллекцию данных, проще всего воспользоваться этими вариантами.
В статье The One Python Library Everyone Needs (KWWSVJO\SKWZLVWHGPDWUL[FRP
DWWUVKWPO) сравниваются простые классы, именованные кортежи и классы
данных. В ней по множеству причин рекомендуется использовать сторонний пакет
attrs (KWWSVRUHLOO\5GZO[), который позволяет меньше набирать, меньше проверять
данные и т. д. Взгляните сами и решите для себя, что вам больше нравится — эта
библиотека или встроенные решения.
ǿȐȚȈȑȚȍȌȈȓȍȍ
В следующей главе мы обратимся к более высокому уровню структурирования
кода — к модулям и пакетам.
ǻȗȘȈȎȕȍȕȐȧ
10.1. Создайте класс , не имеющий содержимого, и выведите его на экран.
Затем создайте объект этого класса и также выведите его. Совпада-
ют ли выведенные значения?
10.2. Создайте новый класс с именем ɩ и присвойте переменной letters зна-
чение ɐ ɐ. Выведите на экран значение letters.
10.3. Создайте еще один класс, который, конечно же, называется ɪ. В этот раз
присвойте значение ɐɐ атрибуту объекта letters. Выведите на экран зна-
ǫȓȈȊȈǶȑȖȑȖȑȖȉȢȍȒȚȣȐȒȓȈșșȣ
ǴȖȌțȓȐȐȖȗȍȘȈȚȖȘLPSRUW
Сейчас мы будем создавать код из нескольких файлов и применять его. Модуль — это
просто файл, содержащий код Python. Вам не нужно делать ничего особенного —
любой код, написанный на Python, может быть использован другими как модуль.
На код других модулей мы ссылаемся с помощью оператора . Это делает
код и переменные импортированного модуля доступными для вашей программы.
ǰȔȗȖȘȚȐȘțȍȔȔȖȌțȓȤ
Простейший вариант использования оператора выглядит как ȠȢȘȧȟȰ,
где ȠȢȘȧȟȰ — это имя другого файла Python без расширения Ŝ.
Предположим, вы с друзьями хотите съесть на обед что-то из фастфуда, но
не желаете долго выбирать, поскольку все равно последнее слово останется за тем,
кто будет громче всех кричать. Пусть выбирает компьютер! Напишем модуль всего
с одной функцией, которая будет возвращать случайное блюдо, и основную програм-
му, которая вызовет эту функцию и выведет результат на экран. Модуль (Ŝ)
показан в примере 11.1.
1
Как минимум читать было бы гораздо сложнее.
ǫȓȈȊȈǴȖȌțȓȐȗȈȒȍȚȣȐȗȘȖȋȘȈȔȔȣ
ǷȘȐȔȍȘIDVWS\
ſƀśɤȥȠȢȦȤȜȦșȥȦȤȢȞȧȘȢȞȧȠșȡȦȔȪȜȜ
ɑɑɑ ɑɑɑ
ſ ƀ
ǷȘȐȔȍȘOXQFKS\
Если вы поместите оба этих файла в один каталог и укажете Python запустить
файл Ŝ в качестве основной программы, он обратится к модулю fast и за-
пустит его функцию ſƀ. Мы написали эту версию функции ſƀ так, чтобы
она возвращала случайный результат из списка строк. Таким образом, основная
программа выведет:
ɛpython [Link]
ɐ
ɛpython [Link]
ɐ
ɛpython [Link]
ɐ
ǷȘȐȔȍȘIDVWS\
ʰƃɑ ɑřɑ ɑřɑɑřɑ ɑř
ɑɑřɑɑřɑ ɑƄ
ſƀś
Ŝ ſ ƀ
ǰȔȗȖȘȚȐȘțȍȔȔȖȌțȓȤșȌȘțȋȐȔȐȔȍȕȍȔ
В нашей основной программе Ŝ мы вызывали fast. Но что, если:
у вас есть другой модуль с таким же именем;
вы хотите использовать более короткое или простое имя;
ваши пальцы прищемило дверью и вы хотите набирать меньше текста?
В такой ситуации можно импортировать, используя псевдоним, как показано
в примере 11.4. Используем псевдоним f.
ǷȘȐȔȍȘIDVWS\
ʰŜ ſƀ
ſɑɐɑř ƀ
ǰȔȗȖȘȚȐȘțȍȔȚȖȓȤȒȖșȈȔȖȍȕȍȖȉȝȖȌȐȔȖȍ
С помощью Python можно импортировать одну или несколько частей модуля.
Со второй ситуацией вы уже имели дело: из модуля нам нужна была только
функция ſƀ.
Как и с модулями, вы можете дать псевдоним каждой части, которую импорти-
руете.
Теперь несколько раз перепишем файл Ŝ. Сначала импортируем функцию
ſƀ из модуля fast с ее исходным именем (пример 11.5).
ǷȘȐȔȍȘIDVWS\
ʰ ſƀ
ſɑɐɑř ƀ
ǫȓȈȊȈǴȖȌțȓȐȗȈȒȍȚȣȐȗȘȖȋȘȈȔȔȣ
ǷȈȒȍȚȣ
Мы проделали путь от отдельных строк кода до многострочных функций, автоном-
ных программ и нескольких модулей в одном каталоге. Если модулей у вас немного,
можно разместить их в одной папке.
Для того чтобы еще больше промасштабировать приложения Python, вы можете
организовать модули в иерархии файлов и модулей, которые называют ȣȔȞșȦȔȠȜ.
Пакет — это обычный подкаталог, содержащий файлы с расширением Ŝ. Внутри
каталогов можно создавать другие подкаталоги, которые, в свою очередь, могут
иметь свои подкаталоги.
Мы только что написали модуль для выбора места, где можно поесть фастфуд.
Давайте добавим похожий модуль для выдачи жизненного совета. Итак, создадим
еще одну основную программу с названием Ŝ в текущем каталоге.
Теперь создадим подкаталог с именем и поместим туда два модуля — Ŝ
и Ŝ. Каждый модуль имеет функцию, которая возвращает строку.
Основная программа Ŝ будет содержать дополнительное утверждение
и еще одну строку (пример 11.7).
ǷȘȐȔȍȘTXHVWLRQVS\
ř
ſɑɐɑřŜ ſƀƀ
ſɑţɑř Ŝſƀƀ
Утверждение заставляет Python искать каталог с именем ,
начиная с вашего текущего каталога. Внутри каталога он ищет файлы
Ŝ и Ŝ.
Код первого модуля ŵŜ не изменился, просто файл переместился
в каталог (пример 11.8).
ǷȘȐȔȍȘFKRLFHVIDVWS\
ſƀś
ɑɑɑ ɑɑɑ
ſ ƀ
Второй модуль ŵ Ŝ новый, но работает практически так же, как
и его собрат, посвященный фастфуду (пример 11.9).
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ǷȘȐȔȍȘFKRLFHVDGYLFHS\
ʰƃɑŠɑřɑŠɑřɑɑřɑřţɑƄ
ſƀś
ɑɑɑ ɑɑɑ
ſƀ
ǭșȓȐ ȊȍȘșȐȧ ȊȈȠȍȋȖ 3\WKRQ ȕȐȎȍ ȟȍȔ ȗȖȕȈȌȖȉȐȚșȧ ȍȡȍ ȒȖȍȟȚȖ șȌȍȓȈȚȤ
ȊȗȖȌȒȈȚȈȓȖȋȍVRXUFHVȟȚȖȉȣȖȕșȚȈȓȗȈȒȍȚȖȔ3\WKRQ²șȖȏȌȈȚȤȜȈȑȓșȐȔȍȕȍȔ
BBLQLWBBS\ȅȚȖȔȖȎȍȚȉȣȚȤȌȈȎȍȗțșȚȖȑȜȈȑȓȕȖȌȓȧȉȖȓȍȍșȚȈȘȣȝȊȍȘșȐȑ3\WKRQ
ȍȋȖȗȘȐșțȚșȚȊȐȍȕȍȖȉȝȖȌȐȔȖȟȚȖȉȣșȖȌȍȘȎȈȡȐȑȍȋȖȒȈȚȈȓȖȋșȟȐȚȈȓșȧȗȈȒȍȚȖȔ
ȅȚȖȍȡȍȖȌȐȕȘȈșȗȘȖșȚȘȈȕȍȕȕȣȑȊȖȗȘȖșȕȈșȖȉȍșȍȌȖȊȈȕȐȧȝ
ǷțȚȤȗȖȐșȒȈȔȖȌțȓȧ
Я только что сказал, что Python просматривает ваш текущий каталог для поиска
подкаталога и его модулей. На самом деле он выполняет поиск не только
там, и вы можете сами выбирать места поиска нужных файлов. Ранее мы импорти-
ровали функцию ſƀ из модуля стандартной библиотеки . Его не было
в текущем каталоге, поэтому Python надо было искать и в другом месте.
Чтобы узнать, где интерпретатор Python ищет файлы, импортируйте стандарт-
ный модуль sys и используйте его список path, в котором содержатся имена ката-
логов и файлы ZIP-архивов.
Вы можете получить доступ к этому списку и изменить его. Вот так выглядит зна-
чение переменной Ŝ в Python 3.3 в моей версии операционной системы Mac:
ʴʴʴ
ʴʴʴ Ŝś
ŜŜŜſ ƀ
ŜŜŜ
ŵŵ ŵŜŵŵɪŜɪŵŵɪɪŜ
ŵŵ ŵŜŵŵɪŜɪŵŵɪŜɪ
ŵŵ ŵŜŵŵɪŜɪŵŵɪŜɪŵŞ
ŵŵ ŵŜŵŵɪŜɪŵŵɪŜɪŵŞ
ŵŵ ŵŜŵŵɪŜɪŵŵɪŜɪŵŞ
ǫȓȈȊȈǴȖȌțȓȐȗȈȒȍȚȣȐȗȘȖȋȘȈȔȔȣ
Эта начальная пустая строка вывода является пустой строкой ɐɐ, обозначающей
текущий каталог. Если строка ɐɐ находится первой в Ŝ, Python сначала вы-
полнит поиск в текущем каталоге, когда вы попробуете что-то импортировать:
fast выглядит как Ŝ. Python обычно действует именно так. Кроме того, если
создать подкаталог и поместить туда файлы с кодом, их можно импортиро-
вать командами и fast.
Использован будет первый найденный модуль. Это означает, что, если вы опре-
делите модуль с именем и он будет найден раньше оригинального модуля,
вы не получите доступ к элементу стандартной библиотеки.
Вы можете изменить путь, по которому производится поиск, внутри вашего кода.
Предположим, вы хотите, чтобы Python искал файлы в каталоге ŵŵ перед
тем, как обратиться к другим местам:
ʴʴʴ
ʴʴʴŜŜſɥřɑŵŵɑƀ
ǶȚȕȖșȐȚȍȓȤȕȣȑȐȈȉșȖȓȦȚȕȣȑȐȔȗȖȘȚ
К этому моменту в наших примерах мы импортировали собственные модули из:
текущего каталога;
подкаталога ;
стандартной библиотеки Python.
Этот подход хорошо работает до тех пор, пока у вас нет локального модуля
с тем же именем, что и у стандартного модуля. Какой именно из них вам нужен?
Python поддерживает абсолютный и относительный импорт. В рассмотренных
примерах вы видели абсолютный импорт. Если вы введете команду rougarou,
то для каждого указанного каталога Python будет искать файл с именем Ŝ
(модуль) или каталог с именем rougarou (пакет).
Если файл Ŝ находится в том же каталоге, что и вызывающая сторона,
вы можете импортировать его относительно текущей локации с помощью коман-
ды Ŝ rougarou.
Если он находится в каталоге более высокого уровня: ŜŜ rougarou.
Если находится в каталоге того же уровня с именем : ŜŜ
rougarou.
Нотации Ŝ и ŜŜ были позаимствованы из ОС семейства Unix — там эти сокраще-
ния используются для обозначения текущего и родительского каталогов.
Подробнее о проблемах импорта в Python вы можете прочитать в статье Traps
for the Unwary in Python’s Import System (KWWSS\WKRQQRWHVFXULRXVHIILFLHQF\RUJHQODWHVW
S\WKRQBFRQFHSWVLPSRUWBWUDSVKWPO).
ǷȈȒȍȚȣȗȘȖșȚȘȈȕșȚȊȐȔȍȕ
Вы уже знаете, что можно упаковать модули Python как:
единый модуль (файл с расширением Ŝ);
пакет (каталог, содержащий модули и, возможно, другие пакеты).
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
Теперь, если мы решим выделить локации north и south, файлы будут разме-
щаться вот так:
north
Ŝ
south
Ŝ
Если оба каталога, north и south, будут находиться в вашем пути поиска модуля,
вы сможете импортировать модули так же, как если бы они все еще находились
в пакете, состоящем из одного каталога:
ř
ǴȖȌțȓȐȗȘȖȚȐȊȖȉȢȍȒȚȖȊ
В каких случаях нужно размещать код в модуле, а в каких — в объекте?
У модуля и объекта много общего. Объект или модуль с именем thing, содержащий
переменную с именем stuff, позволяет вам получить доступ к этой переменной с по-
мощью конструкции Ŝ. Переменная stuff может быть определена при соз-
дании модуля или класса, или же ее значение может быть присвоено позже. Все классы,
функции и глобальные переменные модуля доступны и за его пределами.
Объекты могут использовать свойства и двойные нижние подчеркивания (ɏɏ …)
в именах для того, чтобы спрятать свои данные или управлять доступом к ним.
ǫȓȈȊȈǴȖȌțȓȐȗȈȒȍȚȣȐȗȘȖȋȘȈȔȔȣ
Неужели мы только что испортили вычисления для всех, кто пользуется этим
компьютером? Да! На самом деле нет, я шучу1. Это действие не повлияло на модуль
. Вы изменили только значение pi для копии модуля , которая импортиру-
ется вашей вызывающей программой, и все улики вашего преступления исчезнут
по ее завершении.
Для любого импортированного вами модуля создается только одна копия, даже
если вы импортируете его несколько раз. Этим можно пользоваться для сохране-
ния глобальных объектов, представляющих интерес для вашей программы: так же
как и с классом, который тоже имеет всего одну копию, хотя из него можно создать
много объектов.
ǬȖșȚȖȐȕșȚȊȈșȚȈȕȌȈȘȚȕȖȑȉȐȉȓȐȖȚȍȒȐ3\WKRQ
Одно из основных преимуществ Python заключается в том, что у него есть соб-
ственный «запас мощности» — большая стандартная библиотека модулей, которые
выполняют множество полезных задач и располагаются отдельно друг от друга
во избежание разрастания ядра языка. Нередко, когда вы собираетесь писать код,
сначала стоит проверить, нет ли уже стандартного модуля, который делает то, что
вы хотите. Python также предоставляет авторитетную документацию для модулей
наряду с руководством для пользователей (KWWSGRFVS\WKRQRUJOLEUDU\). Сайт Дага
Хеллмана Python Module of the Week (KWWSELWO\S\PRWZ) и его книга The Python
Standard Library by Example («Стандартная библиотека Python в примерах»), вы-
пущенная издательством Addison-Wesley Professional, также являются очень по-
лезными руководствами.
В следующих главах книги вы познакомитесь со множеством стандартных моду-
лей, предназначенных для работы с сетью, системами, базами данных и т. д. В этом
разделе я говорю о стандартных модулях, которые имеют более общие варианты
использования.
ǶȉȘȈȉȈȚȣȊȈȍȔȖȚșțȚșȚȊțȦȡȐȍȒȓȦȟȐ
șȗȖȔȖȡȤȦȜțȕȒȞȐȑVHWGHIDXOW ȐGHIDXOWGLFW
Вы уже знаете, что попытка получить доступ к словарю с помощью несуществу-
ющего ключа генерирует исключение. Избежать этого помогает функция словаря
ſƀ для возврата значения по умолчанию. Функция ſƀ похожа на
1
Или не шучу? Муа-ха-ха!
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
функцию ſƀ, но кроме того, она присваивает элемент словарю, если заданный
ключ отсутствует:
ʴʴʴ ɏʰƇɐ ɐśɨřɐ ɐśɩƈ
ʴʴʴſ ɏƀ
Ƈɐ ɐśɩřɐ ɐśɨƈ
ɐɐ
ʴʴʴƃɐɐƄ
ɐ ţɐ
ǷȖȌșȟȐȚȣȊȈȍȔȥȓȍȔȍȕȚȣșȗȖȔȖȡȤȦȜțȕȒȞȐȐ&RXQWHU
Если говорить о счетчиках, то в стандартной библиотеке имеется счетчик, который
справляется с задачей из предыдущего примера, и не только с ней:
ʴʴʴ
ʴʴʴʰƃɐɐřɐɐřɐɐřɐɐƄ
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
ʴʴʴɏ ʰſƀ
ʴʴʴɏ
ſƇɐɐśɪřɐɐśɨƈƀ
Элемент ɐɐ снова оказался общим для обоих счетчиков. В отличие от сло-
жения объединение не складывает счетчики, а выбирает тот, который имеет наи-
большее значение.
ǻȗȖȘȧȌȖȟȐȊȈȍȔȗȖȒȓȦȟțșȗȖȔȖȡȤȦ2UGHUHG'LFW
Перед вами пример, запущенный с помощью интерпретатора Python 2:
ʴʴʴʰƇ
ŜŜŜɐɐśɐřţɐř
ŜŜŜɐɐśɐŠɐř
ŜŜŜɐɐśɐŠɐř
ŜŜŜƈ
ʴʴʴś
ŜŜŜſƀ
ŜŜŜ
ǵȈȟȐȕȈȧșȊȍȘșȐȐ3\WKRQșȓȖȊȈȘȐșȖȝȘȈȕȧȦȚȖȟȍȘȍȌȕȖșȚȤȒȓȦȟȍȑȊȒȖȚȖȘȖȑ
ȖȕȐȉȣȓȐȌȖȉȈȊȓȍȕȣǪȘȈȕȕȐȝȊȍȘșȐȧȝȔȖȎȕȖȐșȗȖȓȤȏȖȊȈȚȤ2UGHUHG'LFWȗȖșȒȖȓȤȒț
ȗȖȘȧȌȖȒȒȓȦȟȍȑȊȖȉȣȟȕȣȝșȓȖȊȈȘȧȝȕȍȖȗȘȍȌȍȓȍȕǷȘȐȔȍȘȣȐȏȥȚȖȋȖȗȖȌȘȈȏȌȍȓȈ
ȈȒȚțȈȓȤȕȣȚȖȓȤȒȖȊȚȖȔșȓțȟȈȍȍșȓȐȊȍȘșȐȧȊȈȠȍȋȖ3\WKRQȕȐȎȍ
ǹȚȍȒȖȟȍȘȍȌȤ GHTXH
(произносится как «дэк») — это двусторонняя очередь, которая имеет функции
как стека, так и очереди. Она полезна, когда нужно добавить или удалить элементы
с любого конца последовательности. В следующем примере мы будем двигаться
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
с обоих концов слова к его середине, чтобы проверить, является ли оно палиндро-
мом. Функция ſƀ удаляет крайний слева элемент и возвращает его, функ-
ция ſƀ удаляет крайний справа элемент и возвращает его. Вместе они движутся
с концов слова к его середине. Эти действия продолжатся до тех пор, пока совпадают
крайние символы и пока не будет достигнута середина:
ʴʴʴſƀś
ŜŜŜ
ŜŜŜʰſƀ
ŜŜŜſƀʴɨś
ŜŜŜŜſƀŠʰŜſƀś
ŜŜŜ
ŜŜŜ
ŜŜŜ
ŜŜŜ
ʴʴʴſɐɐƀ
ʴʴʴſɐ ɐƀ
ʴʴʴſɐɐƀ
ʴʴʴſɐɐƀ
ʴʴʴſɐɐƀ
ǰȚȍȘȐȘțȍȔȗȖșȚȘțȒȚțȘȈȔȒȖȌȈ
șȗȖȔȖȡȤȦȔȖȌțȓȧLWHUWRROV
Модуль itertools (KWWSVGRFVS\WKRQRUJOLEUDU\LWHUWRROVKWPO ) содержит особые
функции итератора. Все они возвращают один элемент при каждом вызове из
цикла for… in и запоминают свое состояние между вызовами.
Функция ſƀ проходит по своим аргументам, как если бы они были единым
итерабельным объектом:
ʴʴʴ
ʴʴʴŜ ſƃɨřɩƄřƃɐɐřɐɐƄƀś
ǫȓȈȊȈǴȖȌțȓȐȗȈȒȍȚȣȐȗȘȖȋȘȈȔȔȣ
ŜŜŜſƀ
ŜŜŜ
ɨ
ɩ
a
b
…И т. д.
Функция ſƀ подсчитывает накопленные значения. По умолчанию она
высчитывает сумму:
ʴʴʴ
ʴʴʴŜ ſƃɨřɩřɪřɫƄƀś
ŜŜŜſƀ
ŜŜŜ
ɨ
ɪ
6
ɨɥ
DzȘȈșȐȊȖȊȣȊȖȌȐȔȌȈȕȕȣȍȕȈȥȒȘȈȕ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐSSULQW
Во всех наших примерах использовалась функция ſƀ (или просто имя пере-
менной в интерактивном интерпретаторе) для вывода информации на экран. Иногда
прочитать результаты бывает трудно. Нам нужен pretty printer (красивый прин-
тер), такой как ſƀ:
ʴʴʴ
ʴʴʴʰ ſƃ
ŜŜŜſɐɐřɐřţɐƀř
ŜŜŜſɐɐřɐŠɐƀř
ŜŜŜſɐɐřɐŠɐƀř
ŜŜŜƄƀ
ʴʴʴ
ǸȈȉȖȚȈȍȔșȖșȓțȟȈȑȕȣȔȐȟȐșȓȈȔȐ
В начале этой главы мы воспользовались функцией Ŝ ſƀ. Она возвраща-
ет значение из последовательности (списка, кортежа, словаря или строки), которая
была передана в качестве аргумента:
ʴʴʴ
ʴʴʴ ſƃɩɪřɰřɫɭřɐ ɐřɥɨɩɪ Ƅƀ
ɨɨɰɫɭɯɫ
ʴʴʴ ſſɐɐřɐɐřɐŞɐřɐɐƀƀ
ɐɐ
ʴʴʴ ſſɨɥɥƀƀ
ɭɯ
ʴʴʴ ſɐɐƀ
ɐɐ
Используем функцию ſƀ для того, чтобы получить больше одного значения
за один раз:
ʴʴʴ
ʴʴʴſƃɩɪřɰřɫɭřɐ ɐřɥɨɩɪ Ƅřɪƀ
ƃɨɨɰɫɭɯɫřɩɪřɰƄ
ʴʴʴſſɐɐřɐɐřɐŞɐřɐɐƀřɩƀ
ƃɐɐřɐŞɐƄ
ʴʴʴſſɨɥɥƀřɫƀ
ǫȓȈȊȈǴȖȌțȓȐȗȈȒȍȚȣȐȗȘȖȋȘȈȔȔȣ
ƃɬɫřɯɩřɨɥřɮɯƄ
ʴʴʴſɐɐřɮƀ
ƃɐɐřɐɐřɐɐřɐɐřɐɐřɐɐřɐɐƄ
Чтобы получить случайное целое число из любого диапазона, можно обратиться
к функциям ſƀ или ſƀ, передав в них возвращаемое значение функции
ſƀ. Можно воспользоваться также функциями ſƀ или ſƀ:
ʴʴʴ
ʴʴʴſɪɯřɮɫƀ
ɮɨ
ʴʴʴſɪɯřɮɫƀ
ɭɥ
ʴʴʴſɪɯřɮɫƀ
ɭɨ
Функция ſƀ, как и функция ſƀ, имеет аргументы для начального
значения (включительно), конечного (не включительно), а также для необязатель-
ного целочисленного параметра шага:
ʴʴʴ
ʴʴʴſɪɯřɮɫƀ
ɭɬ
ʴʴʴſɪɯřɮɫřɨɥƀ
ɭɯ
ʴʴʴſɪɯřɮɫřɨɥƀ
ɫɯ
Итак, получим случайное вещественное число (число с плавающей точкой)
между ɥŜɥ и ɨŜɥ:
ʴʴʴ
ʴʴʴſƀ
ɥŜɥɮɨɰɪɪɰɪɪɨɩɭɰɩɨɰɯ
ʴʴʴſƀ
ɥŜɮɫɥɪɩɫɪɭɮɪɯɩɭɩɮɨ
ʴʴʴſƀ
ɥŜɰɮɨɭɬɨɮɯɫɭɮɮɬɥɨɯ
ǵțȎȕȖȉȖȓȤȠȍȒȖȌȈ
Иногда стандартная библиотека не имеет того, что вам нужно, или делает что-то
не так, как вы хотите. В таком случае стоит вспомнить о том, что существует целый
мир стороннего программного обеспечения Python с открытым исходным кодом.
Отлично зарекомендовали себя следующие ресурсы:
PyPi (известный также как Cheese Shop («Магазин сыра») после старой пародии
Monty Python) (KWWSS\SLS\WKRQRUJ);
github (KWWSVJLWKXEFRP3\WKRQ);
readthedocs (KWWSVUHDGWKHGRFVRUJ).
Небольшие фрагменты кода вы можете найти по адресу KWWSFRGHDFWLYHVWDWHFRP
UHFLSHVODQJVS\WKRQ.
ǿȈșȚȤ, ǶșȕȖȊȣ3\WKRQ
Почти везде в этой книге код Python использует функции стандартных библиотек
Python. Но кое-где представлены и внешние пакеты: в главе 1 я упоминал requests,
а в главе 18 рассматривал его более подробно. В приложении Б показано, как уста-
навливать стороннее программное обеспечение Python, и дана другая подробная
информация.
ǿȐȚȈȑȚȍȌȈȓȍȍ
Следующая глава посвящена аспектам манипуляции данными в Python. Вы позна-
комитесь с типами bytes и bytearray, обработаете символы Unicode в строке, а также
научитесь выполнять поиск в строке с помощью регулярных выражений.
ǻȗȘȈȎȕȍȕȐȧ
11.1. Создайте файл с именем Ŝ. В нем объявите функцию ſƀ, которая
выводит на экран строку ɐ ɰŞɬ ɐ. Далее используйте интерактивный
интерпретатор, чтобы импортировать модуль и вызвать его функцию
ſƀ.
11.2. В интерактивном интерпретаторе импортируйте модуль под именем
и вызовите его функцию ſƀ.
11.3. Оставаясь в интерпретаторе, импортируйте непосредственно функцию ſƀ
из модуля и вызовите ее.
11.4. Импортируйте функцию ſƀ под именем info и вызовите ее.
11.5. Создайте словарь с именем plain, содержащий пары «ключ — значение» ɐɐś ɨ,
ɐɐś ɩ и ɐ ɐśɪ, а затем выведите его на экран.
11.6. Создайте с именем из пар «ключ — значение», приведенных
в упражнении 11.5, и выведите его на экран. Изменился ли порядок ключей?
11.7. Создайте с именем ɏɏ и передайте ему аргумент
list. Создайте список ɏɏƃɐɐƄ и присоедините к нему значение
ɐ for ɐ за одну операцию. Выведите на экран ɏɏƃɐɐƄ.
ǿǨǹǺȄ,,
3\WKRQȕȈȗȘȈȒȚȐȒȍ
ƋƓƈƊƈ
ǶȉȘȈȉȈȚȣȊȈȍȔȌȈȕȕȣȍ
До сих пор мы в основном говорили о самом языке Python — его типах данных,
структурах кода, синтаксисе и т. д. Остальная часть книги посвящена применению
Python для решения реальных задач.
В текущей главе вы познакомитесь со многими практическими приемами для
управления данными: в мире баз данных это иногда называют манипулированием
данными или ETL (extract/transform/load, то есть «извлечение/преобразование/
загрузка»). И хоть в книгах по программированию данная тема обычно не рассма-
тривается отдельно, программистам все равно приходится тратить много времени
на то, чтобы привести данные в нужную для своих целей форму.
За последние несколько лет специальность, связанная с «наукой о данных», стала
очень популярной. В статье Harvard Business Review профессия специалиста, работа-
ющего с данными, названа «самой сексуальной в XXI веке». Если речь о востребо-
ванности и достойной оплате, тогда ладно, но и рутины в этой профессии более чем
достаточно. Наука о данных выходит за пределы обычных требований ETL к базам
данных и зачастую включает в себя машинное обучение — для того чтобы можно было
находить идеи, недоступные человеческому взору. Я начну с рассмотрения простых
форматов данных, а затем перейду к самым полезным инструментам науки о данных.
Форматы данных делятся на две категории: текстовые и бинарные. Строки
в Python используются для текстовых данных, и как раз в этой главе содержится
информация о строках, которую мы пропустили ранее:
символы Unicode;
регулярные выражения.
Затем мы перейдем к бинарным данным и рассмотрим еще два типа, встроенных
в Python:
bytes для неизменяемых восьмибитных значений;
bytearrays для изменяемых.
ǫȓȈȊȈǶȉȘȈȉȈȚȣȊȈȍȔȌȈȕȕȣȍ
ǺȍȒșȚȖȊȣȍșȚȘȖȒȐ8QLFRGH
С основами строк в Python вы познакомились в главе 5. Пришло время более по-
дробно рассмотреть формат Unicode.
Строки в Python 3 представляют собой последовательности символов Unicode,
а не массивы байтов. Это, безусловно, самое значительное изменение в языке по
сравнению с Python 2.
Все текстовые примеры до сих пор имели формат ASCII (American Standard
Code for Information Interchange). Этот формат был определен в 1960-х годах, когда
компьютеры были размером с холодильник и считали лишь немногим лучше его.
Основной единицей хранения информации был байт, который мог хранить
256 уникальных значений в своих 8 битах. По разным причинам формат ASCII ис-
пользовал только 7 бит (128 уникальных значений): 26 символов верхнего регистра,
26 символов нижнего регистра, десять цифр, некоторые знаки препинания, символы
пробела и непечатаемые символы.
Однако в мире существует больше букв, чем предоставляет формат ASCII.
..
Вы могли заказать в кафе хот-дог, но не Gewurztraminer1. Предпринималось мно-
жество попыток вместить больше букв и символов в 8 доступных бит, и время от
времени вы будете сталкиваться с такими форматами. Вот некоторые из них:
Latin-1 или ISO 8859-1;
Windows code page 1252.
Каждый из этих форматов использует все 8 бит, но даже их бывает недостаточ-
но, особенно если нужно воспользоваться неевропейскими языками. Unicode — это
действующий международный стандарт, определяющий символы всех языков мира
плюс математические и другие символы. Еще и эмодзи!
Консорциум Unicode
..
1
Название вина в Германии пишется через u, но теряет эту букву в Эльзасе по пути во
Францию.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǹȚȘȖȒȐȜȖȘȔȈȚȈ8QLFRGHȊ3\WKRQ
Если вы знаете Unicode ID или название символа, то можете использовать его
в строке Python. Вот несколько примеров.
Символ Ɏ и расположенные за ним четыре шестнадцатеричных числа1 опреде-
ляют символ, находящийся в одной из 256 многоязычных плоскостей Unicode.
Два первых числа являются номером плоскости (от ɥɥ до ), а следующие два —
индексом символа внутри плоскости. Плоскость с номером ɥɥ — это старый до-
брый формат ASCII, и позиции символов в нем такие же, как и в ASCII.
Для символов более высоких плоскостей нужно больше битов. Управляющая
последовательность для них выглядит как Ɏ: за ней следуют восемь шестнадца-
теричных символов, крайний слева из которых должен быть равен ɥ.
Для всех символов конструкция ɎƇ ȜȠȳ ƈ позволяет указать символ с помощью
его стандартного имени. Имена перечислены по адресу KWWSZZZXQLFRGHRUJFKDUWV
FKDULQGH[KWPO.
1
Числа шестнадцатеричной системы счисления, содержащие символы от 0 до 9 и от A до F.
ǫȓȈȊȈǶȉȘȈȉȈȚȣȊȈȍȔȌȈȕȕȣȍ
ǰȔȍȕȈȗȍȘȍȟȐșȓȍȕȕȣȍȊșȗȐșȒȍ8QLFRGH&KDUDFWHU1DPH,QGH[ȉȣȓȐȗȍȘȍȜȖȘȔȈ
ȚȐȘȖȊȈȕȣȌȓȧțȌȖȉșȚȊȈȖȚȖȉȘȈȎȍȕȐȧǬȓȧȚȖȋȖȟȚȖȉȣȗȘȍȖȉȘȈȏȖȊȈȚȤȐȝȊȕȈșȚȖ
ȧȡȐȍȐȔȍȕȈșȐȔȊȖȓȖȊ8QLFRGH ȒȖȚȖȘȣȍȐșȗȖȓȤȏțȦȚșȧȊ3\WKRQ țȌȈȓȐȚȍȏȈȗȧȚțȦ
Ȑ ȗȍȘȍȔȍșȚȐȚȍ Țț ȟȈșȚȤ ȐȔȍȕȐ ȒȖȚȖȘȈȧ ȕȈȝȖȌȐȚșȧ ȗȖșȓȍ ȕȍȍ Ȋ șȈȔȖȍ ȕȈȟȈȓȖ
ǹȖȖȚȊȍȚșȚȊȍȕȕȖȊȕȈȠȍȔȗȘȐȔȍȘȍ(:,7+$&87(/$7,160$///(77(5ȕțȎȕȖȐȏ
ȔȍȕȐȚȤȕȈ/$7,160$///(77(5(:,7+$&87(
ʴʴʴ Ŝſɐ ɐƀ
ɐ²ɐ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǯȕȈȧȟȐșȓȖȊȖȑȐȌȍȕȚȐȜȐȒȈȚȖȘșȐȔȊȖȓȈȊ8QLFRGHȔȖȎȕȖȐșȗȖȓȤȏȖȊȈȚȤșȚȈȕȌȈȘȚȕȣȍ
ȜțȕȒȞȐȐRUG ȐFKU ȌȓȧȚȖȋȖȟȚȖȉȣȉȣșȚȘȖȊȣȗȖȓȕȧȚȤȗȘȍȖȉȘȈȏȖȊȈȕȐȧȔȍȎȌț
ȞȍȓȖȟȐșȓȍȕȕȣȔȐȐȌȍȕȚȐȜȐȒȈȚȖȘȈȔȐȐȖȌȕȖșȐȔȊȖȓȤȕȣȔȐșȚȘȖȒȈȔȐ8QLFRGH
ʴʴʴ ſɩɪɪƀ
ɐ²ɐ
ʴʴʴ ſɥɰƀ
ɐ²ɐ
ʴʴʴ ſɥɨ ɭƀ
ɐ ɐ
DzȖȌȐȘȖȊȈȕȐȍȐȌȍȒȖȌȐȘȖȊȈȕȐȍ
șȗȖȔȖȡȤȦȒȖȌȐȘȖȊȒȐ87)
Вам не нужно волноваться о том, как Python хранит каждый символ Unicode, когда
вы выполняете обычную обработку строки.
Но когда вы обмениваетесь данными с внешним миром, вам может понадобиться
следующее:
способ закодировать строку в байты;
способ декодировать байты обратно в строку.
ǫȓȈȊȈǶȉȘȈȉȈȚȣȊȈȍȔȌȈȕȕȣȍ
ǭșȓȐȊȣșȖȏȌȈȍȚȍșȚȘȖȒț3\WKRQȗțȚȍȔȒȖȗȐȘȖȊȈȕȐȧȐȊșȚȈȊȒȐȐȏȌȘțȋȖȋȖȐșȚȖȟ
ȕȐȒȈȕȈȗȘȐȔȍȘȚȈȒȖȋȖȒȈȒȊȍȉșȚȘȈȕȐȞȈțȉȍȌȐȚȍșȤȟȚȖȐșȚȖȟȕȐȒȉȣȓȏȈȒȖȌȐ
ȘȖȊȈȕșȗȖȔȖȡȤȦ87)ǵȍȘȍȌȒȖȔȖȎȍȚȖȒȈȏȈȚȤșȧȟȚȖȚȍȒșȚȉȣȓȏȈȠȐȜȘȖȊȈȕ
șȗȖȔȖȡȤȦȒȖȌȐȘȖȊȖȒ/DWLQȐȓȐ:LQGRZVȈȥȚȖȗȘȐȒȖȗȐȘȖȊȈȕȐȐȊșȚȘȖȒț
3\WKRQȊȣȏȣȊȈȍȚȋȍȕȍȘȈȞȐȦȐșȒȓȦȟȍȕȐȑȐȏȏȈȕȍȒȖȘȘȍȒȚȕȖȑȗȖșȓȍȌȖȊȈȚȍȓȤȕȖșȚȐ
ȉȈȑȚȖȊ
DzȖȌȐȘȖȊȈȕȐȍ
Вы кодируете строку байтами. Первый аргумент строковой функции ſƀ — это
имя кодировки. Возможные варианты представлены в табл. 12.1.
ǺȈȉȓȐȞȈDzȖȌȐȘȖȊȒȐ
ǰȔȧȒȖȌȐȘȖȊȒȐ ǶȗȐșȈȕȐȍ
'ascii' Старая добрая семибитная кодировка ASCII
'utf-8' Восьмибитная кодировка переменной длины, самый предпочтительный
вариант в большинстве случаев
'latin-1' Также известна как ISO 8859-1
'cp-1252' Стандартная кодировка Windows
'unicode-escape' Буквенный формат Python Unicode, выглядит как \uxxxx или \Uxxxxxxxx
Как я упоминал ранее, кодировка UTF-8 имеет переменную длину. В данном случае
было использовано три байта для того, чтобы закодировать один символ :
ʴʴʴſƀ
ɪ
ʴʴʴ
ɐɎɩɎɰɯɎɯɪɐ
Вы можете использовать этот вариант, если вам нужна печатная версия escape-
последовательности Unicode.
ǫȓȈȊȈǶȉȘȈȉȈȚȣȊȈȍȔȌȈȕȕȣȍ
ǬȍȒȖȌȐȘȖȊȈȕȐȍ
Мы декодируем байтовые строки в текстовые строки Unicode. Когда мы получаем текст
из какого-то внешнего источника (файлов, баз данных, сайтов, сетевых API и т. д.),
он закодирован в виде байтовой строки. Самое сложное — узнать, какая кодировка
была использована, чтобы можно было декодировать и получить строку Unicode.
Проблема в следующем: ничто в байтовой строке не говорит нам о том, какая
кодировка была использована. Я уже упоминал опасность копирования/вставки
с сайтов. Вероятно, и вы встречали сайты со странными символами в тех местах, где
должны быть обычные символы ASCII.
Создадим строку Unicode, которая называется и имеет значение ɐ ²ɐ:
ʴʴʴ ʰɐ Ɏɥɥɰɐ
ʴʴʴ
ɐ ²ɐ
ʴʴʴſ ƀ
ʳ ɐɐʴ
Обратите внимание на то, что переменная ɏ содержит 5 байт. Первые
три такие же, как в ASCII (преимущество UTF-8), а последние два кодируют символ
ɐ²ɐ. Теперь декодируем эту байтовую строку обратно в строку Unicode:
ʴʴʴ ɩʰ ɏŜ ſɐŞɯɐƀ
ʴʴʴ ɩ
ɐ ²ɐ
Ох.
Мораль этой истории: по возможности используйте кодировку UTF-8. Она рабо-
тает и поддерживается везде, она способна выразить любой символ Unicode, и с ее
помощью можно быстро кодировать и декодировать.
ǺȖ ȟȚȖ Ȋȣ ȔȖȎȍȚȍ țȒȈȏȈȚȤ ȓȦȉȖȑ șȐȔȊȖȓ 8QLFRGH ȕȍ ȏȕȈȟȐȚ ȟȚȖ ȒȖȔȗȤȦȚȍȘ
șȔȖȎȍȚȐȝȊșȍ ȖȚȖȉȘȈȏȐȚȤȅȚȖȏȈȊȐșȐȚ ȖȚȠȘȐȜȚȈȒȖȚȖȘȣȑȊȣȐșȗȖȓȤȏțȍȚȍ ²
ȊȗȖȓȕȍȊȍȘȖȧȚȕȖȊȘȍȏțȓȤȚȈȚȍȊȣțȊȐȌȐȚȍȐȏȖȉȘȈȎȍȕȐȍȏȈȗȖȓȕȐȚȍȓȤȐȓȐȊȖȊșȍ
ȕȐȟȍȋȖDzȖȔȗȈȕȐȧ$SSOHșȖȏȌȈȓȈȠȘȐȜȚ/DVW5HVRUW)RQW KWWSVZZZXQLFRGHRUJ
SROLFLHVODVWUHVRUWIRQWBHXODKWPO Ȍȓȧ8QLFRGH&RQVRUWLXPȐȐșȗȖȓȤȏțȍȚȍȋȖȊșȊȖȐȝ
ȖȗȍȘȈȞȐȖȕȕȣȝ șȐșȚȍȔȈȝ ǵȈ șȚȘȈȕȐȞȍ KWWSVHQZLNLSHGLDRUJZLNL)DOOEDFNBIRQW
Ȋ©ǪȐȒȐȗȍȌȐȐªȔȖȎȕȖȕȈȑȚȐȉȖȓȍȍȗȖȌȘȖȉȕțȦȐȕȜȖȘȔȈȞȐȦǹțȡȍșȚȊțȍȚȚȈȒȎȍ
ȠȘȐȜȚ 8QLIRQW KWWSXQLIRXQGU\FRPXQLIRQWLQGH[KWPO șȖȌȍȘȎȈȡȐȑ șȐȔȊȖȓȣ
ȊȌȐȈȗȈȏȖȕȍȖȚ?XȌȖ?XIIIIȈȚȈȒȎȍȕȍȒȖȚȖȘȣȍȌȘțȋȐȍ
ǹțȡȕȖșȚȐ+70/
В Python 3.4 появился еще один способ выполнять преобразования в Unicode и об-
ратно — с помощью символов-мнемоников HTML1. Этот подход может быть проще,
чем поиск имен Unicode, особенно если вы работаете в Интернете:
ʴʴʴ
ʴʴʴŜ ſɑĺŚɑƀ
ɐ±ɐ
1
По адресу [Link]
вы можете найти таблицу символов-мнемоников в HTML5.
ǫȓȈȊȈǶȉȘȈȉȈȚȣȊȈȍȔȌȈȕȕȣȍ
Выражение Ŝ ſɐ ɐř ɐ ɐƀ вернуло символы
ASCII, приведенные к типу bytes (поскольку они были закодированы). Следующее
выражение ɏŜ ſƀ необходимо для того, чтобы преобразовать пере-
менную ɏ в строку, совместимую с HTML.
ǵȖȘȔȈȓȐȏȈȞȐȧ
Некоторые символы Unicode могут быть представлены более чем одним кодом
Unicode. Они выглядят одинаково, но их сравнение даст отрицательный результат, по-
скольку они содержат разные последовательности байтов. Например, возьмем символ
с акутом ɐ²ɐ в слове ɐ ²ɐ. Создадим односимвольную ɐ²ɐ несколькими способами:
ʴʴʴ ɨʰɐ²ɐɤ ŞɯřȥȞȢȣȜȤȢȖȔȡ
ʴʴʴ ɩʰɐɎɥɥɰɐɤȞȢȘ
ʴʴʴ ɪʰɎɤȜȠȳ
ŜŜŜɐɎƇ ƈɐ
ʴʴʴ ɫʰ ſɩɪɪƀɤȘșȥȳȦȜȫȡȢșȕȔȝȦȢȖȢșțȡȔȫșȡȜș
ʴʴʴ ɬʰ ſɥɰƀɤȬșȥȦȡȔȘȪȔȦșȤȜȫȡȢșȕȔȝȦȢȖȢșțȡȔȫșȡȜș
ʴʴʴ ɨř ɩř ɪř ɫř ɬ
ſɐ²ɐřɐ²ɐřɐ²ɐřɐ²ɐřɐ²ɐƀ
ʴʴʴ ɨʰʰ ɩʰʰ ɪʰʰ ɫʰʰ ɬ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
Мы создали символ Unicode из двух других, и он выглядит так же, как и ориги-
нальный символ ɐ²ɐ. Но, как говорят на «Улице Сезам», один из них не похож на
другой:
ʴʴʴ ɨʰʰ ɏ ɨ
Если у вас две разные строки Unicode, полученные из разных источников — одна
использует ɨ, а вторая ɏ ɨ, — выглядеть они будут одинаково,
но поведут себя по-разному.
Исправить это можно с помощью функции ſƀ, которая содержится
в модуле :
ʴʴʴ
ʴʴʴ ɏʰ Ŝſɐ ɐř ɏ ɨƀ
ʴʴʴſ ɏƀ
ɨ
ʴʴʴ ɏʰʰ ɨ
ʴʴʴ Ŝſ ɏƀ
ɐ ɐ
ǷȖȌȘȖȉȕȈȧȐȕȜȖȘȔȈȞȐȧ
Если хотите узнать больше, эти ссылки будут вам полезны:
Unicode HOWTO (KWWSELWO\XQLFRGHKRZWR);
Pragmatic Unicode (KWWSELWO\SUDJPDWLFXQL);
ǫȓȈȊȈǶȉȘȈȉȈȚȣȊȈȍȔȌȈȕȕȣȍ
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know
About Unicode and Character Sets (No Excuses!) (KWWSELWO\MVSROVN\).
ǺȍȒșȚȖȊȣȍșȚȘȖȒȐȘȍȋțȓȧȘȕȣȍȊȣȘȈȎȍȕȐȧ
В главе 5 мы затронули операции со строками. Вооружившись этой вводной инфор-
мацией, вы, вероятно, использовали простые «подстановочные» шаблоны в команд-
ной строке, такие как команда UNIX ls ƋŜ, что означает перечисление всех имен
файлов, заканчивающихся на Ŝ.
Пришло время рассмотреть более сложный механизм проверки на совпадение
с шаблоном — регулярные выражения. Этот механизм поставляется в стандартном
модуле re, который мы импортируем. Вы определяете строковый шаблон, совпадения
для которого вам нужно найти, и строку-источник, в которой следует выполнить
поиск. Простой пример использования выглядит так:
ʴʴʴ
ʴʴʴʰŜ ſɐɐřɐ ɐƀ
ǷȖșȒȖȓȤȒțȊ3\WKRQșȥȚȐȔȟȈșȚȖȗȘȐȝȖȌȐȚșȧȐȔȍȚȤȌȍȓȖȕȈȗȖȔȕȦȍȡȍȘȈȏȜțȕȒȞȐȧ
PDWFK ȐȡȍȚșȚȘȖȒțȠȈȉȓȖȕȚȖȓȤȒȖȊȕȈȟȈȓȍșȚȘȖȒȐȐșȚȖȟȕȐȒȈȈȜțȕȒȞȐȧVHDUFK
ȐȡȍȚȠȈȉȓȖȕȊȓȦȉȖȔȔȍșȚȍȐșȚȖȟȕȐȒȈ
ſƀ принимает аргумент для замены и заменяет все части источника, совпавшие
с шаблоном, на значение этого аргумента.
ǪȉȖȓȤȠȍȑȟȈșȚȐȗȘȐȔȍȘȖȊȘȍȋțȓȧȘȕȣȝȊȣȘȈȎȍȕȐȑȗȖȒȈȏȈȕȕȣȝȏȌȍșȤȐșȗȖȓȤȏțȍȚșȧ
ȒȖȌȐȘȖȊȒȈ$6&,,ȕȖșȚȘȖȒȖȊȣȍȜțȕȒȞȐȐ3\WKRQȊȒȓȦȟȈȧȜțȕȒȞȐȐȌȓȧȘȈȉȖȚȣșȘȍ
ȋțȓȧȘȕȣȔȐȊȣȘȈȎȍȕȐȧȔȐȘȈȉȖȚȈȦȚșȓȦȉȖȑșȚȘȖȒȖȑ3\WKRQȐȓȦȉȣȔȐșȐȔȊȖȓȈȔȐ
ȐȏȒȖȌȐȘȖȊȒȐ8QLFRGH
ǰȡȍȔȚȖȟȕȖȍȕȈȟȈȓȤȕȖȍșȖȊȗȈȌȍȕȐȍ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐPDWFK
Начинается ли строка ɐ ɐ со слова ɐɐ? Рассмотрим пример
кода с комментариями:
ʴʴʴ
ʴʴʴ ʰɐ ɐ
ʴʴʴʰŜ ſɐɐř ƀɤȨȧȡȞȪȜȳȡȔȫȜȡȔșȦȤȔȕȢȦȔȦȰȥȡȔȫȔȟȔȜȥȦȢȫȡȜȞȔ
ʴʴʴśɤȨȧȡȞȪȜȳȖȢțȖȤȔȭȔșȦȢȕȮșȞȦŚȘșȟȔȝȦșȱȦȢřȫȦȢȕȯȧȖȜȘșȦȰřȫȦȢȥȢȖȣȔȟȢ
ŜŜŜſŜſƀƀ
ŜŜŜ
ʴʴʴʰŜ ſɐɋɐř ƀɤȳȞȢȤȰȖȡȔȫȔȟșȥȦȤȢȞȜȘșȟȔșȦȦȢȚșȥȔȠȢș
ʴʴʴś
ŜŜŜſŜſƀƀ
ŜŜŜ
В этот раз функция ſƀ не вернула ничего, и оператор if не запустил опе-
ратор print.
Как я упоминал в разделе «Новое: I am the Walrus» на с. 89, в Python 3.8 этот
пример можно сократить с помощью так называемого оператора-«моржа»:
ʴʴʴ
ʴʴʴ ʰɐ ɐ
ʴʴʴśʰŜ ſɐ ɐř ƀś
ŜŜŜſŜſƀƀ
ŜŜŜ
Теперь используем функцию ſƀ для того, чтобы найти шаблон в лю-
бом месте источника:
ʴʴʴ
ʴʴʴ ʰɐ
ǫȓȈȊȈǶȉȘȈȉȈȚȣȊȈȍȔȌȈȕȕȣȍ
ǰȡȍȔȗȍȘȊȖȍșȖȊȗȈȌȍȕȐȍșȗȖȔȖȡȤȦȜțȕȒȞȐȐVHDUFK
Вы можете использовать функцию ſƀ, чтобы найти шаблон ɐ ɐ в любом
месте строки-источника ɐ ɐ, не прибегая к использованию символа
подстановки ŜƋ:
ʴʴʴ
ʴʴʴ ʰɐ ɐ
ʴʴʴʰŜ ſɐ ɐř ƀ
ʴʴʴśɤȨȧȡȞȪȜȳ ȖȢțȖȤȔȭȔșȦȢȕȮșȞȦ
ŜŜŜſŜſƀƀ
ŜŜŜ
ǰȡȍȔȊșȍșȖȊȗȈȌȍȕȐȧȐșȗȖȓȤȏțȧȜțȕȒȞȐȦILQGDOO
В предыдущих примерах мы искали только одно совпадение. Но что, если нуж-
но узнать, сколько раз строка, содержащая один символ n, встречается в строке-
источнике?
ʴʴʴ
ʴʴʴ ʰɐ ɐ
ʴʴʴʰŜſɐɐř ƀ
ʴʴʴɤ
ƃɐɐřɐɐřɐɐřɐɐƄ
ʴʴʴſɐ ɐřſƀřɐ ɐƀ
ɫ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǸȈȏȉȐȊȈȍȔșȖȊȗȈȌȍȕȐȧșȗȖȔȖȡȤȦȜțȕȒȞȐȐVSOLW
В следующем примере показано, как разбить строку на список с помощью шаблона,
а не простой строки:
ʴʴʴ
ʴʴʴ ʰɐ ɐ
ʴʴʴʰŜſɐɐř ƀ
ʴʴʴɤȨȧȡȞȪȜȳȖȢțȖȤȔȭȔșȦȥȣȜȥȢȞ
ƃɐɐřɐ ɐřɐɐřɐɐřɐɐƄ
ǯȈȔȍȕȧȍȔșȖȊȗȈȌȍȕȐȧșȗȖȔȖȡȤȦȜțȕȒȞȐȐVXE
Этот метод похож на метод ſƀ, но предназначен не для простых строк, а для
шаблонов:
ʴʴʴ
ʴʴʴ ʰɐ ɐ
ʴʴʴʰŜſɐɐřɐţɐř ƀ
ʴʴʴɤ
ɐţ ţţţɐ
ȀȈȉȓȖȕȣșȗȍȞȐȈȓȤȕȣȍșȐȔȊȖȓȣ
Многие описания регулярных выражений начинаются с подробной информации
о том, как их определить. Я считаю это неправильным. Регулярных выражений
не так уж и мало, поэтому в памяти приходится удерживать слишком большое ко-
личество деталей. К тому же регулярные выражения используют так много знаков
препинания, что выглядят как ругающиеся персонажи мультфильмов.
Теперь, когда вы знаете о нужных функциях ( ſƀ , ſƀ , ſƀ
и ſƀ), рассмотрим детали построения регулярных выражений. Создаваемые вами
шаблоны подойдут к любой из этих функций.
ǫȓȈȊȈǶȉȘȈȉȈȚȣȊȈȍȔȌȈȕȕȣȍ
ȀȈȉȓȖȕ ǹȖȊȗȈȌȍȕȐȧ
\d Цифровой символ
\D Нецифровой символ
\w Буквенный или цифровой символ или знак подчеркивания
\W Любой символ, кроме буквенного или цифрового символа или знака подчеркивания
\s Пробельный символ
\S Непробельный символ
\b Граница слова
\B Не граница слова
ȀȈȉȓȖȕȣȐșȗȖȓȤȏȖȊȈȕȐȍșȗȍȞȐȜȐȒȈȚȖȘȖȊ
Теперь сделаем «пунктуационную пиццу», используя основные спецификаторы
шаблонов для регулярных выражений, показанные в табл. 12.3.
В этой таблице expr и другие слова, выделенные курсивом, означают любое кор-
ректное регулярное выражение.
ǺȈȉȓȐȞȈǹȗȍȞȐȜȐȒȈȚȖȘȣȠȈȉȓȖȕȖȊ
ȀȈȉȓȖȕ ǹȖȊȗȈȌȍȕȐȧ
abc Буквосочетание abc
(expr) expr
expr1 | expr2 expr1 или expr2
. Любой символ, кроме \n
^ Начало строки источника
$ Конец строки источника
prev ? Ноль или одно включение prev
prev * Ноль или больше включений prev, максимальное количество
prev *? Ноль или больше включений prev, минимальное количество
ǫȓȈȊȈǶȉȘȈȉȈȚȣȊȈȍȔȌȈȕȕȣȍ
ȀȈȉȓȖȕ ǹȖȊȗȈȌȍȕȐȧ
prev + Одно или больше включений prev, максимальное количество
prev +? Одно или больше включений prev, минимальное количество
prev { m } m последовательных включений prev
prev { m, n } От m до n последовательных включений prev, максимальное количество
prev { m, n }? От m до n последовательных включений prev, минимальное количество
[abc] a, или b, или c (аналогично a|b|c)
[^ abc] Не (a, или b, или c)
prev (?= next) prev, если за ним следует next
prev (? ! next) prev, если за ним не следует next
(?<= prev) next next, если перед ним находится prev
(?<! prev) next next, если перед ним не находится prev
У вас могло зарябить в глазах при попытке прочесть эти примеры. Для начала
определим строку-источник:
ʴʴʴ ʰɐɐɐ ř
ŜŜŜ Ŝɐɐɐ
ǪșȓȍȌțȦȡȐȝȗȘȐȔȍȘȈȝȊȒȈȟȍșȚȊȍȠȈȉȓȖȕȖȊȧȐșȗȖȓȤȏțȦȗȘȖșȚȣȍșȚȘȖȒȐȊȒȈȊȣȟ
ȒȈȝǬȈȓȍȍȊȥȚȖȔȗȖȌȘȈȏȌȍȓȍȧȗȖȒȈȎțȒȈȒȕȍȖȉȘȈȉȖȚȈȕȕȈȧșȚȘȖȒȈȠȈȉȓȖȕ ȖȕȈ
ȕȈȟȐȕȈȍȚșȧșșȐȔȊȖȓȈUȗȍȘȍȌȗȍȘȊȖȑȒȈȊȣȟȒȖȑ ȗȖȏȊȖȓȧȍȚȐȏȉȍȎȈȚȤȕȍȒȖȚȖȘȣȝ
ȒȖȕȜȓȐȒȚȖȊȔȍȎȌțȖȉȣȟȕȣȔȐHVFDSHȗȖșȓȍȌȖȊȈȚȍȓȤȕȖșȚȧȔȐȊ3\WKRQȐȘȍȋțȓȧȘ
ȕȣȔȐ ȊȣȘȈȎȍȕȐȧȔȐ ǰȏ șȖȖȉȘȈȎȍȕȐȑ ȉȍȏȖȗȈșȕȖșȚȐ ȗȍȘȊȣȔ ȈȘȋțȔȍȕȚȖȔ ȊȖ Ȋșȍȝ
șȓȍȌțȦȡȐȝȗȘȐȔȍȘȈȝȌȖȓȎȕȈȉȣȚȤȕȍȖȉȘȈȉȖȚȈȕȕȈȧșȚȘȖȒȈ
Найдем сочетание ght, за которым следует любой символ, кроме буквенного или
цифрового символа или знака подчеркивания:
ʴʴʴŜſɐɎɐř ƀ
ƃɐɎɐřɐŜɐƄ
ȀȈȉȓȖȕȣțȒȈȏȣȊȈȍȔșȗȖșȖȉȊȣȊȖȌȈșȖȊȗȈȌȍȕȐȧ
При использовании функций ſƀ или ſƀ все совпадения можно получить
из объекта результата , вызвав функцию Ŝſƀ. Если вы заключите шаблон
в круглые скобки, совпадения будут сохранены в отдельную группу, а кортеж, со-
стоящий из них, окажется доступен благодаря вызову Ŝſƀ. Так, как показано
здесь:
ʴʴʴʰŜ ſɐſŜɎƀŜƋſɎƀɐř ƀ
ʴʴʴŜſƀ
ɐɐ
ʴʴʴŜſƀ
ſɐɐřɐɐƀ
Если вы используете этот шаблон ſţʳ ȜȠȳ ʴ ȖȯȤ ƀ, он совпадет с выражением ȖȯȤ
и сохранит совпадение в группе ȜȠȳ:
ʴʴʴʰŜ ſɐſţʳ ʴŜɎƀŜƋſţʳ ʴɎƀɐř ƀ
ʴʴʴŜſƀ
ɐɐ
ʴʴʴŜſƀ
ſɐɐřɐɐƀ
ʴʴʴŜſɐ ɐƀ
ɐɐ
ʴʴʴŜſɐ ɐƀ
ɐɐ
ǩȐȕȈȘȕȣȍȌȈȕȕȣȍ
Работать с текстовыми данными может быть трудно, но работать с бинарными мо-
жет быть… интересно. Вам нужно знать о таких концепциях, как порядок следования
байтов (как процессор вашего компьютера разбивает данные на байты) и знаковые
биты для целых чисел. Вам может понадобиться закопаться в бинарные форматы
файлов или сетевых пакетов, чтобы извлечь или даже изменить данные. В этом раз-
деле я покажу вам основы работы с бинарными данными в Python.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
E\WHVȐE\WHDUUD\
В Python 3 появились последовательности восьмибитных целых чисел с возможны-
ми значениями от 0 до 255. Они могут быть двух типов:
bytes неизменяем, как кортеж байтов;
bytearray изменяем, как список байтов.
Начнем мы с создания списка с именем blist. В этом примере создадим переменную
типа bytes с именем ɏ и переменную типа bytearray с именем ɏɏ:
ʴʴʰƃɨřɩřɪřɩɬɬƄ
ʴʴʴɏʰſƀ
ʴʴʴɏ
ɐɎɥɨɎɥɩɎɥɪɎɐ
ʴʴʴɏɏʰſƀ
ʴʴʴɏɏ
ſɐɎɥɨɎɥɩɎɥɪɎɐƀ
ǷȘȍȌșȚȈȊȓȍȕȐȍȏȕȈȟȍȕȐȧȚȐȗȈE\WHVȕȈȟȐȕȈȍȚșȧșșȐȔȊȖȓȈEȐȒȈȊȣȟȒȐȏȈȒȖ
ȚȖȘȣȔȐșȓȍȌțȦȚȠȍșȚȕȈȌȞȈȚȍȘȐȟȕȣȍȗȖșȓȍȌȖȊȈȚȍȓȤȕȖșȚȐȐȏșȐȔȊȖȓȖȊ?[ȐȓȐ
$6&,,ȐȏȈȒȈȕȟȐȊȈȍȚșȧȒȖȕșȚȘțȒȞȐȧșȖȖȚȊȍȚșȚȊțȦȡȐȔșȐȔȊȖȓȖȔȒȈȊȣȟȒȐ3\WKRQ
ȗȘȍȖȉȘȈȏțȍȚ ȠȍșȚȕȈȌȞȈȚȍȘȐȟȕȣȍ ȗȖșȓȍȌȖȊȈȚȍȓȤȕȖșȚȐ ȐȓȐ șȐȔȊȖȓȣ $6&,, Ȋ ȕȍ
ȉȖȓȤȠȐȍȞȍȓȣȍȟȐșȓȈȕȖȗȖȒȈȏȣȊȈȍȚȉȈȑȚȖȊȣȍȏȕȈȟȍȕȐȧȒȖȘȘȍȒȚȕȖȏȈȗȐșȈȕȕȣȍ
șȚȖȟȒȐȏȘȍȕȐȧȒȖȌȐȘȖȊȒȐ$6&,,
ʴʴʴɐɎɭɨɐ
ɐɐ
ʴʴʴɐɎɥɨ Ɏɐ
ɐɎɥɨ Ɏɐ
При выводе на экран содержимого переменных типа bytes или типа bytearray
Python использует формат Ɏ для непечатаемых байтов и их эквиваленты ASCII для
печатаемых (и заменяет некоторые распространенные escape-последовательности,
например Ɏ на Ɏɥ). Так выглядит на экране представление значения переменной
ɏ (переформатированное вручную для того, чтобы показать по 16 байт на
строку):
ʴʴʴɏ
ɐɎɥɥɎɥɨɎɥɩɎɥɪɎɥɫɎɥɬɎɥɭɎɥɮɎɥɯɎɎɎɥɎɥ ɎɎɥɎɥ
ɎɨɥɎɨɨɎɨɩɎɨɪɎɨɫɎɨɬɎɨɭɎɨɮɎɨɯɎɨɰɎɨɎɨɎɨ ɎɨɎɨɎɨ
ŠɑɤɛʩĺɎɐſƀƋʫřŞŜŵ
ɥɨɩɪɫɬɭɮɯɰśŚʳʰʴţ
ɒ
ƃɎɎƄɋɏ
ļ
ƇŶƈɌɎɮ
ɎɯɥɎɯɨɎɯɩɎɯɪɎɯɫɎɯɬɎɯɭɎɯɮɎɯɯɎɯɰɎɯɎɯɎɯ ɎɯɎɯɎɯ
ɎɰɥɎɰɨɎɰɩɎɰɪɎɰɫɎɰɬɎɰɭɎɰɮɎɰɯɎɰɰɎɰɎɰɎɰ ɎɰɎɰɎɰ
ɎɥɎɨɎɩɎɪɎɫɎɬɎɭɎɮɎɯɎɰɎɎɎ ɎɎɎ
ɎɥɎɨɎɩɎɪɎɫɎɬɎɭɎɮɎɯɎɰɎɎɎ ɎɎɎ
Ɏ ɥɎ ɨɎ ɩɎ ɪɎ ɫɎ ɬɎ ɭɎ ɮɎ ɯɎ ɰɎ Ɏ Ɏ Ɏ Ɏ Ɏ
ɎɥɎɨɎɩɎɪɎɫɎɬɎɭɎɮɎɯɎɰɎɎɎ ɎɎɎ
ɎɥɎɨɎɩɎɪɎɫɎɬɎɭɎɮɎɯɎɰɎɎɎ ɎɎɎ
ɎɥɎɨɎɩɎɪɎɫɎɬɎɭɎɮɎɯɎɰɎɎɎ ɎɎɎɐ
ǷȘȍȖȉȘȈȏțȍȔȉȐȕȈȘȕȣȍȌȈȕȕȣȍ
șȗȖȔȖȡȤȦȔȖȌțȓȧVWUXFW
Как вы уже могли убедиться, Python имеет множество инструментов для манипули-
рования текстом. Инструментов для работы с бинарными данными гораздо меньше.
Стандартная библиотека содержит модуль , который обрабатывает данные,
аналогичные структурам в С или С++. С помощью этого модуля можно преобра-
зовать бинарные данные в структуры данных Python и наоборот.
Посмотрим, как он работает с данными из файла с расширением PNG (рас-
пространенным форматом изображений, использующимся наряду с GIF и JPEG).
Напишем небольшую программу, которая извлекает ширину и высоту изображения
из фрагмента данных PNG.
Мы будем использовать логотип издательства O’Reilly — изображение малень-
кого долгопята с глазками-бусинами (рис. 12.1).
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǹȗȍȞȐȜȐȒȈȚȖȘ ǷȖȘȧȌȖȒȉȈȑȚȖȊ
< Обратный порядок (Little endian)
> Прямой порядок (Big endian)
ǺȈȉȓȐȞȈǹȗȍȞȐȜȐȒȈȚȖȘȣȜȖȘȔȈȚȈ
Продолжение ®
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǺȈȉȓȐȞȈ ȗȘȖȌȖȓȎȍȕȐȍ
ǬȘțȋȐȍȐȕșȚȘțȔȍȕȚȣȌȓȧȘȈȉȖȚȣ
șȉȐȕȈȘȕȣȔȐȌȈȕȕȣȔȐ
Некоторые сторонние пакеты с открытым исходным кодом часто предлагают следу-
ющие более декларативные способы определения и извлечения бинарных данных:
bitstring (KWWSELWO\S\ELWVWULQJ);
construct (KWWSELWO\S\FRQVWUXFW);
hachoir (KWWSVS\SLRUJSURMHFWKDFKRLU);
binio (KWWSVSLNDQHWS\ELQLR);
Kaitai Struct (KWWSNDLWDLLR).
В приложении Б содержатся инструкции о том, как загрузить и установить такие
внешние пакеты. В следующем примере используем пакет . Вот все, что
вам необходимо сделать:
ɛpip install construct
ǫȓȈȊȈǶȉȘȈȉȈȚȣȊȈȍȔȌȈȕȕȣȍ
Здесь показано, как можно извлечь измерения PNG из нашей строки байтов
с помощью пакета :
ʴʴʴ ř ř ɪɩřř
ʴʴʴɤȔȘȔȣȦȜȤȢȖȔȡȢȜțȞȢȘȔȣȢȔȘȤșȥȧśŵŵŜ ŵ
ʴʴʴʰ ſɐɐř
ŜŜŜ ſɐɎɯɰ ɎɎɎɨɎɐƀř
ŜŜŜ ɪɩſɐɐƀř
ŜŜŜſſɐɐřɫƀřɐ ɐƀř
ŜŜŜ ɪɩſɐɐƀř
ŜŜŜ ɪɩſɐɐƀ
ŜŜŜƀ
ʴʴʴʰɐɎɯɰ ɎɎɎɨɎɎɥɥɎɥɥɎɥɥɎ ɐʫɎ
ŜŜŜɐɎɥɥɎɥɥɎɥɥɎɰɎɥɥɎɥɥɎɥɥɎɯɎɥɯɎɥɩɎɥɥɎɥɥɎɥɥɎ ɥɐ
ʴʴʴʰŜſƀ
ʴʴʴſƀ
ś
ʰɨɪ
ʰɐ ɐ
ʰɨɬɫ
ʰɨɫɨ
ʴʴʴſŜřŜƀ
ɨɬɫřɨɫɨ
ǷȘȍȖȉȘȈȏțȍȔȉȈȑȚȣșȚȘȖȒȐșȗȖȔȖȡȤȦȔȖȌțȓȧELQDVFLL
Стандартный модуль содержит функции, которые позволяют вам кон-
вертировать данные в бинарный вид и в различные представления строк: шест-
надцатеричное (с основанием 16), с основанием 64, uuencoded и др. Например,
в следующем фрагменте мы выведем на экран восьмибайтный заголовок PNG как
последовательность шестнадцатеричных значений вместо комбинации символов
ASCII и escape-последовательностей вида Ɏ , которые Python использует для
отображения байтовых переменных:
ʴʴʴ
ʴʴʴɏɏʰɐɎɯɰ ɎɎɎɨɎɐ
ʴʴʴſ Ŝſɏɏƀƀ
ɐɯɰɬɥɫɫɮɥɥɨɥɐ
ǩȐȚȖȊȣȍȖȗȍȘȈȚȖȘȣ
Python предоставляет целочисленные операторы на уровне битов, аналогичные тем,
что имеются в языке С. В табл. 12.6 собраны все операторы вместе с примерами для
целочисленных переменных a (в десятичной системе счисления ɬ, в двоичной —
ɥɥɨɥɨ) и b (в десятичной системе счисления ɨ, в двоичной — ɥɥɥɥɨ).
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǺȈȉȓȐȞȈǾȍȓȖȟȐșȓȍȕȕȣȍȖȗȍȘȈȞȐȐȌȓȧțȘȖȊȕȧȉȐȚȖȊ
ǨȕȈȓȖȋȐȧșȦȊȍȓȐȘȕȣȔȐȐȏȌȍȓȐȧȔȐ
Строки Unicode похожи на браслет с брелоками, а байты — на нитки с бусинами.
ǿȐȚȈȑȚȍȌȈȓȍȍ
Далее следует еще одна практическая глава — в ней показывается, как работать
с датой и временем.
ǻȗȘȈȎȕȍȕȐȧ
12.1. Создайте строку Unicode с именем и присвойте ей значение ɐɎɥɥɥɨɫɰɐ.
Выведите на экран значение строки . Выведите на экран значение пере-
менной и ее имя Unicode.
12.2. Закодируйте строку , на этот раз с использованием кодировки UTF-8,
в переменную типа bytes с именем ɏ. Выведите на экран значение
переменной ɏ.
ǫȓȈȊȈǶȉȘȈȉȈȚȣȊȈȍȔȌȈȕȕȣȍ
ɐ
ř
Ŝ
ř
ř
ř
ř Ŝ
ř
ř
řŠ Ŝ
ɐř
ɐ ř
Ŝ
Мэрилин Монро
ǪȐșȖȒȖșȕȣȑȋȖȌ
Високосные годы — еще одна проблема. Наверняка вы знаете, что каждый четвер-
тый год — високосный (в такие годы проходят летние Олимпийские игры и выборы
президента в США). Но знаете ли вы, что каждый сотый год не является високос-
ным, а каждый 400-й — является? Рассмотрим пример кода, в котором проверяется,
високосный год или нет:
ʴʴʴ
ʴʴʴ Ŝſɨɰɥɥƀ
ʴʴʴ Ŝſɨɰɰɭƀ
ʴʴʴ Ŝſɨɰɰɰƀ
ʴʴʴ Ŝſɩɥɥɥƀ
ʴʴʴ Ŝſɩɥɥɩƀ
ʴʴʴ Ŝſɩɥɥɫƀ
ǴȖȌțȓȤGDWHWLPH
Модуль стандартной библиотеки позволяет работать с датами и време-
нем (что вполне ожидаемо). В нем определены четыре основных класса объектов,
и в каждом содержится множество методов:
— для годов, месяцев и дней;
— для часов, минут, секунд и долей секунды;
— для даты и времени одновременно;
— для интервалов даты и/или времени.
Вы можете создать объект , указав год, месяц и день. Эти значения будут
доступны как атрибуты:
ʴʴʴ
ʴʴʴʰſɩɥɨɰřɨɥřɪɨƀ
ʴʴʴ
Ŝſɩɥɨɰřɨɥřɪɨƀ
ʴʴʴŜ
ɪɨ
ʴʴʴŜ
ɨɥ
ʴʴʴŜ
ɩɥɨɰ
ʴʴʴʰʫɏ
ʴʴʴ
Ŝſɩɥɨɰřɫřɭƀ
ʴʴʴʫɨɮƋɏ
Ŝſɩɥɨɰřɫřɩɩƀ
ʴʴʴʰŹɏ
ʴʴʴ
Ŝſɩɥɨɰřɫřɫƀ
Объект может иметь значение в диапазоне, начинающемся с Ŝ
ſʰɨř ʰɨř ʰɨƀ и заканчивающемся Ŝ ſʰɰɰɰɰř ʰɨɩř
ʰɪɨƀ. Таким образом, этот метод неприменим для исторических или астрономи-
ческих расчетов.
Объект модуля применяется для представления времени дня:
ʴʴʴ
ʴʴʴʰſɨɩřɥřɥƀ
ʴʴʴ
Ŝſɨɩřɥƀ
ʴʴʴŜ
ɨɩ
ʴʴʴŜ
ɥ
ʴʴʴŜ
ɥ
ʴʴʴŜ
ɥ
Порядок аргументов таков: от самой крупной единицы времени (часа) до самой
мелкой (микросекунды). Если вы передадите не все аргументы, объект предполо-
жит, что остальные имеют значение ɥ. Кстати, то, что вы можете сохранять и получать
микросекунды, не означает, что вы можете извлекать время из вашего компьютера
с точностью до микросекунды. Высокая точность измерений зависит от многих фак-
торов, присущих аппаратному обеспечению и операционной системе.
Объект содержит дату и время дня. Вы можете создать такой объект на-
прямую, как показано в примере: 2 января, 2014, 3:04 утра, плюс 5 секунд и 6 микро-
секунд:
ʴʴʴ
ʴʴʴɏʰſɩɥɨɰřɨřɩřɪřɫřɬřɭƀ
ʴʴʴɏ
Ŝſɩɥɨɰřɨřɩřɪřɫřɬřɭƀ
Объект также имеет метод ſƀ:
ʴʴʴɏŜſƀ
ɐɩɥɨɰŞɥɨŞɥɩɥɪśɥɫśɥɬŜɥɥɥɥɥɭɐ
Буква , которая находится в середине, разделяет дату и время.
Объект имеет метод ſƀ, с помощью которого можно получить теку-
щие дату и время:
ʴʴʴ
ʴʴʴʰŜſƀ
ʴʴʴ
ǫȓȈȊȈDzȈȓȍȕȌȈȘȐȐȟȈșȣ
Ŝſɩɥɨɰřɫřɬřɨɰřɬɪřɮřɬɯɥɬɭɩƀ
ʴʴʴŜ
ɩɥɨɰ
ʴʴʴŜ
ɫ
ʴʴʴŜ
ɬ
ʴʴʴŜ
ɨɰ
ʴʴʴŜ
ɬɪ
ʴʴʴŜ
7
ʴʴʴŜ
ɬɯɥɬɭɩ
Объединить объекты и в объект можно с помощью метода
ſƀ:
ʴʴʴřř
ʴʴʴʰſɨɩƀ
ʴʴʴɏʰŜſƀ
ʴʴʴɏʰŜ ſɏřƀ
ʴʴʴɏ
Ŝſɩɥɨɰřɫřɬřɨɩřɥƀ
Получить объекты и из объекта можно с помощью методов
ſƀ и ſƀ:
ʴʴʴɏŜſƀ
Ŝſɩɥɨɰřɫřɬƀ
ʴʴʴɏŜſƀ
Ŝſɨɩřɥƀ
ǴȖȌțȓȤWLPH
В Python есть модуль с объектом , но есть и отдельный модуль .
Более того, в модуле имеется функция с каким бы вы думали именем? Правиль-
но, ſƀ.
Одним из способов представления абсолютного времени является подсчет ко-
личества секунд, прошедших с определенной начальной точки. В Unix считают
количество секунд, прошедших с полуночи 1 января 1970 года1: это значение часто
называют epoch. Как правило, данный способ самый простой для обмена датой
и временем между системами.
Функция ſƀ модуля возвращает текущее время как значение :
ʴʴʴ
ʴʴʴʰŜſƀ
ʴʴʴ
ɨɬɬɫɬɨɩɨɪɩŜɮɮɯɩɪɪ
1
Примерно в это время появилась система Unix, если не обращать внимания на досадные
високосные секунды.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
Если выполнить подсчеты, вы увидите, что прошло более миллиарда секунд по-
сле наступления нового, 1970 года. И куда ушло время?
Вы можете преобразовать значение в строку с помощью функции ſƀ:
ʴʴʴŜ ſƀ
ɐ ɬɨɰśɬɬśɪɩɩɥɨɰɐ
В моем (Центральном) часовом поясе 19:55 — это то же самое, что 00:55 следу-
ющего дня в поясе UTC (раньше его называли Гринвичским временем или временем
Зулу). Если вы опустите аргумент в функциях ſƀ или ſƀ, они пред-
положат, что сконвертировать нужно текущее время.
Некоторые значения ɏŜŜŜ из структуры ɏ выглядят неоднозначно,
поэтому обратитесь к табл. 13.1 для получения более подробной информации.
ǺȈȉȓȐȞȈǯȕȈȟȍȕȐȧșȚȘțȒȚțȘȣVWUXFWBWLPH
ǵȍȉȖȓȤȠȖȑ șȖȊȍȚ ȊȍȏȌȍ ȋȌȍ ȊȖȏȔȖȎȕȖ ȐșȗȖȓȤȏțȑȚȍ ȟȈșȖȊȖȑ ȗȖȧș 87& 87& ²
ȥȚȖȈȉșȖȓȦȚȕȖȍȊȘȍȔȧȕȍȏȈȊȐșȧȡȍȍȖȚȟȈșȖȊȣȝȗȖȧșȖȊǭșȓȐțȊȈșȍșȚȤșȍȘȊȍȘ
țșȚȈȕȖȊȐȚȍȍȋȖȊȘȍȔȧȊ87&ȕȍȗȘȐȊȧȏȣȊȈȧșȤȒȔȍșȚȕȖȔțȊȘȍȔȍȕȐ
ǭȡȍ ȖȌȐȕ șȖȊȍȚ ȕȐȒȖȋȌȈ ȕȍ ȐșȗȖȓȤȏțȑȚȍ ȓȍȚȕȍȍ ȊȘȍȔȧ ȍșȓȐ ȔȖȎȕȖ ȉȍȏ ȥȚȖȋȖ
ȖȉȖȑȚȐșȤǭșȓȐȊȣțȟȐȚȣȊȈȍȚȍȗȖȌȖȉȕȣȍȗȍȘȍȝȖȌȣȊȒȈȒȖȑȚȖȔȖȔȍȕȚȟȈșțȊȈș
ȗȘȖȗȈȌȍȚ ȊȍșȕȖȑ ȈȊȌȘțȋȖȑ²ȕȈșȚțȗȐȚȌȊȈȎȌȣ ȖșȍȕȤȦ ǷȖȘȈȏȕȣȔȗȘȐȟȐȕȈȔ
ȔȕȖȋȐȍȖȘȋȈȕȐȏȈȞȐȐȗȖȓȤȏțȦȚșȧȓȍȚȕȐȔȊȘȍȔȍȕȍȔȊșȊȖȐȝȒȖȔȗȤȦȚȍȘȕȣȝșȐșȚȍȔȈȝ
ȈȗȖȚȖȔțȌȐȊȓȧȦȚșȧțȌȊȖȍȕȐȦȐȗȖȚȍȘȍȌȈȕȕȣȝȐȏȏȈȥȚȖȋȖȚȈȐȕșȚȊȍȕȕȖȋȖȟȈșȈ
ǿȐȚȈȍȔȐȏȈȗȐșȣȊȈȍȔȌȈȚțȐȊȘȍȔȧ
Функция ſƀ — это не единственный способ записывать дату и время.
Вы уже видели функцию ſƀ в модуле , которую можете использовать для
преобразования времени в строку:
ʴʴʴ
ʴʴʴʰŜſƀ
ʴʴʴŜ ſƀ
ɐ ɬɨɰśɬɯśɩɪɩɥɨɰɐ
ǺȈȉȓȐȞȈǹȗȍȞȐȜȐȒȈȚȖȘȣȊȣȊȖȌȈȌȓȧVWUIWLPH
Если мы попробуем сделать это с объектом , функция отработает только для
даты. Время будет установлено в полночь:
ʴʴʴ
ʴʴʴɏʰſɩɥɨɰřɮřɫƀ
ʴʴʴʰɑ ɐʩʩřʩř ʩ śʩśʩʩɑ
ʴʴʴɏŜſƀ
ɑ ɐ ř ɥɫřɩɥɨɰř ɨɩśɥɥśɥɥɑ
Чтобы пойти другим путем и преобразовать строку в дату или время, используйте
функцию ſƀ с такой же строкой формата. Эта строка работает не так, как
регулярные выражения, — части строки, не касающиеся формата (без символа ʩ),
должны совпадать точно. Укажем формат ȗȢȘŞȠșȥȳȪŞȘșȡȰ, например ɩɥɨɰŞɥɨŞɩɰ.
Что произойдет, если строка даты, которую вы хотите проанализировать, имеет
пробелы вместо дефисов?
ʴʴʴ
ʴʴʴʰɑʩŞʩŞʩɑ
ʴʴʴŜſɑɩɥɨɰɥɨɩɰɑřƀ
ſ ƀś
ɑʳʴɑř
ɨřʳʴ
ɑŵŵ ŵŜŵŵɪŜɪŵŵ
ɪŜɪŵɏŜɑř
ɫɰɫřɏɏ
ʰɏſɏřƀƃɥƄ
ɑŵŵ ŵŜŵŵɪŜɪŵŵ
ɪŜɪŵɏŜɑř
ɪɪɮřɏſɏřƀƀ
śɐɩɥɨɰɥɨɩɰɐ ɐʩŞʩŞʩɐ
Будет ли довольна функция ſƀ, если мы передадим ей несколько дефисов?
ʴʴʴŜſɑɩɥɨɰŞɥɨŞɩɰɑřƀ
Ŝ ɏſɏʰɩɥɨɰřɏʰɨřɏʰɩɰřɏʰɥřɏʰɥř
ɏ ʰɥřɏʰɭřɏʰɩɰřɏʰŞɨƀ
Да.
Даже если строка совпадает с заданным форматом, но одно из значений находит-
ся вне диапазона, будет сгенерировано исключение:
ʴʴʴŜſɑɩɥɨɰŞɨɪŞɩɰɑřƀ
ſ ƀś
ɑʳʴɑřɨřʳʴ
ɑŵŵ ŵŜŵŵɪŜɪŵŵ
ɪŜɪŵɏŜɑř
ɫɰɫřɏɏ
ʰɏſɏřƀƃɥƄ
ɑŵŵ ŵŜŵŵɪŜɪŵŵ
ɪŜɪŵɏŜɑř
ɪɪɮřɏſɏřƀƀ
śɐɩɥɨɰŞɨɪŞɩɰɐ ɐʩŞʩŞʩɐ
Имена соответствуют вашей локали — региональному набору настроек операци-
онной системы. Чтобы вывести на экран другие названия месяцев и дней, измените
свою локаль с помощью функции ſƀ: ее первый аргумент — Ŝɏ
для даты и времени, а второй аргумент — это строка, содержащая сокращенное обо-
значение языка и страны. Давайте пригласим на вечеринку в честь Дня Всех Святых
наших иностранных друзей. Выведем на экран дату (месяц, число и день недели)
на английском, французском, немецком, испанском и исландском. (А что? Думаете,
исландцы не любят вечеринки? У них даже есть настоящие эльфы.)
ʴʴʴ
ʴʴʴ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ʴʴʴʰſɩɥɨɫřɨɥřɪɨƀ
ʴʴʴɏ ƃɐɏɐřɐɏɐřɐɏɐřɐɏɐřɐɏɐřƄś
ŜŜŜ Ŝ ſ Ŝɏ řɏ ƀ
ŜŜŜŜſɐʩřʩʩɐƀ
ŜŜŜ
ɐɏɐ
ɐř ɪɨɐ
ɐɏɐ
ɐ ř ɪɨɐ
ɐɏɐ
ɐřɪɨɐ
ɐɏɐ
ɐř ɪɨɐ
ɐɏɐ
ɐřÜɪɨɐ
ʴʴʴ
Откуда можно взять эти волшебные значения аргумента ɏ ? Следу-
ющий способ не самый надежный, но вы можете попробовать получить их все сразу
(все несколько сотен):
ʴʴʴ
ʴʴʴʰ Ŝ ɏŜſƀ
Если вы хотите получить все локали для Германии, используйте следующий код:
ʴʴʴʰƃɏŜſɐɐƀƄ
ʴʴʴ
ƃɐɏɐřɐɏɐřɐɏ ɐřɐɏɐřɐɏɐƄ
ǭșȓȐȊȣȏȈȗțșȚȐȚȍȜțȕȒȞȐȦVHWBORFDOH ȐȗȖȓțȟȐȚȍȖȠȐȉȒțORFDOH(UURUXQVXSSRUWHG
ORFDOHȥȚȖȉțȌȍȚȖȏȕȈȟȈȚȤȟȚȖțșȚȈȕȖȊȒȈȌȈȕȕȖȑȓȖȒȈȓȐȕȍȗȖȌȌȍȘȎȐȊȈȍȚșȧȊȈȠȍȑ
ȖȗȍȘȈȞȐȖȕȕȖȑ șȐșȚȍȔȖȑ ǪȈȔ ȗȖȚȘȍȉțȍȚșȧ ȊȣȧșȕȐȚȤ ȟȚȖ ȕțȎȕȖ ȖȗȍȘȈȞȐȖȕȕȖȑ
șȐșȚȍȔȍ Ȍȓȧ ȌȖȉȈȊȓȍȕȐȧ ȓȖȒȈȓȐ ǶȠȐȉȒȈ ȔȖȎȍȚ ȗȘȖȐȏȖȑȚȐ ȌȈȎȍ Ȋ ȚȖȔ șȓțȟȈȍ
ȍșȓȐ 3\WKRQ ș ȗȖȔȖȡȤȦ ȜțȕȒȞȐȐ ORFDOHORFDOHBDOLDVNH\V șȖȖȉȡȐȚ ȊȈȔ ȟȚȖ ȥȚȈ
ȓȖȒȈȓȤȝȖȘȖȠȈȧȇȗȖȓțȟȐȓȖȠȐȉȒțȗȘȐȚȍșȚȐȘȖȊȈȕȐȐȕȈPDF26șȐșȗȖȓȤȏȖȊȈȕȐȍȔ
ȓȖȒȈȓȐF\BJE ȊȈȓȓȐȑșȒȐȑǪȍȓȐȒȖȉȘȐȚȈȕȐȧ ȌȈȎȍȕȍșȔȖȚȘȧȕȈȚȖȟȚȖȓȖȒȈȓȤLVBLV
ȐșȓȈȕȌșȒȐȑǰșȓȈȕȌȐȧ ȗȍȘȍȌȥȚȐȔȉȣȓȈȗȘȐȕȧȚȈ
ǫȓȈȊȈDzȈȓȍȕȌȈȘȐȐȟȈșȣ
ǪșȍȗȘȍȖȉȘȈȏȖȊȈȕȐȧ
На рис. 13.1, взятом из вики Python (KWWSVRUHLOO\&BN), обобщены все стандартные
преобразования времени, которые можно выполнить в Python.
ǸȐșǷȘȍȖȉȘȈȏȖȊȈȕȐȧȌȈȚȣȐȊȘȍȔȍȕȐ
ǨȓȤȚȍȘȕȈȚȐȊȕȣȍȔȖȌțȓȐ
Если вы считаете, что модули стандартной библиотеки только создают путаницу
или в них не хватает какого-то конкретного преобразования, можете использовать
альтернативные модули от сторонних разработчиков. Рассмотрим некоторые из них:
arrow (KWWSVDUURZUHDGWKHGRFVLR). Этот модуль содержит множество функций для
работы с датой и временем и имеет простой API;
(KWWSODEL[RUJS\WKRQGDWHXWLO). Модуль может проанализировать любой
формат даты и хорошо работает с относительными датами и временем;
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǿȐȚȈȑȚȍȌȈȓȍȍ
Файлы и каталоги тоже хотят внимания.
ǻȗȘȈȎȕȍȕȐȧ
13.1. Запишите текущие дату и время как строку в текстовый файл Ŝ.
13.2. Прочтите текстовый файл Ŝ и разместите данные в строке ɏ
string.
13.3. Проанализируйте дату из строки ɏ.
13.4. Создайте объект с датой вашего рождения.
13.5. В какой день недели вы родились?
13.6. Когда вам будет (или уже было) 10 000 дней от роду?
ƋƓƈƊƈ
ǼȈȑȓȣȐȒȈȚȈȓȖȋȐ
Джордж Р. Р. Мартин
ǪȊȖȌȐȕȜȖȘȔȈȞȐȐȊȜȈȑȓȣȐȍȍȊȣȊȖȌȐȏȕȐȝ
Самый простой вид хранения — это старый добрый файл, иногда называемый пло-
ским файлом. Он представляет собой последовательность байтов, которая хранится
под именем файла. Вы считываете данные из файла в память и записываете данные
из памяти в файл. Python позволяет делать это довольно легко. Как и во многих
других языках, операции с файлами, присутствующие в этом языке программирова-
ния, в большинстве своем были смоделированы на основе знакомых и популярных
аналогов, имеющихся в Unix.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǹȖȏȌȈȍȔȐȓȐȖȚȒȘȣȊȈȍȔȜȈȑȓȣ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐRSHQ
Вам нужно вызвать функцию open, прежде чем сделать следующее:
прочитать существующий файл;
записать в новый файл;
добавить данные в существующий файл;
перезаписать существующий файл.
ȨȔȝȟɕȢȕʰſȜȠȳɕȨȔȝȟȔřȤșȚȜȠƀ
Кратко поясню фрагменты этого вызова:
ȨȔȝȟɕȢȕ — это объект файла, возвращаемый функцией ſƀ;
ȜȠȳɕȨȔȝȟȔ — это строка, представляющая собой имя файла;
ȤșȚȜȠ — это строка, указывающая на тип файла и действия, которые вы хотите
произвести над файлом.
Первая буква строки mode указывает на операцию:
r означает чтение;
w означает запись. Если файла не существует, он будет создан. Если файл суще-
ствует, он будет перезаписан;
означает запись, но только если файла еще не существует;
a означает добавление данных в конец файла, если он существует.
Вторая буква строки указывает на тип файла:
t (или ничего) означает, что файл текстовый;
b означает, что файл бинарный.
После открытия файла вы вызываете функции для чтения или записи данных.
Они будут показаны в следующих примерах.
Наконец, вам нужно закрыть файл, чтобы гарантировать, что все операции за-
писи завершены, а память освобождена. Далее вы узнаете, как оператор with может
это автоматизировать.
В данной программе открывается файл с именем Ŝ, а затем закрывается
без выполнения каких-либо действий. В результате будет создан пустой файл:
ʴʴʴʰſɐŜɐřɐɐƀ
ʴʴʴŜ ſƀ
ǯȈȗȐșȣȊȈȍȔȊȚȍȒșȚȖȊȣȑȜȈȑȓșȗȖȔȖȡȤȦȜțȕȒȞȐȐSULQW
Создадим заново файл Ŝ, но теперь запишем в него строку, а затем закроем:
ʴʴʴʰſɐŜɐřɐɐƀ
ʴʴʴſɐř Ŝɐřʰƀ
ʴʴʴŜ ſƀ
ǫȓȈȊȈǼȈȑȓȣȐȒȈȚȈȓȖȋȐ
ǯȈȗȐșȣȊȈȍȔȊȚȍȒșȚȖȊȣȑȜȈȑȓ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐZULWH
Мы использовали функцию print для того, чтобы записать строку в файл. Но можно
использовать и функцию write.
В качестве примера многострочного источника данных возьмем лимерик о специ-
альной теории относительности1:
ʴʴʴʰɐɐɐř
ŜŜŜŚ
ŜŜŜ
ŜŜŜ ř
ŜŜŜŜɐɐɐ
ʴʴʴſƀ
ɨɬɥ
1
В первой рукописи этой книги я использовал термин «общая теория относительности»
и был любезно исправлен редактором-физиком.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǹȟȐȚȣȊȈȍȔȌȈȕȕȣȍȐȏȚȍȒșȚȖȊȖȋȖȜȈȑȓȈ
ȐșȗȖȓȤȏțȧȜțȕȒȞȐȐUHDG UHDGOLQH ȐUHDGOLQHV
Вы можете вызвать функцию ſƀ без аргументов, чтобы достать весь файл сразу,
как показано в следующем примере. Будьте осторожны, делая это с крупными фай-
лами: файл размером 1 Гбайт потребит 1 Гбайт памяти:
ʴʴʴʰſɐɐřɐɐƀ
ʴʴʴʰŜſƀ
ǫȓȈȊȈǼȈȑȓȣȐȒȈȚȈȓȖȋȐ
ʴʴʴŜ ſƀ
ʴʴʴſƀ
ɨɬɥ
После того как вы считаете весь файл, дальнейшие вызовы функции ſƀ будут
возвращать пустую строку ɐ ɐ, которая рассматривается как при проверке if
not . Это позволит выйти из цикла while .
Вы также можете считывать файл построчно с помощью функции ſƀ.
В следующем примере мы будем присоединять по одной строке к , чтобы вос-
становить оригинал:
ʴʴʴʰɐɐ
ʴʴʴʰſɐɐřɐɐƀ
ʴʴʴś
ŜŜŜʰŜſƀ
ŜŜŜś
ŜŜŜ
ŜŜŜʫʰ
ŜŜŜ
ʴʴʴŜ ſƀ
ʴʴʴſƀ
ɨɬɥ
Для текстового файла даже пустая строка имеет длину, равную ɨ (символ новой
строки), такая строка будет считаться . Когда весь файл будет считан, функция
ſƀ (как и функция ſƀ) возвратит пустую строку, которая будет счи-
таться .
Самый простой способ считать текстовый файл — использовать итератор.
Он будет возвращать по одной строке за раз. Этот пример похож на предыдущий,
но кода в нем меньше:
ʴʴʴʰɐɐ
ʴʴʴʰſɐɐřɐɐƀ
ʴʴʴś
ŜŜŜʫʰ
ŜŜŜ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ʴʴʴŜ ſƀ
ʴʴʴſƀ
ɨɬɥ
ǯȈȗȐșȣȊȈȍȔȌȈȕȕȣȍȊȉȐȕȈȘȕȣȑȜȈȑȓ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐZULWH
Если вы включите символ ɐɐ в строку режима, файл откроется в бинарном режиме.
В этом случае вы будете читать и записывать байты, а не строки.
У нас под рукой нет бинарного стихотворения, поэтому мы просто сгенерируем
256 байтовых значений от 0 до 255:
ʴʴʴʰſſɥřɩɬɭƀƀ
ʴʴʴſƀ
ɩɬɭ
Откроем файл для записи в бинарном режиме и запишем все данные сразу:
ʴʴʴʰſɐɐřɐɐƀ
ʴʴʴŜſƀ
ɩɬɭ
ʴʴʴŜ ſƀ
ʴʴʴʰɥ
ʴʴʴ ʰɨɥɥ
ʴʴʴś
ŜŜŜʴś
ŜŜŜ
ŜŜŜŜſƃśʫ Ƅƀ
ŜŜŜʫʰ
ŜŜŜ
ɨɥɥ
ɨɥɥ
ɬɭ
ʴʴʴŜ ſƀ
ǿȐȚȈȍȔȉȐȕȈȘȕȣȍȜȈȑȓȣșȗȖȔȖȡȤȦȜțȕȒȞȐȐUHDG
Это достаточно просто. Все, что вам нужно, — открыть файл в режиме ɐɐ:
ʴʴʴʰſɐɐřɐɐƀ
ʴʴʴʰŜſƀ
ʴʴʴſƀ
ɩɬɭ
ʴʴʴŜ ſƀ
ǯȈȒȘȣȊȈȍȔȜȈȑȓȣȈȊȚȖȔȈȚȐȟȍșȒȐ
șȗȖȔȖȡȤȦȒȓȦȟȍȊȖȋȖșȓȖȊȈZLWK
Если вы забудете закрыть файл, его закроет Python после того, как будет удалена
последняя ссылка на этот файл. Таким образом, если вы откроете файл и не за-
кроете его явно, он будет закрыт автоматически по завершении функции. Но вы
можете открыть файл внутри длинной функции или даже основного раздела про-
граммы. Файл должен быть закрыт, чтобы все оставшиеся операции записи были
завершены.
У Python имеются менеджеры контекста для очистки таких объектов, как от-
крытые файлы. Вы можете использовать конструкцию with ȖȯȤȔȚșȡȜș as ȣșȤșȠșȡȡȔȳ:
ʴʴʴſɐɐřɐɐƀś
ŜŜŜŜſƀ
ŜŜŜ
Вот и все. После того как блок кода, расположенный под менеджером контекста
(в данном случае это одна строка), завершится (или нормально, или путем генера-
ции исключения), файл закроется автоматически.
ǴȍȕȧȍȔȗȖȏȐȞȐȦșȗȖȔȖȡȤȦȜțȕȒȞȐȐVHHN
В процессе чтения и записи Python отслеживает ваше местоположение в файле.
Функция ſƀ возвращает ваше текущее смещение от начала файла в байтах.
Функция ſƀ позволяет перейти к другому смещению в файле. Это значит, что
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǶȚȖȉȘȈȎȍȕȐȍȊȗȈȔȧȚȐ
Альтернативой чтению и записи файла является его отображение в памяти
(memory-map) с помощью стандартного модуля . Такой подход позволяет пред-
ставить содержимое файла как bytearray в памяти. Для получения более подробной
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǶȗȍȘȈȞȐȐșȜȈȑȓȈȔȐ
В Python, как и во многих других языках программирования, операции для работы
с файлами основаны на аналогичных операциях ОС Unix. Некоторые функции,
такие как ſƀ и ſƀ, называются одинаково, но теперь появились и новые
названия. Сначала я покажу, как Python решает задачи с помощью функций из мо-
дуля Ŝ, а затем — с помощью более нового модуля pathlib.
ǷȘȖȊȍȘȧȍȔșțȡȍșȚȊȖȊȈȕȐȍȜȈȑȓȈ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐH[LVWV
Если хотите убедиться в том, что файл или каталог действительно существуют,
а не являются плодом вашего воображения, воспользуйтесь функцией ſƀ.
Передайте функции относительное или абсолютное имя файла, как показано
здесь:
ʴʴʴ
ʴʴʴŜŜſɐŜɐƀ
ʴʴʴŜŜſɐŜŵŜɐƀ
ʴʴʴŜŜſɐɐƀ
ʴʴʴŜŜſɐŜɐƀ
ʴʴʴŜŜſɐŜŜɐƀ
ǷȘȖȊȍȘȧȍȔȚȐȗșȗȖȔȖȡȤȦȜțȕȒȞȐȐLVILOH
Функции, показанные в этом подразделе, проверяют, ссылается ли имя на файл,
каталог или символьную ссылку (см. примеры, которые располагаются после опи-
сания ссылок).
Первой мы рассмотрим функцию ſƀ. Она задает простой вопрос: перед
нами находится старый добрый законопослушный файл?
ʴʴʴʰɐŜɐ
ʴʴʴŜŜſƀ
Одна точка (Ŝ) является сокращением для текущей папки, а две точки (ŜŜ) — для
родительской. Эти папки существуют всегда, поэтому следующее выражение вернет
результат :
ʴʴʴŜŜſɐŜɐƀ
DzȖȗȐȘțȍȔȜȈȑȓȣȐșȗȖȓȤȏțȧȜțȕȒȞȐȦFRS\
Функция ſƀ находится в другом модуле, shutil. В этом примере файл Ŝ
копируется в файл Ŝ:
ʴʴʴ
ʴʴʴŜ ſɐŜɐřɐŜɐƀ
ǰȏȔȍȕȧȍȔȐȔȍȕȈȜȈȑȓȖȊșȗȖȔȖȡȤȦȜțȕȒȞȐȐUHQDPH
Эта функция соответствует своему названию. В этом примере файл Ŝ пере-
именовывается в Ŝ:
ʴʴʴ
ʴʴʴŜſɐŜɐřɐŜɐƀ
ǹȖȏȌȈȍȔșșȣȓȒȐșȗȖȔȖȡȤȦȜțȕȒȞȐȐOLQN
ȐȓȐV\POLQN
В операционных системах семейства Unix файл находится в одном определенном
месте, но может иметь несколько имен, называемых ссылками. В низкоуровневых
жестких ссылках найти все имена заданного файла не так уж легко. Символьная ссыл-
ка — это альтернативный метод, который сохраняет новое имя в своем собственном
файле, позволяя вам получить одновременно оба имени — оригинальное и новое.
Вызов ſƀ создает жесткую ссылку, а ſƀ — символьную ссылку. Функция
ſƀ проверяет, является ли файл символьной ссылкой.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǰȏȔȍȕȧȍȔȘȈȏȘȍȠȍȕȐȧșȗȖȔȖȡȤȦȜțȕȒȞȐȐFKPRG
В системах Unix функция ſƀ вносит изменения в права на доступ к файлу.
Существуют права на чтение, запись и выполнение файла для пользователя (обыч-
но того, кто создавал файл), а также для какой-то группы, в которой состоит поль-
зователь, и для всех остальных. Команда принимает сильно сжатое восьмеричное
значение (в системе счисления с основанием 8), в котором указаны пользователь,
группа и другие, кто имеет доступ. Например, для указания того, что файл Ŝ
для чтения доступен только своему владельцу, нужно ввести следующий код:
ʴʴʴŜ ſɐŜɐřɥɫɥɥƀ
ǰȏȔȍȕȍȕȐȍȊȓȈȌȍȓȤȞȈȜȈȑȓȈșȗȖȔȖȡȤȦȜțȕȒȞȐȐFKRZQ
Эта функция также характерна для систем Unix/Linux/Mac. Вы можете изменить
владельца и/или группу, указав числовой идентификатор пользователя ID ()
и идентификатор группы ():
ʴʴʴʰɬ
ʴʴʴʰɩɩ
ʴʴʴŜ ſɐɐřřƀ
ǻȌȈȓȧȍȔȜȈȑȓșȗȖȔȖȡȤȦȜțȕȒȞȐȐUHPRYH
В этом фрагменте мы используем функцию ſƀ и попрощаемся с файлом Ŝ:
ʴʴʴŜſɐŜɐƀ
ʴʴʴŜŜſɐŜɐƀ
ǫȓȈȊȈǼȈȑȓȣȐȒȈȚȈȓȖȋȐ
DzȈȚȈȓȖȋȐ
В большинстве операционных систем файлы существуют в рамках иерархии ȞȔȦȔŞ
ȟȢȗȢȖ (иначе их еще называют ȣȔȣȞȔȠȜ). Контейнером для всех этих файлов и ката-
логов служит файловая система (иногда ее называют томом). Стандартный модуль
os работает с такой иерархией и предоставляет функции, с помощью которых ею
можно манипулировать.
ǹȖȏȌȈȍȔȒȈȚȈȓȖȋșȗȖȔȖȡȤȦȜțȕȒȞȐȐPNGLU
В этом примере показывается, как создать каталог , в котором мы сохраним
предыдущее стихотворение:
ʴʴʴŜſɐɐƀ
ʴʴʴŜŜſɐɐƀ
ǻȌȈȓȧȍȔȒȈȚȈȓȖȋȐșȗȖȓȤȏțȧȜțȕȒȞȐȦUPGLU
Немного подумав1, вы решили, что этот каталог вам не нужен. Удалить его можно
так:
ʴʴʴŜſɐɐƀ
ʴʴʴŜŜſɐɐƀ
ǪȣȊȖȌȐȔȕȈȥȒȘȈȕșȖȌȍȘȎȐȔȖȍȒȈȚȈȓȖȋȈ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐOLVWGLU
О’кей, дубль два: снова создадим файл и что-нибудь в него запишем:
ʴʴʴŜſɐɐƀ
Теперь получим список всех файлов, содержащихся в этом каталоге (их пока нет):
ʴʴʴŜſɐɐƀ
ƃƄ
Создайте в подкаталоге файл (не вводите все эти строки, если только не хотите
почувствовать себя поэтом, а просто убедитесь, что начинаете и заканчиваете соот-
ветствующими кавычками, одинарными или тройными):
ʴʴʴʰſɐŵ ŵɏɏɐřɐɐƀ
ʴʴʴŜſɐɐɐř
1
И почему же мы не подумали раньше?
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ŜŜŜ ř
ŜŜŜɐř
ŜŜŜ ř
ŜŜŜ ř
ŜŜŜ ɐɐř
ŜŜŜ ř
ŜŜŜ
ŜŜŜ ř
ŜŜŜɐř ɐŜ
ŜŜŜɐɐɐƀ
ɪɫɫ
ʴʴʴŜ ſƀ
ǰȏȔȍȕȧȍȔȚȍȒțȡȐȑȒȈȚȈȓȖȋ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐFKGLU
С помощью этой функции вы можете переходить из одной папки в другие. Покинем
текущую папку и проведем немного времени в каталоге :
ʴʴʴ
ʴʴʴŜ ſɐɐƀ
ʴʴʴŜſɐŜɐƀ
ƃɐ ɐƄ
ǷȍȘȍȟȐșȓȧȍȔșȖȊȗȈȌȈȦȡȐȍȜȈȑȓȣ
ȐșȗȖȓȤȏțȧȜțȕȒȞȐȦJORE
Функция ſƀ ищет совпадающие имена файлов или каталогов, используя правила
оболочки Unix, а не более полный синтаксис регулярных выражений. Эти правила
выглядят так:
* — совпадает со всем (в регулярных выражениях аналогом выступает ŜƋ);
ţ — совпадает с одним символом;
ƃ Ƅ — совпадает с символами a, b или ;
ƃŠ Ƅ — совпадает со всеми символами, кроме a, b или .
Получим все файлы и каталоги, имена которых начинаются с буквы :
ʴʴʴ
ʴʴʴŜſɐƋɐƀ
ƃɐ ɐƄ
3DWKQDPH
Практически во всех компьютерах используется иерархическая файловая система,
в которой каталоги (папки) содержат файлы и другие каталоги произвольного
уровня вложенности. Если вы хотите обратиться к определенному файлу или ката-
логу, вам необходимо указать его путь (pathname): последовательность каталогов,
необходимых для того, чтобы добраться до искомого объекта. Последовательность
может быть абсолютной и начинаться сверху (от корня), а может быть относитель-
ной и начинаться с вашего текущего каталога.
Вы часто слышите, как люди путают прямой слеш (это символ ɐŵɐ, а не музыкант
из группы Guns N’ Roses) и обратный слеш ɐɎɐ1. В ОС семейств Unix и Macs (а также
в URL) как разделитель пути применяется слеш, а в ОС Windows — обратный слеш2.
Python позволяет использовать слеш в качестве разделителя пути, когда вы указы-
ваете имена. В Windows вы можете задействовать обратный слеш, но при этом обрат-
ный слеш также является распространенным символом в escape-последовательностях
в Python, поэтому вы должны его удваивать или использовать необработанные
строки Python:
ʴʴʴɏʰɐɎɎɎɎŜɐ
ʴʴʴɏɩʰɐɎɎŜɐ
ʴʴʴɏ
ɐɎɎɎɎŜɐ
ʴʴʴɏɩ
ɐɎɎɎɎŜɐ
1
Один из способов запомнить названия слешей: обычный наклонен вперед, а обратный —
назад.
2
QDOS — это операционная система, которую приобрел Билл Гейтс за $50 000, чтобы соз-
дать MS-DOS, когда IBM начала интересоваться первым ПК. Она была похожа на CP/M,
где слеши использовались в аргументах командной строки. Когда в MS-DOS появились
каталоги, для них пришлось использовать обратные слеши.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǷȖȓțȟȈȍȔȗțȚȤșȗȖȔȖȡȤȦȜțȕȒȞȐȐDEVSDWK
Эта функция расширяет относительное имя до абсолютного. Если ваш текущий
каталог — ŵŵ и файл Ŝ находится там же, можете воспользо-
ваться следующим кодом:
ʴʴʴŜŜſɐŜɐƀ
ɐŵŵŵŜɐ
ǷȖȓțȟȈȍȔșȐȔȊȖȓȤȕțȦșșȣȓȒț
șȗȖȔȖȡȤȦȜțȕȒȞȐȐUHDOSDWK
В одном из предыдущих разделов мы создавали символьную ссылку на файл
Ŝ из нового файла Ŝ. При похожих обстоятельствах вы можете
получить имя файла Ŝ из файла Ŝ с помощью функции ſƀ,
как показано здесь:
ʴʴʴŜŜſɐŜɐƀ
ɐŵŵŵŜɐ
ǷȖșȚȘȖȍȕȐȍȗțȚȐșȗȖȔȖȡȤȦȜțȕȒȞȐȐRVSDWKMRLQ
Когда вы создаете составное имя пути, вы можете вызвать функцию ŜŜſƀ
и объединить части попарно, используя правильный для вашей ОС символ-раз-
делитель:
ʴʴʴ
ʴʴʴɏʰŜŜſɑɑřɑɑƀ
ʴʴʴɏʰŜŜſɏřɑŜɑƀ
Но если один и тот же код выдает разные результаты в зависимости от того, где
он был запущен, это может привести к проблемам. Новый модуль pathlib является
портативным решением этой проблемы.
ǴȖȌțȓȤSDWKOLE
В Python модуль pathlib добавился в версии 3.4. Он представляет собой альтерна-
тиву модулям Ŝ, которые мы только что рассмотрели. Зачем же нужен еще
один модуль?
ǫȓȈȊȈǼȈȑȓȣȐȒȈȚȈȓȖȋȐ
Вместо того чтобы считать пути строками, этот модуль создает объект типа ,
чтобы работать с ними на более высоком уровне. Создайте объект типа с помо-
щью вызова ſƀ, а затем склейте все элементы вашего пути с помощью простых
слешей (а не символов ɐŵ'):
ʴʴʴ
ʴʴʴɏʰſɐɐƀŵɐɐŵɐŜɐ
ʴʴʴɏ
ſɐŵŵŜɐƀ
ʴʴʴſɏƀ
ŵŵŜ
%\WHV,2Ȑ6WULQJ,2
Вы уже знаете, как изменять данные в памяти и как получать данные из файлов,
а также записывать их внутрь. Но что делать в ситуации, когда у вас есть данные
в памяти, но вам нужно вызвать функцию, которая ожидает в качестве параметра
файл (или наоборот)? Вам понадобится изменить данные и передать эти байты или
символы, не создавая временных файлов.
Вы можете применить Ŝ для бинарных данных (байтов) и Ŝ
для текстовых данных (строк). И в том и в другом случае из данных будет создан
файлоподобный объект, который подойдет для всех функций работы с файлами,
рассмотренных в этой главе.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǷȘȐȔȍȘFRQYHUWBLPDJHS\
ɏɏſƀś
ɑɑɑ řŞʳʴɑɑɑ
ʰ ſƀ
ŜſƀɤȖȯȣȢȟȡȳșȦȫȦșȡȜșȜțȣȔȠȳȦȜ
ɏɏſřʰƀś
ɑɑɑ ʳʴřʳʴɑɑɑ
ʰ ſƀ
ś
ʰŜɤȥȢȩȤȔȡȳșȦȢȤȜȗȜȡȔȟȰȡȯȝȨȢȤȠȔȦ
ŜſřƀɤțȔȣȜȥȯȖȔșȦȖȣȔȠȳȦȰ
Ŝſƀ
ɏſřʰƀś
ɑɑɑʳʴ ʳʴɑɑɑ
ʰɏɏſƀ
ɏɏſřƀ
ɏɏſƀś
ɑɑɑ ʳʴɑɑɑ
ʰ Ŝſƀ
ſɑɑřřŜƀ
ɏɏſƀ
ɏɏɏɏʰʰɑɏɏɏɏɑś
ŜƃɨśƄś
ʰɏɏſƀ
ſɑɑřſƀřƃśɨɥƄƀ
ſɑɑřɑɑřɑɑƀś
ɏʰ ɏſřƀ
ſɑɑřſɏƀřɏƃśɨɥƄƀ
ǫȓȈȊȈǼȈȑȓȣȐȒȈȚȈȓȖȋȐ
ǷȖșȒȖȓȤȒț ȖȉȢȍȒȚ %\WHV,2 ȊȍȌȍȚ șȍȉȧ ȒȈȒ ȜȈȑȓ Ȋȣ ȔȖȎȍȚȍ ȊȣȏȣȊȈȚȤ Ȍȓȧ ȕȍȋȖ
ȜțȕȒȞȐȐVHHN UHDG ȐZULWH ȚȈȒȎȍȒȈȒȐȌȓȧȖȉȣȟȕȖȋȖȜȈȑȓȈǭșȓȐȊȣȊȣȏȖ
ȊȍȚȍȜțȕȒȞȐȦVHHN ȈȏȈȚȍȔȜțȕȒȞȐȦUHDG ȚȖȗȖȓțȟȐȚȍȚȖȓȤȒȖȉȈȑȚȣȒȖȚȖȘȣȍ
ȕȈȝȖȌȧȚșȧȔȍȎȌțȚȍȒțȡȍȑȗȖȏȐȞȐȍȑȜȈȑȓȈȐȍȋȖȒȖȕȞȖȔǼțȕȒȞȐȧJHWYDOXH ȊȍȘȕȍȚ
ȊșȍȉȈȑȚȣȖȉȢȍȒȚȈ%\WHV,2
ǿȐȚȈȑȚȍȌȈȓȍȍ
Следующая глава будет чуточку сложнее. В ней мы рассмотрим конкурентность
(способы выполнения нескольких операций одновременно) и процессы (запущен-
ные программы).
ǻȗȘȈȎȕȍȕȐȧ
14.1. Выведите на экран список всех файлов из текущего каталога.
14.2. Выведите на экран список всех файлов из родительского каталога.
14.3. Присвойте строку is a test of the переменной ɨ
и запишите эту переменную в файл с именем Ŝ.
14.4. Откройте файл Ŝ и считайте его содержимое в строку ɩ. Будут ли
одинаковыми строки ɨ и ɩ?
ƋƓƈƊƈ
ǬȈȕȕȣȍȊȖȊȘȍȔȍȕȐȗȘȖȞȍșșȣ
ȐȒȖȕȒțȘȍȕȚȕȖșȚȤ
Эта глава, а также две последующие — более сложные, чем остальные. Сейчас мы
рассмотрим данные во времени (последовательный и конкурентный доступ на од-
ном компьютере), в главе 16 поговорим о данных в коробке (хранение и извлечение
данных с помощью особых файлов и баз данных), а в главе 17 — о данных в про-
странстве (сети).
ǷȘȖȋȘȈȔȔȣȐȗȘȖȞȍșșȣ
Когда вы запускаете отдельную программу, ваша операционная система создает один
процесс, который использует системные ресурсы (центральный процессор, память,
место на диске) и структуры данных в ядре операционной системы (файлы и сетевые
соединения, статистику использования и т. д.). Процесс изолирован от других про-
цессов — он не может видеть, что делают другие процессы, или мешать им.
Операционная система отслеживает все запущенные процессы, выделяя каждому
из них немного времени и затем переключаясь на другие, для того чтобы справедли-
во распределять работу и реагировать на действия пользователя. Вы можете увидеть
состояние своих процессов с помощью графического интерфейса, такого как Mac’s
Activity Monitor в OS X, диспетчера задач в Windows или команды top в Linux.
Вы также можете получить доступ к данным процесса ваших собственных
программ. Модуль стандартной библиотеки os предоставляет общий способ до-
ступа к определенной системной информации. Например, следующие функции
получают идентификатор процесса и текущую рабочую папку запущенного ин-
терпретатора Python:
ʴʴʴ
ʴʴʴŜſƀ
ɮɭɥɬɨ
ʴʴʴŜ ſƀ
ɐŵŵ ɐ
ǫȓȈȊȈǬȈȕȕȣȍȊȖȊȘȍȔȍȕȐȗȘȖȞȍșșȣȐȒȖȕȒțȘȍȕȚȕȖșȚȤ
ǹȖȏȌȈȍȔȗȘȖȞȍșșșȗȖȔȖȡȤȦȔȖȌțȓȧVXESURFHVV
Все программы, с которыми вы сталкивались до этого момента, представляли
собой отдельные процессы. Запускать и останавливать другие существующие
в Python программы можно, используя модуль из стандартной библио-
теки. Если вы хотите просто запустить другую программу в оболочке и получить
результат ее работы (как стандартный отчет, так и отчет об ошибках), используйте
функцию ſƀ. В этом примере мы получим результат работы программы
системы Unix:
ʴʴʴ
ʴʴʴʰ Ŝſɐɐƀ
ʴʴʴ
ɐɪɥɩɩśɬɫśɪɮɩɥɨɫɐ
Вам нужно использовать ʰ, чтобы распознать команду Ş, разбив
ее на отдельные строки и, возможно, развернув любые символы подстановки, такие
как * (в нашем примере мы их не использовали).
Второй метод создает список аргументов, поэтому нет необходимости вызывать
оболочку:
ʴʴʴʰ Ŝ ſƃɐɐřɐŞɐƄƀ
ɩɨɥɫśɫɨśɬɰɩɥɨɫ
ǹȖȏȌȈȍȔȗȘȖȞȍșș
șȗȖȔȖȡȤȦȔȖȌțȓȧPXOWLSURFHVVLQJ
Запустить функцию Python как отдельный процесс или даже создать несколько
независимых процессов можно с помощью модуля . Рассмотрим
короткий и простой пример 15.1. Сохраните его под именем Ŝ, а затем запустите,
введя команду python Ŝ:
ǷȘȐȔȍȘPSS\
ſƀś
ſɑ ʩśʩɑʩſŜſƀřƀƀ
ɏɏɏɏʰʰɑɏɏɏɏɑś
ſɑ ɐɑƀ
ſɫƀś
ʰ Ŝ ſʰɏř
ʰſɑ ɐ ʩɑʩřƀƀ
Ŝſƀ
ǫȓȈȊȈǬȈȕȕȣȍȊȖȊȘȍȔȍȕȐȗȘȖȞȍșșȣȐȒȖȕȒțȘȍȕȚȕȖșȚȤ
Функция ſƀ вызвала новый процесс и запустила в нем функцию ɏſƀ.
Поскольку мы делали это в цикле с четырьмя итерациями, сгенерировалось четыре
новых процесса, которые выполнили ɏſƀ и завершились.
У модуля есть много возможностей. Он прекрасно подходит для
тех случаев, когда в целях экономии времени нужно распределить какие-то задачи
между несколькими процессами: это может быть, например, загрузка веб-страницы,
изменение размера изображений или что-то другое. В модуле содержатся способы
постановки задач в очередь, включения взаимодействия между процессами и ожи-
дания завершения всех процессов.
В разделе «Конкурентность» на с. 308 содержится более подробная информация.
ǻȉȐȊȈȍȔȗȘȖȞȍșșȐșȗȖȓȤȏțȧȜțȕȒȞȐȦWHUPLQDWH
Если вы создали один или несколько процессов, а теперь по какой-то причине
хотите их завершить (возможно, они зависли в цикле или же вам стало скучно,
а может, просто захотелось побыть жестоким правителем), используйте функцию
ſƀ. В примере 15.2 процесс должен досчитать до миллиона, замирая по-
сле каждого шага на секунду и выводя раздражающее сообщение. Однако у нашей
основной программы заканчивается терпение, и она сбивает его с орбиты:
ǷȘȐȔȍȘPSS\
ſƀś
ſɑ ɐʩř ʩɑʩſřŜſƀƀƀ
ſƀś
ſƀ
ʰɨ
ʰɨɥɥɥɥɥɥ
ſřƀś
ſɑɎʩʩŜ Šɑʩſřƀƀ
Ŝſɨƀ
ɏɏɏɏʰʰɑɏɏɏɏɑś
ſɑɑƀ
ʰ Ŝ ſʰřʰſɑɑřƀƀ
Ŝſƀ
Ŝſɬƀ
Ŝſƀ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǷȖȓțȟȈȍȔșȐșȚȍȔȕțȦȐȕȜȖȘȔȈȞȐȦ
șȗȖȔȖȡȤȦȔȖȌțȓȧRV
Стандартный пакет os предоставляет подробную информацию о вашей системе
и позволяет управлять некоторыми функциями, запуская скрипт, написанный на
Python, от лица привилегированного пользователя (например, администратора).
Помимо функций файлов и каталогов, которые мы рассмотрели в главе 14, в нем
есть такие информационные функции (они запускаются на iMac):
ʴʴʴ
ʴʴʴŜſƀ
Ŝɏſʰɐɐř
ʰɐ Ŝ ɐř
ʰɐɨɯŜɬŜɥɐř
ʰɐɨɯŜɬŜɥśɨɨɩɥśɫɥśɪɩɩɥɨɰŚ
śŞɫɰɥɪŜɩɬɨŜɪɌɪŵɏɯɭɏɭɫɐř
ʰɐɯɭɏɭɫɐƀ
ʴʴʴŜſƀ
ſɨŜɮɰɫɰɩɨɯɮɬřɨŜɰɪɨɨɬɩɪɫɪɮɬřɩŜɩɬɯɮɯɰɥɭɩɬƀ
ʴʴʴŜ ɏ ſƀ
ɫ
ǷȖȓțȟȈȍȔȐȕȜȖȘȔȈȞȐȦȖȗȘȖȞȍșșȈȝ
șȗȖȔȖȡȤȦȔȖȌțȓȧSVXWLO
Сторонний пакет psutil (KWWSVJLWKXEFRPJLDPSDRORSVXWLO) также предоставляет инфор-
мацию о системе и процессах для ОС Linux, Unix, macOS, и Windows.
Нетрудно догадаться, как он устанавливается:
ɛpip install psutil
ǫȓȈȊȈǬȈȕȕȣȍȊȖȊȘȍȔȍȕȐȗȘȖȞȍșșȣȐȒȖȕȒțȘȍȕȚȕȖșȚȤ
ǨȊȚȖȔȈȚȐȏȈȞȐȧȒȖȔȈȕȌ
Вы часто выполняете команды из оболочки (вводя их вручную или запуская скрип-
ты оболочки). Однако в Python имеется несколько качественных сторонних инстру-
ментов для управления запуском. Связанная с этим тема — очереди задач — рассма-
тривается в подразделе «Очереди» на с. 309.
,QYRNH
Первая версия инструмента позволяет вам определить локальные и удален-
ные (сетевые) задачи в коде Python. Разработчик разбил этот пакет на ɩ (для
удаленных задач) и (для локальных задач).
Вы можете установить с помощью следующей команды:
ɛpip install invoke
ǷȘȐȔȍȘWDVNVS\
ɒ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ſ ƀś
ʰŜſƀ
ɏʰŜ ſŜ ſƀƀ
ſɑ ɑřƀ
ǬȘțȋȐȍȊșȗȖȔȖȋȈȚȍȓȤȕȣȍȔȍȚȖȌȣȌȓȧȒȖȔȈȕȌ
Следующие пакеты немного похожи на , но в определенных ситуациях лучшее
решение может предложить один из таких пакетов:
click (KWWSVFOLFNSDOOHWVSURMHFWVFRPHQ[);
doit (KWWSVS\GRLWRUJ);
sh (KWWSDPRIIDWJLWKXELRVK);
delegator (KWWSVJLWKXEFRPDPLWWGHOHJDWRUS\);
pypeln (KWWSVFJDUFLDHJLWKXELRS\SHOQ).
DzȖȕȒțȘȍȕȚȕȖșȚȤ
Официальный сайт Python рассматривает тему конкурентности в целом и с точки
зрения стандартной библиотеки (KWWSELWO\FRQFXUOLE). На страницах сайта содержит-
ся множество ссылок на различные пакеты и приемы, а я в этой главе остановлюсь
на самых полезных пакетах.
ǫȓȈȊȈǬȈȕȕȣȍȊȖȊȘȍȔȍȕȐȗȘȖȞȍșșȣȐȒȖȕȒțȘȍȕȚȕȖșȚȤ
ǶȟȍȘȍȌȐ
Очередь похожа на список: элементы добавляются с одного ее конца и удаляются
с другого. Часто такой принцип называют FIFO (first in, first out — «первым пришел,
первым ушел»).
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǷȘȖȞȍșșȣ
Реализовать очередь можно разными способами. Для одного компьютера модуль
стандартной библиотеки (с которым вы ранее уже встречались)
содержит функцию . Смоделируем ситуацию только с одним мойщиком по-
суды и несколькими сушильщиками (кто-то позже отложит посуду в сторону)
и создадим промежуточную очередь ɏ. Назовем эту программу Ŝ
(пример 15.4).
ǫȓȈȊȈǬȈȕȕȣȍȊȖȊȘȍȔȍȕȐȗȘȖȞȍșșȣȐȒȖȕȒțȘȍȕȚȕȖșȚȤ
ǷȘȐȔȍȘGLVKHVS\
ſřƀś
ś
ſɐɐřřɐɐƀ
Ŝſƀ
ſƀś
ś
ʰŜſƀ
ſɐɐřřɐɐƀ
Ŝɏſƀ
ɏʰŜ ſƀ
ɏ ʰŜ ſʰřʰſɏřƀƀ
ɏ Ŝʰ
ɏ Ŝſƀ
ʰƃɐɐřɐɐřɐɐřɐɐƄ
ſřɏƀ
ɏŜſƀ
ǷȖȚȖȒȐ
Поток запускается внутри процесса и имеет доступ ко всему, что находится в про-
цессе, — это можно сравнить с раздвоением личности. Модуль
имеет «кузена» по имени , который использует потоки вместо процессов
(на самом деле модуль был разработан позже своего собрата,
основанного на процессах). Переделаем наш пример с процессами для применения
потоков (пример 15.5).
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǷȘȐȔȍȘWKUHDGS\
ɏſƀś
ſƀ
ſƀś
ſɑʩśʩɑʩſŜ ɏſƀřƀƀ
ɏɏɏɏʰʰɑɏɏɏɏɑś
ſɑ ɐɑƀ
ſɫƀś
ʰŜſʰɏř
ʰſɑ ɐ ʩɑʩřƀƀ
Ŝſƀ
ǷȘȐȔȍȘWKUHDGBGLVKHVS\
ř
ſřɏƀś
ś
ſɑɑřƀ
Ŝſɬƀ
ɏŜſƀ
ſɏƀś
ś
ʰɏŜſƀ
ſɑɑřƀ
Ŝſɨɥƀ
ɏŜɏſƀ
ɏʰŜſƀ
ſɩƀś
ɏʰŜſʰřʰſɏřƀƀ
ɏŜſƀ
ʰƃɐɐřɐɐřɐɐřɐɐƄ
ſřɏƀ
ɏŜſƀ
ǫȓȈȊȈǬȈȕȕȣȍȊȖȊȘȍȔȍȕȐȗȘȖȞȍșșȣȐȒȖȕȒțȘȍȕȚȕȖșȚȤ
Ǫ3\WKRQȗȖȚȖȒȐȕȍțșȒȖȘȧȦȚȏȈȌȈȟȐșȊȧȏȈȕȕȣȍșȖȋȘȈȕȐȟȍȕȐȧȔȐȗȘȖȞȍșșȖȘȈȐȏȏȈ
ȖȌȕȖȑȌȍȚȈȓȐȘȍȈȓȐȏȈȞȐȐșȚȈȕȌȈȘȚȕȖȑșȐșȚȍȔȣ3\WKRQȒȖȚȖȘȈȧȕȈȏȣȊȈȍȚșȧ*OREDO
,QWHUSUHWHU/RFN *,/ ǶȕȈȗȘȍȌȕȈȏȕȈȟȍȕȈȌȓȧȚȖȋȖȟȚȖȉȣȐȏȉȍȎȈȚȤȗȖȚȖȒȖȊȣȝȗȘȖ
ȉȓȍȔȊȐȕȚȍȘȗȘȍȚȈȚȖȘȍ3\WKRQȐȌȍȑșȚȊȐȚȍȓȤȕȖȔȖȎȍȚȏȈȔȍȌȓȐȚȤȔȕȖȋȖȗȖȚȖȟȕțȦ
ȗȘȖȋȘȈȔȔțȗȖșȘȈȊȕȍȕȐȦșȖȌȕȖȗȖȚȖȟȕȖȑȐȓȐȌȈȎȍȔȕȖȋȖȗȘȖȞȍșșȖȘȕȖȑȊȍȘșȐȍȑ
&RQFXUUHQWIXWXUHV
Как вы только что видели, использование потоков или нескольких процессов тре-
бует отслеживания большого количества деталей. Модуль Ŝ был
добавлен в стандартную библиотеку в версии Python 3.2 для того, чтобы упростить
эту задачу. Он позволяет вам спроектировать асинхронный пул так называемых
работников с помощью потоков (с ограничением по вводу-выводу) и процессов
(с ограничением по ЦП). Вы получаете объект типа future, который позволяет от-
слеживать состояние заданий и собирать результаты работы.
В примере 15.7 вы видите тестовую программу, которую можно сохранить под
именем Ŝ. Функция-задача ſƀ спит в течение одной секунды (наш способ
симулировать бурную деятельность), вычисляет квадратный корень своего аргу-
мента и возвращает его. Программа принимает необязательный аргумент командной
строки — количество работников, которых следует задействовать (по умолчанию ŷɪ),
запускает заданное количество из пула потоков, затем из пула процессов, а затем вы-
водит на экран затраченное время. Список values содержит пять чисел, отправленных
функции ſƀ по одному с помощью работника-потока или работника-процесса.
ǷȘȐȔȍȘFIS\
ſƀś
Ŝſɨƀ
ǫȓȈȊȈǬȈȕȕȣȍȊȖȊȘȍȔȍȕȐȗȘȖȞȍșșȣȐȒȖȕȒțȘȍȕȚȕȖșȚȤ
ʰŜſſƀƀ
ɏſřƀś
ɨʰŜſƀ
Ŝ ſƀś
ʰŜſ řƀ
ɩʰŜſƀ
ɩŷɨ
ɏ ſřƀś
ɨʰŜſƀ
Ŝ ſƀś
ʰŜſ řƀ
ɩʰŜſƀ
ɩŷɨ
ſřƀś
ſɑƇƈƇſƀƈɑƀ
ɏ ʰɏſřƀ
ſɑƇɏ śŜɫƈ ɑƀ
ɏ ʰɏ ſřƀ
ſɑ Ƈɏ śŜɫƈ ɑƀ
ɏɏɏɏʰʰɐɏɏɏɏɐś
ʰſŜƃɨƄƀ
ʰſſɨřɭƀƀɤɨŜŜɬ
ſřƀ
Если мы задействуем трех работников, нам понадобятся два запуска, чтобы об-
работать все пять значений, поэтому пройдет всего две секунды.
В программе я проигнорировал реальные результаты (рассчитанные нами ква-
дратные корни) для того, чтобы сделать акцент на затраченном времени. Важно
отметить, что использование функции ſƀ для определения пула заставит нас
дожидаться выполнения действий всех работников перед тем, как возвращать
результаты. Если вы хотите получать каждый отдельный результат по завер-
шении работы, создайте еще одну тестовую программу (назовем ее ɩŜ ),
в которой каждый работник будет возвращать значения по мере их вычисления
(пример 15.8).
ǷȘȐȔȍȘFIS\
ſƀś
ʰŜſſƀƀ
ř
ɏſřƀś
Ŝ ſƀś
ʰƃŜſ řƀƄ
Ŝɏ ſƀś
Ŝſƀ
ɏ ſřƀś
Ŝ ſƀś
ʰƃŜſ řƀƄ
Ŝɏ ſƀś
Ŝſƀ
ſřƀś
ſɑƇƈƇſƀƈɑƀ
ſɑśɑƀ
řɏſřƀś
ſɐƇƈƇśŜɫƈɐƀ
ſɑ śɑƀ
řɏ ſřƀś
ſɐƇƈƇśŜɫƈɐƀ
ɏɏɏɏʰʰɐɏɏɏɏɐś
ʰɪ
ſŜƀʴɨś
ʰſŜƃɨƄƀ
ʰſſɨřɭƀƀɤɨŜŜɬ
ſřƀ
ǫȓȈȊȈǬȈȕȕȣȍȊȖȊȘȍȔȍȕȐȗȘȖȞȍșșȣȐȒȖȕȒțȘȍȕȚȕȖșȚȤ
ǯȍȓȍȕȣȍȗȖȚȖȒȐȐJHYHQW
Как вы уже видели, разработчики стремятся избежать медленных мест в програм-
мах, запуская их в отдельных потоках или процессах. Примером такого дизайна
является веб-сервер Apache.
Альтернативой является программирование, основанное на событиях (event-
based programming). Программа, основанная на событиях, запускает центральный
цикл обработки событий, раздает задачи и повторяет цикл. Так устроен веб-сервер
NGINX, работающий быстрее, чем Apache.
Библиотека gevent основана на событиях и позволяет достичь следующего: вы
пишете обычный императивный код, и волшебным образом его части превращаются
в сопрограммы. Они похожи на генераторы, которые могут взаимодействовать друг
с другом и отслеживать свое текущее состояние. Библиотека gevent модифицирует
многие стандартные объекты Python, такие как , для того чтобы использовать
их механизм вместо блокирования. Это не работает для кода надстроек Python, ко-
торый написан на С, например для некоторых драйверов баз данных.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǷȘȐȔȍȘJHYHQWBWHVWS\
ʰƃɐŜ Ŝ ɐřɐŜŜ ɐř
ɐŜŞŜ ɐƄ
ʰƃŜſŜ ŜřƀƄ
Ŝſřʰɬƀ
ś
ſŜƀ
В этом примере вы можете увидеть однострочный цикл for. Каждое имя хоста
по очереди передается в вызов ſƀ, но запустить их можно асинхронно
благодаря версии функции ſƀ из библиотеки gevent.
Запустите файл ɏŜ:
ɛpython gevent_test.py
ɭɭŜɭŜɫɫŜɫ
ɮɫŜɨɩɬŜɨɫɩŜɨɩɨ
ɮɯŜɨɪɭŜɨɩŜɬɥ
Таким образом, все обычные сокеты заменятся на сокеты gevent даже в стандарт-
ной библиотеке. Опять же это работает только для кода Python, но не для библиотек,
написанных на С.
Еще одна функция Ş даже больше модулей стандартной библио-
теки:
Ŝ ɏſƀ
ǷȘȐȔȍȘJHYHQWBPRQNH\S\
ŚŜ ɏſƀ
ʰƃɐŜ Ŝ ɐřɐŜŜ ɐř
ɐŜŞŜ ɐƄ
ʰƃŜſ ŜřƀƄ
Ŝſřʰɬƀ
ś
ſŜƀ
Запустите программу:
ɛpython gevent_monkey.py
ɭɭŜɭŜɫɫŜɫ
ɮɫŜɨɩɬŜɨɰɩŜɨɩɨ
ɮɯŜɨɪɭŜɨɩŜɬɥ
WZLVWHG
(KWWSWZLVWHGPDWUL[FRPWUDF) — это асинхронный фреймворк, управляемый
событиями, для работы с сетями. Вы подключаете функции к таким событиям, как
получение данных или закрытие соединения, и функции вызываются, когда событие
происходит. В данном случае речь идет о функциях обратного вызова. Если вы уже
писали код на языке JavaScript, это может показаться вам знакомым. По мере роста
приложения некоторым разработчикам бывает сложнее управлять кодом, основан-
ным на функциях обратного вызова.
Чтобы установить фреймворк, введите следующую команду:
$ pip install twisted
ǷȘȐȔȍȘNQRFNBVHUYHUS\
Ŝ ř
ǷȘȐȔȍȘNQRFNBFOLHQWS\
Ŝ ř
ſřƀś
Ŝſɑɐţɑƀś
ʰɑ ɑ
ŜŜſƀ
ǫȓȈȊȈǬȈȕȕȣȍȊȖȊȘȍȔȍȕȐȗȘȖȞȍșșȣȐȒȖȕȒțȘȍȕȚȕȖșȚȤ
ś
ŜŜ ſƀ
Ŝſƀ
ſƀś
ʰ ſƀ
Ŝ ſɑ ɑřɯɥɥɥřƀ
Ŝſƀ
ɏɏɏɏʰʰɐɏɏɏɏɐś
ſƀ
Вторым — клиент:
ɛpython knock_client.py
DV\QFLR
Библиотека была добавлена в версию Python 3.4. Она представляет собой
способ определения конкурентного кода с помощью новой функциональности,
предоставляемой ключевыми словами и await . Это очень обширная тема
с большим количеством деталей. Чтобы не перегружать эту главу, я переместил
рассмотрение библиотеки и связанных с ней тем в приложение В.
5HGLV
Приведенные ранее примеры кода для мытья посуды, где использовались про-
цессы или потоки, запускались на одной машине. Рассмотрим еще один подход
к очередям, которые могут запускаться на одной машине или во всей сети. Иногда
даже для нескольких процессов и/или потоков одной машины бывает недоста-
точно. Вы можете воспринимать этот подраздел как мостик между конкурентным
использованием одного блока (компьютера) и конкурентным использованием не-
скольких блоков.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
Для запуска примеров из этого раздела вам понадобятся сервер Redis и его мо-
дуль для Python. Чтобы узнать, как их скачать, обратитесь к подразделу «Redis» на
с. 256. В этой главе Redis используется как база данных. Здесь же мы рассмотрим
его возможности для работы с конкурентностью.
Создать очередь можно с помощью списка Redis. Сервер Redis работает на одной
машине, на которой могут быть запущены и клиенты. Возможно также, что никакие
клиенты на ней не запускаются, а остальные машины получают доступ к серверу
по сети. В любом случае клиент общается с сервером с помощью протокола TCP.
Один или несколько клиентов-провайдеров помещают сообщения в конец списка.
Один или несколько клиентов-работников наблюдают за списком и используют
операцию «блокирующее выталкивание» (blocking pop). Если список пуст, то все
они просто тратят время впустую. Как только сообщение появляется, его получает
первый ожидающий работник.
Как и в предыдущих, основанных на процессах и потоках примерах, код файла
ɏŜ генерирует последовательность посуды (пример 15.13).
ǷȘȐȔȍȘUHGLVBZDVKHUS\
ʰŜſƀ
ſɐɐƀ
ʰƃɐɐřɐɐřɐɐřɐɐƄ
ś
ʰŜ ſɐŞɯɐƀ
Ŝſɐɐřƀ
ſɐɐřƀ
Ŝſɐɐřɐɐƀ
ſɐɐƀ
ǷȘȐȔȍȘUHGLVBGU\HUS\
ʰŜſƀ
ſɐɐƀ
ś
ʰ Ŝſɐɐƀ
ś
ʰƃɨƄŜ ſɐŞɯɐƀ
ʰʰɐɐś
ſɐɐřƀ
ſɐɐƀ
ǫȓȈȊȈǬȈȕȕȣȍȊȖȊȘȍȔȍȕȐȗȘȖȞȍșșȣȐȒȖȕȒțȘȍȕȚȕȖșȚȤ
Этот код ожидает сообщения, в котором первым токеном будет слово ,
и выводит сообщение о каждой высушенной тарелке. Подчиняясь сообщению quit,
он завершает цикл.
Запустите сначала сушильщика, а затем мойщика. Использование символа ĺ
в конце команды ставит первую программу в фоновый режим: она продолжает
выполняться, но больше не принимает команды с клавиатуры. Это работает для
операционных систем Linux, OS X и Windows, однако вы можете получить разные
результаты в следующей строке. В нашем случае (OS X) этим результатом является
некоторая информация о фоновом процессе сушильщика. Далее мы запускаем про-
цесс мойщика как обычно (на переднем плане). Вы увидите смешанную выходную
информацию двух процессов:
ɛpython redis_dryer.py &
ƃɩƄɯɨɭɰɨ
ɛpython redis_washer.py
ƃɩƄʫɏŜ
ǷȘȐȔȍȘUHGLVBGU\HUS\
ſƀś
ʰŜſƀ
ʰŜſƀ
ʰɩɥ
ſɐ ʩɐʩƀ
ś
ʰ Ŝſɐɐřƀ
ś
ʰƃɨƄŜ ſɐŞɯɐƀ
ʰʰɐɐś
ſɐʩśʩɐʩſřƀƀ
ŜſɥŜɨƀ
ſɐ ʩɐʩƀ
ʰɪ
ſƀś
ʰ Ŝ ſʰƀ
Ŝſƀ
ǷȖȔȐȔȖȖȟȍȘȍȌȍȑ
С увеличением числа работающих элементов растет вероятность сбоев в работе на-
шего конвейера. Хватит ли нам работников, если нужно будет вымыть посуду после
банкета? А что, если сушильщики напьются до чертиков? А если забьется раковина?
Ох уж эти проблемы!
Как же с ними справиться? К счастью, есть некоторые приемы.
Запустить и забыть. Просто передавайте обработанные объекты дальше и не за-
ботьтесь о последствиях, даже если там никого нет. Этот подход похож на сбра-
сывание посуды на пол.
Запрос — ответ. Мойщик получает подтверждение от сушильщика, а сушиль-
щик — от того, кто откладывает посуду в сторону. Все это выполняется для
каждой тарелки.
Регулирование нагрузки. Этот прием указывает самому быстрому работнику при-
тормозить, если один из работников, стоящих после него, не поспевает за ним.
В реальных системах вам нужно внимательно следить за тем, чтобы все работни-
ки успевали за графиком, в противном случае вы услышите звук бьющейся посуды.
Вы можете добавлять в список ожидания новые задачи, а какой-то процесс будет
доставать из этого списка последнее сообщение и помещать его в список обработки.
Обработанное сообщение будет удалено из списка обработки и добавлено в список
завершенных задач. Это позволит вам узнать, какие задачи не были выполнены
или затрачивают слишком много времени. Вы можете сделать это самостоятельно
с помощью Redis или использовать систему, которую кто-то другой уже написал
и протестировал. Некоторые основанные на Python пакеты для работы с очередями
(часть из них используют Redis) позволяют удобно управлять процессом:
celery (KWWSZZZFHOHU\SURMHFWRUJ ) может выполнять распределенные задачи
как синхронно, так и асинхронно, используя рассмотренные нами методы —
, gevent и др.;
rq (KWWSS\WKRQUTRUJ) — это библиотека Python для очередей задач, также осно-
ванная на Redis.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǿȐȚȈȑȚȍȌȈȓȍȍ
В этой главе мы пропустили данные сквозь процессы. В следующей главе вы уви-
дите, как сохранять и получать данные, используя разные форматы файлов и баз
данных.
ǻȗȘȈȎȕȍȕȐȧ
15.1. Используйте модуль , чтобы создать три отдельных процес-
са. Заставьте каждый из них подождать случайное количество секунд между
нулем и единицей, вывести текущее время, а затем завершить работу.
ƋƓƈƊƈ
ǬȈȕȕȣȍȊȒȖȘȖȉȒȍȕȈȌȍȎȕȣȍ
ȝȘȈȕȐȓȐȡȈ
ǷȓȖșȒȐȍȚȍȒșȚȖȊȣȍȜȈȑȓȣ
Самый простой пример постоянного хранилища — это старый добрый файл, кото-
рый иногда называют еще плоским файлом. Он хорошо работает в том случае, когда
у данных очень простая структура и вы полностью записываете их на диск или счи-
тываете с него. Такой подход годится для простых текстовых данных.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǺȍȒșȚȖȊȣȍȜȈȑȓȣȌȖȗȖȓȕȍȕȕȣȍȗȘȖȉȍȓȈȔȐ
В этом формате каждое поле записи имеет фиксированную длину и при необхо-
димости дополняется до требуемой длины (как правило, пробелами) так, чтобы
все записи имели одинаковый размер. Программист может использовать функцию
ſƀ для перемещения по файлу, для записи или только для чтения необходимых
записей и полей.
ǹȚȘțȒȚțȘȐȘȖȊȈȕȕȣȍȚȍȒșȚȖȊȣȍȜȈȑȓȣ
Для простых текстовых файлов единственным уровнем организации является
строка. Но иногда вам может понадобиться более структурированный файл, чтобы
сохранить данные из программы для дальнейшего использования или отправить их
другой программе.
Существует множество форматов, и у каждого есть свои особенности.
Разделитель (separator или delimiter) — такие символы, как табуляция (ɐɎɐ),
запятая (ɐřɐ ), вертикальная черточка (ɐŶɐ ). Это пример CSV — формата со
значениями, разделенными запятой.
Символы ɐʳɐ и ɐʴɐ в окружении тегов. Примеры включают в себя XML и HTML.
Знаки препинания. Примером является JavaScript Object Notation (JSON).
Выделение пробелами. Примером является YAML (аббревиатура расшифровы-
вается как YAML Ain’t Markup Language — «YAML — не язык разметки»).
Другие файлы, например конфигурационные.
Каждый из этих форматов структурированных файлов может быть считан и за-
писан с помощью как минимум одного модуля Python.
&69
Файлы с разделителями часто используются в качестве формата обмена данными
для электронных таблиц и баз данных. Вы можете считать файл CSV вручную, по
одной строке за раз, разделяя каждую строку на поля, расставляя запятые и добавляя
результат в структуру данных, такую как список или словарь. Но лучшим решением
будет использовать стандартный модуль , поскольку парсинг этих файлов может
оказаться сложнее, чем вы думаете. Ознакомьтесь с важными характеристиками
файлов CSV, о которых нужно помнить:
некоторые имеют альтернативные разделители вместо запятой: самыми по-
пулярными являются ɐŶɐ и ɐɎɐ;
некоторые имеют escape-последовательности. Если символ-разделитель встре-
чается внутри поля, все поле может быть окружено кавычками или же ему будет
предшествовать escape-последовательность;
ǫȓȈȊȈǬȈȕȕȣȍȊȒȖȘȖȉȒȍȕȈȌȍȎȕȣȍȝȘȈȕȐȓȐȡȈ
ʴʴʴſƀ
ƃ ſƃſɐɐřɐ ɐƀřſɐɐřɐɐƀƄƀř
ſƃſɐɐřɐɐƀřſɐɐřɐɐƀƄƀř
ſƃſɐɐřɐɐƀřſɐɐřɐɐƀƄƀř
ſƃſɐɐřɐ ɐƀřſɐɐřɐ ɐƀƄƀř
ſƃſɐɐřɐɐƀřſɐɐřɐɐƀƄƀƄ
ǷȘȐȔȍȘYLOODLQVFVY
ř
ř
ř
ř
ř
ř
;0/
Файлы с разделителями отображают только два измерения: ряды (строки) и столбцы
(поля внутри строк). Если вы хотите обмениваться структурами данных между про-
граммами, вам нужен способ кодирования иерархий, последовательностей, множеств
и других структур в виде текста.
XML является самым известным форматом разметки, который можно применять
в этом случае. Для разделения данных он использует теги, как показано в следую-
щем примере (файл Ŝ):
ʳţʰɑɨŜɥɑţʴ
ʳʴ
ʳʰɑɮŞɨɨɑʴ
ʳ ʰɑɛɭŜɥɥɑʴʳŵʴ
ʳ ʰɑɛɫŜɥɥɑʴ ʳŵʴ
ʳŵʴ
ʳ ʰɑɨɨŞɪɑʴ
ʳ ʰɑɛɬŜɥɥɑʴʳŵʴ
ʳŵ ʴ
ʳʰɑɪŞɨɥɑʴ
ʳ ʰɑɯŜɥɥɑʴʳŵʴ
ʳŵʴ
ʳŵʴ
Для каждого элемента вложенных списков tag — это строка тега, а attrib — это
словарь его атрибутов. Библиотека имеет множество других способов
поиска данных, организованных в формате XML, модификации этих данных и даже
записи XML-файлов. Все детали изложены в документации библиотеки
(KWWSELWO\HOHPHQWWUHH).
Среди других библиотек Python для работы с XML можно отметить следующие:
Ŝ . The Document Object Model (DOM) (знакомая разработчикам на
JavaScript) представляет веб-документы в виде иерархических структур. Этот
модуль загружает XML-файл в память целиком и позволяет получать доступ ко
всем его частям;
Ŝ. Simple API for XML, или SAX, разбирает XML на ходу, поэтому не за-
гружает в память сразу весь документ. Она может быть хорошим выбором, если
нужно обработать очень большие потоки XML.
ǫȓȈȊȈǬȈȕȕȣȍȊȒȖȘȖȉȒȍȕȈȌȍȎȕȣȍȝȘȈȕȐȓȐȡȈ
ǷȘȐȔȍȟȈȕȐȍȖȉȍȏȖȗȈșȕȖșȚȐ;0/
Вы можете использовать любой формат, описанный в этой главе, чтобы сохранять
объекты в файлы и снова их читать. Однако при этом существует вероятность полу-
чить проблемы с безопасностью.
Например, в следующем фрагменте XML-файла со страницы «Википедии» об
атаках billion laughs (KWWSVHQZLNLSHGLDRUJZLNL%LOOLRQBODXJKVBDWWDFN) (это разновидность
атаки «отказ в обслуживании») определяется десять вложенных сущностей, каждая
из которых расширяет более низкий уровень в десять раз, порождая в сумме один
миллиард сущностей:
ʳţʰɑɨŜɥɑţʴ
ʳŠƃ
ʳŠ ɑɑʴ
ʳŠ ɨɑĺŚĺŚĺŚĺŚĺŚĺŚĺŚĺŚĺŚĺŚɑʴ
ʳŠ ɩɑĺɨŚĺɨŚĺɨŚĺɨŚĺɨŚĺɨŚĺɨŚĺɨŚĺɨŚĺɨŚɑʴ
ʳŠ ɪɑĺɩŚĺɩŚĺɩŚĺɩŚĺɩŚĺɩŚĺɩŚĺɩŚĺɩŚĺɩŚɑʴ
ʳŠ ɫɑĺɪŚĺɪŚĺɪŚĺɪŚĺɪŚĺɪŚĺɪŚĺɪŚĺɪŚĺɪŚɑʴ
ʳŠ ɬɑĺɫŚĺɫŚĺɫŚĺɫŚĺɫŚĺɫŚĺɫŚĺɫŚĺɫŚĺɫŚɑʴ
ʳŠ ɭɑĺɬŚĺɬŚĺɬŚĺɬŚĺɬŚĺɬŚĺɬŚĺɬŚĺɬŚĺɬŚɑʴ
ʳŠ ɮɑĺɭŚĺɭŚĺɭŚĺɭŚĺɭŚĺɭŚĺɭŚĺɭŚĺɭŚĺɭŚɑʴ
ʳŠ ɯɑĺɮŚĺɮŚĺɮŚĺɮŚĺɮŚĺɮŚĺɮŚĺɮŚĺɮŚĺɮŚɑʴ
ʳŠ ɰɑĺɯŚĺɯŚĺɯŚĺɯŚĺɯŚĺɯŚĺɯŚĺɯŚĺɯŚĺɯŚɑʴ
Ƅʴ
ʳʴĺɰŚʳŵʴ
+70/
Огромные объемы данных сохраняются в формате гипертекстового языка размет-
ки — Hypertext Markup Language (HTML). Это основной формат документов в Ин-
тернете. Проблема заключается в том, что значительная часть этих документов не со-
ответствует правилам формата HTML, что затрудняет анализ. Кроме того, большая
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
-621
JavaScript Object Notation (JSON) (KWWSZZZMVRQRUJ) стал очень популярным
форматом обмена данными, вышедшим за пределы языка JavaScript. Формат JSON
является частью языка JavaScript и часто содержит легальный с точки зрения
Python синтаксис. Он прекрасно подходит Python, что делает его хорошим выбором
для обмена данными между программами. Вы увидите множество примеров JSON
для веб-разработки в главе 18.
В отличие от XML, для которого написано множество модулей, для JSON су-
ществует всего один модуль с простым именем . Эта программа кодирует (вы-
гружает) данные в строку JSON и декодирует (загружает) строку JSON обратно.
В следующем примере мы создадим структуру данных, содержащую данные из
более раннего примера XML:
ʴʴʴʰɎ
ŜŜŜƇ
ŜŜŜɑɑśƇ
ŜŜŜɑɑśɑɮŞɨɨɑř
ŜŜŜɑɑśƇ
ŜŜŜɑɑśɑɛɭŜɥɥɑř
ŜŜŜɑ ɑśɑɛɫŜɥɥɑ
ŜŜŜƈ
ŜŜŜƈř
ŜŜŜɑ ɑśƇ
ŜŜŜɑɑśɑɨɨŞɪɑř
ŜŜŜɑɑśƇ
ŜŜŜɑɑśɑɛɬŜɥɥɑ
ŜŜŜƈ
ŜŜŜƈř
ŜŜŜɑɑśƇ
ŜŜŜɑɑśɑɪŞɨɥɑř
ŜŜŜɑɑśƇ
ŜŜŜɑɑśɑɛɯŜɥɥɑ
ŜŜŜƈ
ŜŜŜƈ
ŜŜŜƈ
Ŝ
Это может случиться, поскольку стандарт JSON не определяет типы даты или
времени — он ожидает, что вы укажете ему, как с ними работать. Вы можете преоб-
разовать формат в то, что JSON понимает, например в строку или значение
времени (см. главу 13):
ʴʴʴɏʰſƀ
ʴʴʴŜſɏƀ
ɐɑɩɥɨɪŞɥɩŞɩɩɥɪśɫɰśɩɮŜɫɯɪɪɪɭɑɐ
ʴʴʴ
ʴʴʴɏ ʰſſŜſƀƀƀ
ʴʴʴŜſɏ ƀ
ɐɨɪɭɨɬɩɭɬɭɮɐ
ǷȘȐȘȈȉȖȚȍș-621ȐȌȘțȋȐȔȐȜȖȘȔȈȚȈȔȐșȚȘțȒȚțȘȐȘȖȊȈȕȕȖȋȖȚȍȒșȚȈȊȣȔȖȎȍȚȍ
ȏȈȋȘțȏȐȚȤȜȈȑȓȊȗȈȔȧȚȤȐȘȈȏȔȍșȚȐȚȤȍȋȖȊșȚȘțȒȚțȘȍȌȈȕȕȣȝȕȍȏȕȈȧȖșȈȔȐȝ
șȚȘțȒȚțȘȈȝȏȈȘȈȕȍȍǯȈȚȍȔȊȣȔȖȎȍȚȍȗȘȖȑȚȐșȤȗȖșȚȘțȒȚțȘȈȔȐșȗȖȓȤȏțȧȜțȕȒȞȐȦ
LVLQVWDQFH ȐȔȍȚȖȌȣșȖȖȚȊȍȚșȚȊțȦȡȐȍȚȐȗțȟȚȖȉȣȗȘȖȊȍȘȐȚȤȏȕȈȟȍȕȐȧșȚȘțȒȚțȘ
ǵȈȗȘȐȔȍȘȍșȓȐȖȌȐȕȐȏȥȓȍȔȍȕȚȖȊȧȊȓȧȍȚșȧșȓȖȊȈȘȍȔȊȣȔȖȎȍȚȍȐȏȊȓȍȟȤȍȋȖșȖ
ȌȍȘȎȐȔȖȍșȗȖȔȖȡȤȦȜțȕȒȞȐȑNH\V YDOXHV ȐLWHPV
После того как вы сделали это сложным способом, сообщу вам, что существует
более простой способ преобразовать объекты типа в JSON:
ʴʴʴ
ʴʴʴ
ʴʴʴʰŜŜ ſƀ
ʴʴʴŜſřʰƀ
ɐɑɩɥɨɰŞɥɫŞɨɮɩɨśɬɫśɫɪŜɭɨɮɪɪɮɑɐ
<$0/
Как и JSON, YAML (KWWSZZZ\DPORUJ) имеет ключи и значения, но обрабатывает
большее количество типов данных, включая дату и время. Стандартная библиотека
Python не содержит модулей, работающих с YAML, поэтому вам нужно установить
стороннюю библиотеку (KWWSS\\DPORUJZLNL3\<$0/). Функция ſƀ преоб-
разует строку в формате YAML к данным Python, а функция ſƀ предназначена
для противоположного действия.
Следующий YAML-файл, Ŝ, содержит информацию о канадском
поэте Джеймсе Макинтайре и два его стихотворения:
ś
ś
ś
ś
śɨɯɩɯŞɥɬŞɩɬ
śɨɰɥɭŞɥɪŞɪɨ
ś
ś
śƃ řƄ
ś
śśŵŵŜŜŵŵɪɭɥɭɯŵɪɭɥɭɯŞŵɪɭɥɭɯŞŜ
ś
Şśɐɐ
śŶ
ř ř
Ŝ
Şśɐɐ
śŶ
ř
ř
ř
ř
Ŝ
3\<$0/ȔȖȎȍȚȏȈȋȘțȎȈȚȤȖȉȢȍȒȚȣ3\WKRQȐȏșȚȘȖȒȈȥȚȖȖȗȈșȕȖǰșȗȖȓȤȏțȑȚȍȔȍȚȖȌ
VDIHBORDG ȊȔȍșȚȖ ȔȍȚȖȌȈ ORDG ȍșȓȐ ȐȔȗȖȘȚȐȘțȍȚȍ ȌȈȕȕȣȍ Ȋ ȜȖȘȔȈȚȍ <$0/
ȒȖȚȖȘȣȔȕȍȌȖȊȍȘȧȍȚȍǨȓțȟȠȍȊșȍȋȌȈȐșȗȖȓȤȏțȑȚȍȔȍȚȖȌVDIHBORDG ǷȘȖȟȚȐȚȍ
șȚȈȚȤȦ ǵȍȌȈ ǩȈȚȟȍȓȌȍȘȈ :DU LV SHDFH KWWSQHGEDWFKHOGHUFRPEORJ
ZDUBLVBSHDFHKWPO ȟȚȖȉȣțȏȕȈȚȤȖȚȖȔȒȈȒȕȍȏȈȡȐȡȍȕȕȈȧȏȈȋȘțȏȒȈ<$0/șȒȖȔ
ȗȘȖȔȍȚȐȘȖȊȈȓȈȗȓȈȚȜȖȘȔț5XE\RQ5DLOV
7DEOLE
Теперь, когда вы прочитали все предыдущие разделы, я расскажу вам, что существу-
ет сторонний пакет, который позволяет импортировать, экспортировать и изменять
табличные данные в форматах CSV, JSON или YAML1, а также данные в Microsoft
Excel, Pandas DataFrame и некоторые другие. Вы можете установить его при-
вычным способом (pip install tablib), а также заглянуть в документацию (KWWS
GRFVS\WKRQWDEOLERUJHQPDVWHU).
3DQGDV
Сейчас самое время познакомиться с Pandas (KWWSVSDQGDVS\GDWDRUJ) — библиотекой
Python для структурированных данных. Это отличный инструмент для решения
реальных проблем с данными. Она позволяет:
читать и записывать данные во множестве текстовых и бинарных форматов,
таких как:
y текст, поля которого разделены запятыми (CSV), символами табуляции (TSV)
или другими символами;
y текст фиксированной длины;
y Excel;
y JSON;
y таблицы HTML;
y SQL;
y HDF5;
y и др. (KWWSVSDQGDVS\GDWDRUJSDQGDVGRFVVWDEOHXVHUBJXLGHLRKWPO);
1
Однако на данный момент XML не поддерживается.
ǫȓȈȊȈǬȈȕȕȣȍȊȒȖȘȖȉȒȍȕȈȌȍȎȕȣȍȝȘȈȕȐȓȐȡȈ
ǷȘȐȔȍȘǿȐȚȈȍȔȌȈȕȕȣȍȊȜȖȘȔȈȚȍ&69șȗȖȔȖȡȤȦ3DQGDV
ʴʴʴ
ʴʴʴ
ʴʴʴʰŜɏ ſɐŜ ɐƀ
ʴʴʴſƀ
ɥ
ɨ
ɩ
ɪ
ɫ
Переменная имеет тип : у этого типа данных возможностей боль-
ше, чем у простого словаря Python. Он особенно полезен для обработки большого
количества чисел с помощью NumPy, а также для подготовки данных для машинного
обучения.
Обратитесь к разделам Getting Started (KWWSVSDQGDVS\GDWDRUJSDQGDVGRFVVWDEOH
JHWWLQJBVWDUWHGLQGH[KWPO) документации Pandas, чтобы узнать подробнее о ее осо-
бенностях, и к разделу 10 Minutes to Pandas (KWWSVSDQGDVS\GDWDRUJSDQGDVGRFVVWDEOH
JHWWLQJBVWDUWHGPLQKWPO) для того, чтобы увидеть рабочие примеры.
Воспользуемся Pandas для того, чтобы создать небольшой календарь — список,
содержащий первый день первых трех месяцев 2019 года:
ʴʴʴ
ʴʴʴʰŜɏſɐɩɥɨɰŞɥɨŞɥɨɐřʰɪřʰɐɐƀ
ʴʴʴ
ſƃɐɩɥɨɰŞɥɨŞɥɨɐřɐɩɥɨɰŞɥɩŞɥɨɐřɐɩɥɨɰŞɥɪŞɥɨɐƄř
ʰɐɭɫƃƄɐřʰɐɐƀ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
DzȖȕȜȐȋțȘȈȞȐȖȕȕȣȍȜȈȑȓȣ
Большинство программ предлагают различные параметры или настройки. Дина-
мические настройки могут быть переданы как аргументы программы, но долговре-
менные настройки должны где-то храниться. Соблазн на скорую руку определить
собственный формат конфигурационного файла очень силен, но вы должны устоять.
Как правило, это бывает и неточно, и не так уж быстро. Вам нужно обслуживать
как программу-писатель, так и программу-читатель (которая иногда называется
парсером). Существуют хорошие альтернативы, которые вы можете добавить в свою
программу, включая те, что были показаны в предыдущих подразделах.
Здесь мы используем стандартный модуль , который обрабатывает
файлы с расширением Ŝ, характерные для Windows. Такие файлы имеют разделы
с определениями ȞȟȲȫ ʰ țȡȔȫșȡȜș. Так выглядит минимальный файл Ŝ :
ƃƄ
ʰ
ƃ Ƅ
ʰ
ƃƄ
ʰŵŵ
ɤś
ʰʩſƀŵ
ǩȐȕȈȘȕȣȍȜȈȑȓȣ
Некоторые файловые форматы были разработаны для хранения определенных
структур данных и не являются ни реляционными базами данных, ни базами данных
NoSQL. В следующих подразделах рассказывается о некоторых из них.
Заполненные пробелами бинарные файлы и управление памятью. Такие файлы
похожи на заполненные пробелами текстовые файлы, но содержимое может быть
бинарным, а в качестве заполнителя может использоваться байт Ɏɥɥ. Каждая за-
пись имеет фиксированный размер, как и каждое поле внутри записи. Это позволяет
легче искать нужные записи и поля с помощью функции ſƀ. Каждая операция
с данными выполняется вручную, поэтому такой подход должен применяться только
в очень низкоуровневых (близких к «железу») ситуациях.
Данные в таком формате могут быть размещены в ОЗУ с помощью стандартной
библиотеки . Взгляните на примеры (KWWSVS\PRWZFRPPPDS) и стандартную
документацию (KWWSVGRFVS\WKRQRUJOLEUDU\PPDSKWPO).
ȅȓȍȒȚȘȖȕȕȣȍȚȈȉȓȐȞȣ
Электронные таблицы, в частности Microsoft Excel, — это широко распространенный
бинарный формат данных. Если вы можете сохранить свою таблицу в CSV-файл, то
можете считать его с помощью стандартного модуля , который был описан ранее.
Это распространяется на бинарный файл : для его считывания и записи можно
использовать стороннюю библиотеку (KWWSVS\SLRUJSURMHFW[OUG) или tablib (она
упоминалась ранее в подразделе «Tablib» на с. 338).
+')
HDF5 (KWWSZZZKGIJURXSRUJZK\BKGI) — это бинарный формат данных, предназначен-
ный для хранения многомерных или иерархических числовых данных. Обычно он
используется в научных целях, где быстрый случайный доступ к крупным наборам
данных (от гигабайтов до терабайтов) является распространенным требованием.
Несмотря на то что HDF5 в некоторых случаях мог бы стать хорошей альтернативой
базам данных, по каким-то причинам этот формат практически неизвестен в современ-
ном мире. Он лучше всего подходит для приложений вида WORM (write once — read
many — «запиши однажды — считай много раз»), которые не нуждаются в защите от
конфликтующих записей. Вам могут быть полезными следующие модули:
ɬ — интерфейс низкого уровня с широкими возможностями. Прочтите его
документацию (KWWSZZZKS\RUJ) и код (KWWSVJLWKXEFRPKS\KS\);
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
7LOH'%
У формата HDF5 недавно появился последователь, который позволяет хранить
как плотные, так и разреженные массивы — TileDB (KWWSVWLOHGEFRP). Установите
интерфейс Python (KWWSVJLWKXEFRP7LOH'%,QF7LOH'%3\) (он включает в себя и саму
библиотеку TileDB), запустив команду pip install . Эта библиотека предна-
значена для работы с научными данными и приложениями.
ǸȍȓȧȞȐȖȕȕȣȍȉȈȏȣȌȈȕȕȣȝ
Реляционным базам данных всего около 40 лет, но в компьютерном мире они ис-
пользуются повсеместно. Вам практически наверняка придется поработать с ними.
В эти моменты вы сможете оценить следующие их преимущества.
Доступ к данным возможен для нескольких пользователей одновременно.
Действует защита от повреждения данных пользователями.
Существуют эффективные методы сохранения и считывания данных.
Данные определены схемами и имеют ограничения.
Объединения позволяют найти отношения между различными типами данных.
Декларативный (в противоположность императивному) язык запросов SQL
(Structured Query Language).
Такие базы данных называются реляционными, поскольку они показывают
отношения между различными типами данных в форме прямоугольных таблиц.
Например, в нашем более раннем примере меню есть отношение между каждым
элементом и его ценой.
Таблица представляет собой прямоугольную сетку столбцов (полей данных)
и строк (отдельных записей), похожую на электронную таблицу. Пересечение стро-
ки и столбца называется ячейкой. Чтобы создать таблицу, необходимо указать ее имя
и порядок, имена и типы ее столбцов. Каждая строка имеет одинаковые столбцы,
хотя столбец может быть определен так, чтобы в ячейках отсутствовали данные
ǫȓȈȊȈǬȈȕȕȣȍȊȒȖȘȖȉȒȍȕȈȌȍȎȕȣȍȝȘȈȕȐȓȐȡȈ
ǬȈșȓȖȊȖșȖȟȍȚȈȕȐȍ©ȉȈȏȈȌȈȕȕȣȝªȐșȗȖȓȤȏțȍȚșȧȊȘȈȏȕȣȝȏȕȈȟȍȕȐȧȝȕȈȏȣȊȈȍȚ
ȐșȍȘȊȍȘȐȝȘȈȕȐȓȐȡȍȚȈȉȓȐȞȐșȈȔȐȌȈȕȕȣȍǭșȓȐȊȈȔȕțȎȕȖȋȖȊȖȘȐȚȤȖȉȖȊșȍȝ
ȕȐȝ ȖȌȕȖȊȘȍȔȍȕȕȖ ȔȖȎȕȖ ȐșȗȖȓȤȏȖȊȈȚȤ ȚȍȘȔȐȕȣ ©șȍȘȊȍȘ ȉȈȏȣ ȌȈȕȕȣȝª ©ȉȈȏȈ
ȌȈȕȕȣȝªȐ©ȌȈȕȕȣȍª
64/
SQL не является API или протоколом. Это декларативный язык: вы говорите, что
вам нужно, а не как это сделать. SQL — универсальный язык реляционных баз дан-
ных. Запросы SQL являются текстовыми строками: клиент отсылает их серверу базы
данных, а тот определяет, что с ними делать дальше.
Существует несколько стандартов определения SQL, но все поставщики баз дан-
ных добавили свои собственные настройки и расширения, что привело к появлению
множества диалектов SQL. Если вы храните данные в реляционной базе данных,
SQL дает вам некоторую переносимость данных. Однако наличие диалектов и опе-
рационных различий может усложнить перенос данных в другую базу.
Есть две основные категории утверждений SQL.
DDL (Data Definition Language — язык определения данных). Обрабатывает
создание, удаление, ограничения и разрешения для таблиц, баз данных и поль-
зователей.
DML (Data Manipulation Language — язык манипулирования данными). Обраба-
тывает добавление данных, их выборку, обновление и удаление.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǷȖȟȍȔțȊșȍȗȐȠȍȚșȧǩǶdzȄȀǰǴǰǩǻDzǪǨǴǰ"ȇȏȣȒ64/ȕȍȏȈȊȐșȐȚȖȚȘȍȋȐșȚȘȈȕȖ
ȗȖȚȘȈȌȐȞȐȐ ȕȍșȗȘȈȠȐȊȈȑȚȍȔȍȕȧȗȖȟȍȔț ȒȓȦȟȍȊȣȍșȓȖȊȈǪȃDzǸǰDzǰǪǨȆǺǹȇ
ȟȚȖȉȣȐȝȔȖȎȕȖȉȣȓȖȖȚȓȐȟȐȚȤȖȚȐȔȍȕșȚȖȓȉȞȖȊ
'%$3,
Программный интерфейс приложения (Application Programming Interface, API) —
это набор функций, которые вы можете вызвать, чтобы получить доступ к какой-
либо услуге. DB-API (KWWSELWO\GEDSL) — это стандартный API в Python, предна-
значенный для получения доступа к реляционным базам данных. С его помощью
вы можете написать одну программу, которая работает с несколькими видами
реляционных баз данных, вместо того чтобы писать несколько программ для работы
с каждым видом баз данных по отдельности. Этот API похож на JDBC в Java или
dbi в Perl.
Рассмотрим его основные функции:
ſƀ — создание соединения с базой данных. Этот вызов может включать
в себя такие аргументы, как имя пользователя, пароль, адреса сервера и пр.;
ſƀ — создание объекта курсора, предназначенного для работы с запросами;
ſƀ и ſƀ — запуск одной или нескольких команд SQL;
ſƀ, ſƀ и ſƀ — получение результатов работы функции
ſƀ.
Модули базы данных в Python, которые будут рассмотрены в следующих подраз-
делах, соответствуют DB-API, но часто имеют некоторые расширения или разницу
в деталях.
64/LWH
SQLite (KWWSZZZVTOLWHRUJ) — это хорошая легкая реляционная база данных с от-
крытым исходным кодом. Она реализована как стандартная библиотека Python
и хранит базы данных в обычных файлах. Эти файлы можно переносить в другие
машины и операционные системы, что делает SQLite портативным решением для
простых приложений реляционных баз данных. У нее не так много возможностей,
как у MySQL или PostgreSQL, но она поддерживает SQL и позволяет нескольким
пользователям работать с ней одновременно. Браузеры, смартфоны и другие опера-
ционные системы используют SQLite как встроенную базу данных.
Работа начинается с вызова ſƀ для установки соединения с локальным
файлом базы данных, который вы хотите создать или использовать. Этот файл
эквивалентен похожей на каталог базе данных, которая хранит таблицы на других
серверах. С помощью специальной строки ɐśśɐ можно создать базу данных
только в памяти — это быстро и удобно для тестирования, но данные будут потеряны
при завершении программы или выключении компьютера.
Для следующего примера создадим базу данных Ŝ и таблицу ,
чтобы управлять нашим процветающим бизнесом по содержанию придорожного
контактного зоопарка. В таблице будут следующие столбцы:
— строка переменной длины, наш первичный ключ;
— целочисленное количество единиц используемого инвентаря для этого
животного;
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
Тройные кавычки в Python очень полезны при создании длинных строк, таких
как запросы SQL.
Теперь добавим в зоопарк несколько животных:
ʴʴʴ Ŝ ſɐ ſɑ ɑřɬřɥŜɥƀɐƀ
ʳɪŜ ɥɨɥɥɭɩɩɥʴ
ʴʴʴ Ŝ ſɐ ſɑɑřɩřɨɥɥɥŜɥƀɐƀ
ʳɪŜ ɥɨɥɥɭɩɩɥʴ
0\64/
MySQL (KWWSZZZP\VTOFRP) — очень популярная реляционная база данных с от-
крытым исходным кодом. В отличие от SQLite она является настоящим сервером,
поэтому клиенты могут получать к ней доступ с разных устройств всей сети.
В табл. 16.3 перечислены драйверы, которые вы можете использовать для того,
чтобы получить доступ к MySQL из Python. За более подробной информацией обо
всех драйверах MySQL для Python обратитесь к энциклопедии на Ŝ (KWWSV
ZLNLS\WKRQRUJPRLQ0\64/).
ǺȈȉȓȐȞȈǬȘȈȑȊȍȘȣ0\64/
3RVWJUH64/
PostgreSQL (KWWSZZZSRVWJUHVTORUJ) — полнофункциональная реляционная база
данных с открытым исходным кодом, гораздо более продвинутая, чем MySQL.
В табл. 16.4 показаны драйверы Python, которые можно использовать для того,
чтобы получить к ней доступ.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǺȈȉȓȐȞȈǬȘȈȑȊȍȘȣ3RVWJUH64/
64/$OFKHP\
SQL не для всех реляционных баз данных одинаков, а DB-API дает вам ограничен-
ный набор возможностей. Каждая база данных реализует определенный диалект,
отражая свои особенности и философию. Многие библиотеки пытаются тем или
иным способом компенсировать эти различия. Самая популярная библиотека для
работы с разными базами данных — SQLAlchemy (KWWSZZZVTODOFKHP\RUJ).
Она не является стандартной, тем не менее широко известна и многими исполь-
зуется. Вы можете установить ее в свою систему с помощью следующей команды:
$ pip install sqlalchemy
ǬȐȈȓȍȒȚ ǬȘȈȑȊȍȘ
Для того чтобы определить таблицу , вместо SQL начнем использовать язык
выражений:
ʴʴʴʰŜſƀ
ʴʴʴʰŜſɐɐřř
ŜŜŜŜſɐ ɐřŜřɏʰƀř
ŜŜŜŜſɐ ɐřŜ ƀř
ŜŜŜŜſɐɐřŜ ƀ
ŜŜŜƀ
ʴʴʴŜ ɏſ ƀ
Далее создадим оператор . Функция Ŝ ſƀ делает выборку всего,
что содержится в таблице, представленной объектом , как это сделала бы ин-
струкция * в простом SQL:
ʴʴʴʰ Ŝ ſŜ ſƀƀ
Добавить данные в таблицу можно путем создания объектов Python. ORM управ-
ляет данными изнутри:
ʴʴʴʰſɐ ɐřɨɥřɥŜɥƀ
ʴʴʴ ʰſɐɐřɩřɨɥɥɥŜɥƀ
ʴʴʴʰſɐɐřɨřɩɥɥɥŜɥƀ
ʴʴʴ
ʳſ řɨɥřɥŜɥƀʴ
ǫȓȈȊȈǬȈȕȕȣȍȊȒȖȘȖȉȒȍȕȈȌȍȎȕȣȍȝȘȈȕȐȓȐȡȈ
Далее мы указываем ORM перенести нас в страну SQL. Создаем сессию для
коммуникации с базой данных:
ʴʴʴ Ŝ
ʴʴʴʰſʰ ƀ
ʴʴʴʰſƀ
Внутри сессии записываем три созданных нами объекта в базу данных. Функция
ſƀ добавляет один объект, а функция ɏſƀ добавляет список:
ʴʴʴŜſƀ
ʴʴʴŜɏſƃ řƄƀ
Целью этого статьи было показать, что такое ORM и как оно работает на высо-
ком уровне. Автор SQLAlchemy написал полное руководство к нему (KWWSELWO\
REMUHOWXWRULDO). После прочтения статьи определитесь, какой из следующих уровней
наиболее подходит для ваших нужд:
простой DB-API, показанный ранее в этой главе в подразделе «SQLite»;
движок SQLAlchemy;
язык выражений SQLAlchemy;
SQLAlchemy ORM.
Естественным выбором выглядит ORM, что позволит избежать всех сложностей
SQL. Стоит ли им пользоваться? Некоторые люди считают, что ORM следует из-
бегать, а другие полагают, что критика незаслуженна. Кто бы ни был прав, ORM —
это абстракция, а все абстракции в какой-то момент разрушаются — они допускают
утечки памяти (KWWSVZZZMRHORQVRIWZDUHFRPWKHODZRIOHDN\DEVWUDFWLRQV).
Если ORM не делает того, что вам нужно, вы должны понять, как он работает,
а затем разобраться, как это исправить с помощью SQL. Перефразируя интернет-
мем: «Столкнувшись с проблемой, некоторые люди думают: “Точно, обращусь-ка
я к ORM!” Теперь у них две проблемы».
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǬȘțȋȐȍȗȈȒȍȚȣȌȓȧȘȈȉȖȚȣșȉȈȏȈȔȐȌȈȕȕȣȝ
Если вы ищете инструменты Python, которые позволяют работать со многими ба-
зами данных и имеют больше возможностей, чем простой DB-API, но меньше, чем
SQLAlchemy, рассмотрите следующие варианты:
(KWWSVGDWDVHWUHDGWKHGRFVLRHQODWHVW). Его девиз — «Базы данных для
ленивых». Он создан на основе SQLAlchemy и предоставляет простой ORM для
хранилищ SQL, JSON и CSV;
(KWWSVS\SLRUJSURMHFWUHFRUGV). Его разработчики считают, что это «SQL
для людей». Он поддерживает только запросы SQL, используя SQLAlchemy для
обработки проблем с диалектами SQL, пулами соединений и т. д., и интегриру-
ется с tablib (упоминается в подразделе «Tablib» на с. 338), что позволяет экс-
портировать данные в форматах CSV, JSON и многих других.
ǽȘȈȕȐȓȐȡȈȌȈȕȕȣȝ1R64/
Реляционные таблицы имеют форму прямоугольника, но поступающие данные
могут иметь разную форму и их размещение требует больших усилий. Это похоже
на проблему квадратного колышка и круглой дырки.
Отдельные нереляционные базы данных позволяют более гибко определять
данные, работают с очень крупными наборами и поддерживают пользовательские
операции с данными. Такие базы данных называют NoSQL (раньше это означало
«не SQL», теперь же расшифровка звучит как «не только SQL»).
Простейшей вариацией баз данных NoSQL являются хранилища ключей-значений.
О некоторых из них, которые попали в рейтинг популярности (KWWSVGEHQJLQHVFRP
HQUDQNLQJNH\YDOXHVWRUH), поговорим в следующих подразделах.
ǹȍȔȍȑșȚȊȖGEP
Форматы существовали задолго до того, как появился NoSQL. Они представляют
собой простые хранилища, работающие по принципу «ключ — значение». Их часто
встраивают в приложения вроде браузеров, чтобы поддерживать различные на-
стройки. База данных dbm похожа на обычный словарь в следующих отношениях:
вы присваиваете значение ключу, и оно автоматически сохраняется в базе дан-
ных на диске;
вы можете получить ключ по его значению.
ǫȓȈȊȈǬȈȕȕȣȍȊȒȖȘȖȉȒȍȕȈȌȍȎȕȣȍȝȘȈȕȐȓȐȡȈ
Для того чтобы создать пары «ключ — значение», просто присвойте значение
ключу, как если бы вы работали со словарем:
ʴʴʴƃɐɐƄʰɐɐ
ʴʴʴƃɐ ɐƄʰɐɐ
ʴʴʴƃɐɐƄʰɐɐ
0HPFDFKHG
(KWWSPHPFDFKHGRUJ) — это быстрый сервер кэширования, располагаю-
щийся в памяти и работающий по принципу «ключ — значение». Часто его разме-
щают перед базой данных или используют для хранения данных сессии веб-сервера.
Вы можете загрузить версии для Linux, macOS (KWWSELWO\LQVWDOORV[) и Windows
(KWWSELWO\PHPFDFKHZLQ). Если хотите попробовать запустить примеры, показан-
ные в этом подразделе, вам понадобятся запущенный сервер и драйвер
Python.
Существует множество драйверов Python. Тот, что работает с Python 3, называ-
ется ɪŞ (KWWSVJLWKXEFRPHJXYHQS\WKRQPHPFDFKHG). Установить его
можно с помощью такой команды:
ɛpip install python-memcached
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
5HGLV
Redis — это сервер структур данных. Он работает с ключами и их значениями,
но значения имеют гораздо больше возможностей, чем в других хранилищах.
Как и в случае с memcached, все данные сервера Redis должны поместиться в па-
мять (хотя у нас имеется возможность сохранить все данные на диск). В отличие от
memcached Redis может делать следующее:
сохранять данные на диск для надежности в случае перезагрузки;
хранить старые данные;
предоставлять более сложные, по сравнению со строками, структуры данных.
Типы данных Redis близки к типам данных Python, и сервер Redis может быть
полезным посредником для обмена данными между приложениями. Мне это кажется
настолько важным, что я посвящу данной теме небольшой фрагмент книги.
Исходный код драйвера Python Ş и тесты находятся на GitHub (KWWSV
JLWKXEFRPDQG\PFFXUG\UHGLVS\), документация по нему находится по адресу KWWSELWO\
UHGLVS\GRFV. Драйвер устанавливается с помощью следующей команды:
ɛpip install redis
ǫȓȈȊȈǬȈȕȕȣȍȊȒȖȘȖȉȒȍȕȈȌȍȎȕȣȍȝȘȈȕȐȓȐȡȈ
Создадим простую строку (с ключом ɐ ɐ), целое число (с ключом ɐ ɐ)
и число с плавающей точкой (с ключом ɐɐ):
ʴʴʴ Ŝſɐ ɐřɐŠɐƀ
ʴʴʴ Ŝſɐ ɐřɩɫƀ
ʴʴʴ ŜſɐɐřɐɨɥɨŜɬɐƀ
Добавим элемент, указав смещение для него, с помощью метода ſƀ (список
уже должен существовать):
ʴʴʴ Ŝſɐɐřɩřɐɐƀ
Хеши. Хеши Redis похожи на словари в Python, но содержат только строки, по-
этому мы можем создать только одномерный словарь. Рассмотрим примеры, в ко-
торых создается и изменяется хеш с именем song.
Установим в хеше song значения полей и re одновременно с помощью мето-
да ſƀ:
ʴʴʴ ŜſɐɐřƇɐɐśɐɐřɐɐśɐɐƈƀ
ɨ
ʴʴʴ Ŝſɐɏɐƀ
Ƈɐɐƈ
списки лидеров;
списки вторичных индексов;
временные ряды, где отметки времени используются как счетчик.
И когда:
ʴʴʴ ŜſɐɐřɥřŞɨř ʰƀ
ƃſɐɐřɨɪɭɨɯɬɮɥɬɮŜɬɮɭɫɯɪƀřſɐɐřɨɪɭɨɯɬɮɪɬɮŜɬɮɭɫɯɪƀř
ſɐɐřɨɪɭɨɯɭɫɩɬɮŜɬɮɭɫɯɪƀřſɐɐřɨɪɭɨɰɫɪɫɬɮŜɬɮɭɫɯɪƀƄ
Кэши и истечение срока действия. У всех ключей Redis есть время жизни, или
дата истечения срока действия. По умолчанию этот срок длится вечно. Мы можем
использовать функцию ſƀ, чтобы указать Redis, как долго хранить заданный
ключ. Значением является количество секунд:
ʴʴʴ
ʴʴʴʰɐɐ
ʴʴʴ Ŝſřɐɐƀ
ʴʴʴ Ŝſřɬƀ
ʴʴʴ Ŝſƀ
ɬ
ʴʴʴ Ŝſƀ
ɐɐ
ʴʴʴŜſɭƀ
ʴʴʴ Ŝſƀ
ʴʴʴ
ǬȖȒțȔȍȕȚȖȖȘȐȍȕȚȐȘȖȊȈȕȕȣȍȉȈȏȣȌȈȕȕȣȝ
Документоориентированные базы данных — это базы данных формата NoSQL,
которые хранят данные с разными полями. В сравнении с реляционной таблицей
(прямоугольной формы, с одинаковыми столбцами для каждой строки) данные, хра-
нящиеся в этих таблицах, являются ragged — могут содержать разные поля (столбцы)
в каждой строке, а также могут иметь вложенные поля. Можно обрабатывать такие
данные с помощью словарей и списков или же сохранять их в файлах JSON. Для со-
хранения таких данных в реляционную таблицу нужно определить все возможные
столбцы и использовать значения null для отсутствующих данных.
ODM может расшифровываться как Object Data Manager или Object Document
Mapper. ODM является документоориентированным аналогом ORM — реляционных
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǩȈȏȈȌȈȕȕȣȝ 3\WKRQ$3,
Mongo ([Link] tools ([Link]
[Link])
DynamoDB ([Link] boto3 ([Link]
ru/dynamodb/) latest/developerguide/[Link])
CouchDB ([Link] couchdb ([Link]
latest/[Link])
3RVWJUH64/ȔȖȎȍȚȊȣȗȖȓȕȧȚȤȕȍȒȖȚȖȘȣȍȏȈȌȈȟȐȒȖȚȖȘȣȍȊȣȗȖȓȕȧȦȚȐȌȖȒțȔȍȕȚȖ
ȖȘȐȍȕȚȐȘȖȊȈȕȕȣȍȉȈȏȣȌȈȕȕȣȝǭȋȖȘȈșȠȐȘȍȕȐȧȗȖȏȊȖȓȧȦȚȐȏȉȍȎȈȚȤȖȗȘȍȌȍȓȍȕȕȣȝ
ȔȐȕțșȖȊȘȍȓȧȞȐȖȕȕȣȝȉȈȏȌȈȕȕȣȝȕȖșȖȝȘȈȕȧȦȚȗȘȐȥȚȖȔȚȈȒȐȍȖșȖȉȍȕȕȖșȚȐȒȈȒ
ȚȘȈȕȏȈȒȞȐȐȊȈȓȐȌȈȞȐȧȌȈȕȕȣȝȐȊȕȍȠȕȐȍȒȓȦȟȐ ȔȕȖȋȖȔȍȘȕȣȍȔȈșșȐȊȣ KWWSV
ZZZSRVWJUHVTORUJGRFVDUUD\VKWPO ȗȖȏȊȖȓȧȦȚȝȘȈȕȐȚȤȉȖȓȍȍȖȌȕȖȋȖȏȕȈȟȍȕȐȧ
ȊȧȟȍȑȒȍȚȈȉȓȐȞȣ MVRQE KWWSVZZZSRVWJUHVTORUJGRFVGDWDW\SHMVRQKWPO
ȗȖȏȊȖȓȧȍȚșȖȝȘȈȕȐȚȤȊȧȟȍȑȒȍȌȈȕȕȣȍȊȜȖȘȔȈȚȍ-621șȗȖȓȕȣȔȐȕȌȍȒșȐȘȖȊȈȕȐȍȔ
ȐȏȈȗȘȖșȈȔȐ
ǩȈȏȣȌȈȕȕȣȝȊȘȍȔȍȕȕȣȝȘȧȌȖȊ
Данные временных рядов могут быть собраны в фиксированные (например, метри-
ки производительности компьютера) или случайные интервалы времени. Это при-
вело к появлению множества методов их хранения (KWWSVGEHQJLQHVFRPHQUDQNLQJ
WLPHVHULHVGEPV). Методы, поддерживаемые Python, перечислены в табл. 16.7.
ǺȈȉȓȐȞȈǪȘȍȔȍȕȕȣȍȉȈȏȣȌȈȕȕȣȝ
ǩȈȏȈȌȈȕȕȣȝ 3\WKRQ$3,
InfluxDB ([Link] influx-client ([Link]
kdb+ ([Link] PyQ ([Link]
Prometheus ([Link] prometheus_client ([Link]
client_python/blob/master/[Link])
TimescaleDB ([Link] PostgreSQL-клиенты
OpenTSDB ([Link] potsdb ([Link]
PyStore ([Link] PyStore ([Link]
pystore)
ǫȓȈȊȈǬȈȕȕȣȍȊȒȖȘȖȉȒȍȕȈȌȍȎȕȣȍȝȘȈȕȐȓȐȡȈ
ǫȘȈȜȖȊȣȍȉȈȏȣȌȈȕȕȣȝ
Последний вид данных, для которых нужна собственная база данных, представляет
собой графы: узлы (данные), соединенные ребрами (отношениями). Отдельный
пользователь Twitter может быть узлом с ребрами, ведущими к другим пользовате-
лям, на которых подписан он или которые подписаны на него.
Графовые данные стали появляться чаще по мере роста соцсетей, где связи так же
важны, как и содержимое. Некоторые популярные (KWWSVGEHQJLQHVFRPHQUDQNLQJ
JUDSKGEPV) графовые базы данных приведены в табл. 16.8.
ǺȈȉȓȐȞȈǫȘȈȜȖȊȣȍȉȈȏȣȌȈȕȕȣȝ
ǩȈȏȈȌȈȕȕȣȝ 3\WKRQ$3,
ǬȘțȋȐȍșȍȘȊȍȘȣ1R64/
Серверы NoSQL, перечисленные здесь, могут работать с данными, объем которых
превышает объем доступной памяти, — многие из них требуют использования не-
скольких компьютеров. В табл. 16.9 показаны наиболее популярные серверы и их
библиотеки Python.
ǺȈȉȓȐȞȈǩȈȏȣȌȈȕȕȣȝ1R64/
ǩȈȏȈȌȈȕȕȣȝ 3\WKRQ$3,
ǷȖȓȕȖȚȍȒșȚȖȊȣȍȉȈȏȣȌȈȕȕȣȝ
Наконец, существует особая категория баз данных для полнотекстового поиска.
Они индексируют все, поэтому вы легко можете найти то стихотворение, в котором
говорится о ветряных мельницах и гигантских головках сыра. Популярные приме-
ры таких баз данных с открытым исходным кодом и их Python API представлены
в табл. 16.10.
ǺȈȉȓȐȞȈǷȖȓȕȖȚȍȒșȚȖȊȣȍȉȈȏȣȌȈȕȕȣȝ
ǹȈȑȚ 3\WKRQ$3,
Lucene ([Link] pylucene ([Link]
Solr ([Link] SolPython ([Link]
display/solr/SolPython)
ElasticSearch ([Link] elasticsearch ([Link]
en/master/)
Sphinx ([Link] sphinxapi ([Link]
source/browse/trunk/api/[Link])
Xapian ([Link] xappy ([Link]
Whoosh ([Link] Написан на Python, уже содержит API
whoosh/wiki/Home)
ǿȐȚȈȑȚȍȌȈȓȍȍ
В предыдущей главе рассматривался вопрос выполнения разных фрагментов кода за
разные промежутки времени (конкурентность). Следующая глава посвящена пере-
мещению данных в пространстве (сети) — его можно использовать для написания
конкурентного кода и для многого другого.
ǻȗȘȈȎȕȍȕȐȧ
16.1. Сохраните следующие несколько строк в файл Ŝ . Обратите внимание
на то, что, если поля разделены запятыми, вам нужно заключить в кавычки
поле, содержащее запятую:
ř
ř
řɑřĺɑ
16.4. Используйте модуль ɪ, чтобы создать базу данных SQLite Ŝ
и таблицу , содержащую следующие поля: title (текст), author (текст)
и year (целое число).
16.5. Считайте данные из файла Ŝ и добавьте их в таблицу .
16.6. Считайте и выведите на экран столбец title таблицы в алфавитном по-
рядке.
16.7. Считайте и выведите на экран все столбцы таблицы в порядке публикации.
16.8. Используйте модуль , чтобы подключиться к базе данных ɪ
Ŝ, которую вы создали в упражнении 16.4. Как и в упражнении 16.6,
считайте и выведите на экран столбец title таблицы в алфавитном по-
рядке.
16.9. Установите сервер Redis и библиотеку Python (с помощью команды pip
install ) на свой компьютер. Создайте хеш с именем test, содер-
жащий поля ſɨƀ и ſɐ ɐƀ. Выведите все поля хеша
test.
16.10. Увеличьте поле хеша test и выведите его на экран.
ƋƓƈƊƈ
ǬȈȕȕȣȍȊȗȘȖșȚȘȈȕșȚȊȍșȍȚȐ
Цитаты о времени1
7&3,3
Интернет основан на правилах, по которым создаются соединения, идет обмен
данными, закрываются соединения, обрабатывается истечение срока действия и т. д.
Эти правила называются протоколами, и они упорядочены в слои. Цель существо-
1
[Link]
ǫȓȈȊȈǬȈȕȕȣȍȊȗȘȖșȚȘȈȕșȚȊȍșȍȚȐ
Ваша локальная машина всегда будет иметь IP-адрес и имя ORFDOKRVW.
Вы можете встретить название для этого процесса — интерфейс обратной петли.
При подключении к Интернету у вашей машины также появится публичный IP.
Если же вы используете домашний компьютер, то он будет скрыт за оборудованием,
таким как кабельный модем или роутер. Вы можете запускать интернет-протоколы
даже между процессами на одной машине.
Большая часть Интернета, с которой мы будем взаимодействовать, — Всемир-
ная паутина, серверы баз данных и т. д. — основана на протоколе TCP, функцио-
нирующем поверх протокола IP, сокращенно — TCP/IP. Сначала рассмотрим
самые простые интернет-сервисы. Затем перейдем к общим шаблонам для работы
с сетями.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǹȖȒȍȚȣ
Если вы хотите узнать, как все работает, то этот подраздел для вас.
На самом низком уровне сетевого программирования используется сокет, по-
заимствованный из языка программирования C и операционной системы Unix.
Кодирование на уровне сокетов может быть утомительным. Вам будет гораздо
интереснее работать с чем-то наподобие ZeroMQ, однако не помешает узнать, что
лежит под этим уровнем. Например, сообщения о сокетах часто появляются при
возникновении ошибок в работе с сетями.
Напишем небольшой пример, где клиент и сервер будут обмениваться данными.
Клиент отправляет серверу строку, размещенную в датаграмме UDP, а сервер воз-
вращает пакет данных, содержащий строку. Серверу нужно слушать определенный
адрес и порт — они похожи на почтовое отделение и почтовый ящик. Клиент должен
знать эти два значения, чтобы доставить сообщение и получить ответ.
В следующем коде клиента и сервера элемент — это кортеж вида
(адрес, порт). Данный элемент является строкой, которая может быть именем или
IP-адресом. Когда ваши программы просто беседуют друг с другом на одной машине,
вы можете использовать имя ɐ ɐ или эквивалентный адрес ɐɨɩɮŜɥŜɥŜɨɐ.
Для начала отправим небольшой фрагмент данных из одного процесса в другой
и вернем немного данных отправителю. Первая программа — клиент, а вторая —
сервер. В каждой из них мы выведем на экран время и откроем сокет. Сервер будет
слушать подключения к своему сокету, а клиент — писать данные в свой сокет,
который передаст сообщение на сервер.
В примере 17.1 показана первая программа, ɏŜ.
ǷȘȐȔȍȘXGSBVHUYHUS\
ɏʰſɐ ɐřɭɮɯɰƀ
ɏʰɫɥɰɭ
ſɐɐřŜſƀƀ
ſɐ Ŝɐƀ
ʰ Ŝ ſ Ŝ ɏ ř Ŝɏ ƀ
Ŝſɏƀ
ſɐɐřŜſƀř řɐɐřƀ
Ŝſɐţɐř ƀ
Ŝ ſƀ
ǷȘȐȔȍȘXGSBFOLHQWS\
ɏʰſɐ ɐřɭɮɯɰƀ
ɏʰɫɥɰɭ
ſɐ ɐřŜſƀƀ
ʰ Ŝ ſ Ŝ ɏ ř Ŝɏ ƀ
Ŝſɐ Šɐřɏƀ
řʰ Ŝ ſɏƀ
ſɐɐřŜſƀřřɐɐřƀ
Ŝ ſƀ
Клиенту нужно было знать адрес и номер порта сервера, однако он не указал свой
номер порта, поэтому тот был автоматически присвоен системой — в данном случае
он был равен ɬɭɩɭɮ.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǷȖȗȘȖȚȖȒȖȓț8'3ȌȈȕȕȣȍȖȚȗȘȈȊȓȧȦȚșȧȕȍȉȖȓȤȠȐȔȐȜȘȈȋȔȍȕȚȈȔȐȅȚȖȚȗȘȖȚȖȒȖȓ
ȕȍȋȈȘȈȕȚȐȘțȍȚȌȖșȚȈȊȒȐǭșȓȐȊȣȖȚȗȘȈȊȐȚȍȕȍșȒȖȓȤȒȖșȖȖȉȡȍȕȐȑșȗȖȔȖȡȤȦ8'3
ȚȖȖȕȐȔȖȋțȚȗȘȐȑȚȐȊȕȍȗȘȈȊȐȓȤȕȖȔȗȖȘȧȌȒȍȐȓȐȊȖȖȉȡȍȕȍȗȖȧȊȐȚȤșȧȅȚȖȚȗȘȖ
ȚȖȒȖȓȉȣșȚȘȓȍȋȖȒȕȍșȖȏȌȈȍȚșȖȍȌȐȕȍȕȐȑȖȌȕȈȒȖȕȍȕȈȌȍȎȍȕǶȕȗȖȓȍȏȍȕȊȚȖȔ
șȓțȟȈȍȒȖȋȌȈȕțȎȕȖȖȚȗȘȈȊȐȚȤȗȈȒȍȚȣȉȣșȚȘȖȐȕȍșȚȘȈȠȕȣȐȝȗȖȚȍȘȐȒȖȚȖȘȣȍ
ȗȘȖȐșȝȖȌȧȚȊȘȍȔȧȖȚȊȘȍȔȍȕȐ²ȕȈȗȘȐȔȍȘȗȘȐȐșȗȖȓȤȏȖȊȈȕȐȐȚȍȝȕȖȓȖȋȐȐ9R,3
YRLFHRYHU,3
ǷȍȘȊȣȍȌȊȍȊȍȘșȐȐȊȍȉȗȘȖȚȖȒȖȓȈ+773ȉȣȓȐȖșȕȖȊȈȕȣȕȈ7&3ȕȖ+773ȖșȕȖȊȈȕȕȈ
ȗȘȖȚȖȒȖȓȍ48,& KWWSVRUHLOO\<-\P ȒȖȚȖȘȣȑȐșȗȖȓȤȏțȍȚ8'3ǷȖȥȚȖȔțȗȘȐȊȣȉȖȘȍ
ȔȍȎȌț8'3Ȑ7&3șȓȍȌțȍȚțȟȐȚȣȊȈȚȤȔȕȖȎȍșȚȊȖȜȈȒȚȖȘȖȊ
ǷȘȐȔȍȘWFSBFOLHQWS\
ʰſɐ ɐřɭɮɯɰƀ
ɏʰɨɥɥɥ
ſɐ ɐřŜſƀƀ
ʰ Ŝ ſ Ŝ ɏ ř Ŝɏƀ
Ŝ ſƀ
Ŝſɐ Šɐƀ
ʰ Ŝ ſɏƀ
ſɐɐřŜſƀřɐɐřƀ
Ŝ ſƀ
ǷȘȐȔȍȘWFSBVHUYHUS\
ʰſɐ ɐřɭɮɯɰƀ
ɏʰɨɥɥɥ
ſɐɐřŜſƀƀ
ſɐ Ŝɐƀ
ʰ Ŝ ſ Ŝ ɏ ř Ŝɏƀ
Ŝſƀ
Ŝſɬƀ
řʰŜ ſƀ
ʰ Ŝ ſɏƀ
ſɐɐřŜſƀř řɐɐřƀ
Ŝſɐţɐƀ
Ŝ ſƀ
Ŝ ſƀ
VFDS\
Иногда вам нужно погрузиться в поток данных, путешествующих по сети. Воз-
можно, вы хотите отладить веб-API или отследить некую проблему безопасности.
Библиотека и программа предоставляют предметно-ориентированный язык
для создания и анализа пакетов в Python. Работать с ней гораздо проще, чем писать
и отлаживать программы, написанные на языке С.
Стандартная команда для установки выглядит так: pip install . Докумен-
тация (KWWSVVFDS\UHDGWKHGRFVLR) этой библиотеки довольно обширна. Если вы ис-
пользуете такие инструменты, как или , для исследования проблем,
связанных с протоколом TCP, то вам следует обратить внимание на . Наконец,
не следует путать библиотеки и ; последняя рассмотрена в разделе «По-
иск и выборка данных» главы 18.
1HWFDW
Еще один инструмент для проверки сетей и портов — Netcat (KWWSVRUHLOO\.+),
название которого зачастую сокращают до . Рассмотрим пример соединения HTTP
с сайтом Google, где запросим базовую информацию о главной странице:
ɛ$ nc [Link] 80
HEAD / HTTP/1.1
ŵɨŜɨɩɥɥ
śřɩɮ ɩɥɨɰɩɨśɥɫśɥɩ
ŜŜŜ
ǷȈȚȚȍȘȕȣȌȓȧȘȈȉȖȚȣșșȍȚȧȔȐ
Сетевые приложения можно создать на основе некоторых простых паттернов.
Самым распространенным является «Запрос — ответ», также известный как
«Клиент — сервер». Работает синхронно: клиент ожидает ответа сервера. Вы ви-
дели множество примеров его использования в этой книге. Ваш браузер — это
также клиент, делающий HTTP-запрос веб-серверу, который возвращает ответ.
Еще один распространенный паттерн — «Разветвление на выходе»: вы отправля-
ете данные любому доступному работнику из пула процессов. Примером служит
веб-сервер, расположенный за балансировщиком нагрузки.
Противоположностью этого паттерна является «Разветвление на входе»: вы
принимаете данные из одного или нескольких источников. В качестве примера
можно привести регистратор, который принимает текстовые сообщения от не-
скольких процессов и записывает их в единый файл журнала.
Еще один паттерн похож на радио- или телепередачи, он называется «Публика-
ция — подписка» или pub — sub. В рамках этого паттерна публикатор рассылает
данные. В простой системе их получат все подписчики. Однако зачастую они
могут указать, что заинтересованы только в определенных типах данных (подоб-
ные типы часто называются темами), и публикатор будет отправлять лишь эту
информацию. Поэтому, в отличие от паттерна «Разветвление на входе», заданный
фрагмент данных может получить более чем один подписчик. Если на тему никто
не подписался, то данные будут проигнорированы.
Рассмотрим некоторые примеры использования паттерна «Запрос — ответ», а за-
тем и паттерна «Публикация — подписка».
ǷȈȚȚȍȘȕ©ǯȈȗȘȖș²ȖȚȊȍȚª
Этот паттерн самый распространенный. Вы запрашиваете данные о DNS, сети или
электронной почте у соответствующих серверов, и они либо возвращают ответ, либо
сообщают о проблеме.
Я только что показал, как выполнять простые запросы с помощью протоколов
UDP и TCP, но создать приложение для работы с сетями на уровне сокетов довольно
сложно. Посмотрим, сможет ли нам помочь ZeroMQ.
=HUR04
ZeroMQ — библиотека, а не сервер. Иногда называемые сокетами на стероидах, со-
кеты ZeroMQ делают то, чего вы вроде бы ожидаете от обычных сокетов:
происходит обмен сообщениями целиком;
выполняются повторные соединения при обрыве;
выполняется буферизация данных для их сохранения в том случае, когда отпра-
вители и получатели не синхронизированы.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǷȘȐȔȍȘ]PTBVHUYHUS\
ʰɐɨɩɮŜɥŜɥŜɨɐ
ʰɭɮɯɰ
ʰŜſƀ
ʰ Ŝ ſŜƀ
Ŝſɑ śŵŵʩśʩɑʩſřƀƀ
ś
ɤȢȚȜȘȔșȠȥȟșȘȧȲȭșȗȢțȔȣȤȢȥȔȞȟȜșȡȦȔ
ɏʰŜ ſƀ
ɏʰɏŜ ſɐŞɯɐƀ
ſɑ śʩɑʩɏƀ
ǫȓȈȊȈǬȈȕȕȣȍȊȗȘȖșȚȘȈȕșȚȊȍșȍȚȐ
ɏʰɑśʩɑʩɏ
ɏʰſɏřɐŞɯɐƀ
Ŝſɏƀ
ǷȘȐȔȍȘ]PTBFOLHQWS\
ʰɐɨɩɮŜɥŜɥŜɨɐ
ʰɭɮɯɰ
ʰŜſƀ
ʰ Ŝ ſŜƀ
Ŝ ſɑ śŵŵʩśʩɑʩſřƀƀ
ſɨřɭƀś
ɏʰɑɤʩɑʩ
ɏʰɏŜ ſɐŞɯɐƀ
Ŝſɏƀ
ɏʰ Ŝ ſƀ
ɏʰɏŜ ſɐŞɯɐƀ
ſɑʩř ʩɑʩſɏřɏƀƀ
ƃɩƄɪɬɭ
ſ ƀś
ɑɏŜɑřɮřʳʴ
Ŝſɑ śŵŵʩśʩɑʩſřƀƀ
ɑ ŜɑřɫɫɫřŜ Ŝ Ŝ Ŝ Ŝ
ſŵ ŵ ŵ Ŝ śɫɥɮɭƀ
ɑ ŜɑřɩɨřŜ Ŝ Ŝ Ŝɏ ɏ
ſŵ ŵ ŵ Ŝ śɭɥɪɩƀ
ŜŜś
ǸȐșǰșȗȖȓȤȏȖȊȈȕȐȍȗȖșȘȍȌȕȐȒȈȌȓȧșȖȍȌȐȕȍȕȐȧ
șȕȍșȒȖȓȤȒȐȔȐȒȓȐȍȕȚȈȔȐȐșȍȘȊȍȘȈȔȐ
ǬȘțȋȐȍȐȕșȚȘțȔȍȕȚȣȖȉȔȍȕȈșȖȖȉȡȍȕȐȧȔȐ
ZeroMQ определенно не единственная библиотека, отвечающая за передачу сообще-
ний, которая поддерживается Python. Передача сообщений — это одна из самых
популярных идей в работе с сетями, и Python старается соответствовать другим
языкам программирования:
проект Apache, чей веб-сервер вы увидите в подразделе «Apache» на с. 411, также
поддерживает проект ActiveMQ (KWWSVDFWLYHPTDSDFKHRUJ), который включает
несколько интерфейсов Python, использующих простой текстовый протокол
STOMP (KWWSVRUHLOO\DKB0);
популярна также библиотека RabbitMQ (KWWSZZZUDEELWPTFRP), вы можете
прочесть онлайн-руководство для нее (KWWSELWO\UDEELWPTWXW);
NATS (KWWSZZZQDWVLR) — это быстрая система обмена сообщениями, написан-
ная на Go.
ǷȈȚȚȍȘȕ©ǷțȉȓȐȒȈȞȐȧ²ȗȖȌȗȐșȒȈª
Данный паттерн не является очередью — это широковещательная система. Один (или
более) процесс публикует сообщения. Каждый процесс-подписчик указывает, со-
общения какого типа он хочет получать. Копия каждого сообщения отправляется
каждому подписчику, указавшему данный тип. Поэтому то или иное сообщение мо-
жет быть обработано однажды, более чем однажды или ни разу. Каждый публикатор
просто выполняет рассылку и не знает, кто — если таковые есть — его слушает.
5HGLV
Вы уже видели Redis в главе 16, он использовался как сервер структур данных.
Однако он также содержит систему публикации — подписки. Публикатор создает
сообщения, имеющие тему и значение, а подписчики указывают, какие темы хотят
получать.
В примере 17.7 показан публикатор ɏŜ.
ǷȘȐȔȍȘUHGLVBSXES\
ʰŜſƀ
ʰƃɐɐřɐɐřɐ ɐřɐɐƄ
ʰƃɐɐřɐɐřɐŞŞɐřɐɐƄ
ſɨɥƀś
ʰŜ ſ ƀ
ʰŜ ſƀ
ſɐśʩʩɐʩſ řƀƀ
Ŝſ řƀ
ǫȓȈȊȈǬȈȕȕȣȍȊȗȘȖșȚȘȈȕșȚȊȍșȍȚȐ
ǷȘȐȔȍȘUHGLVBVXES\
ʰŜſƀ
=HUR04
У ZeroMQ нет центрального сервера, поэтому каждый публикатор пишет всем под-
писчикам. Перепишем наш пример для ZeroMQ. Публикатор ɏŜ выглядит
так, как показано в примере 17.9.
ǷȘȐȔȍȘ]PTBSXES\
ʰɐƋɐ
ʰɭɮɯɰ
ʰŜſƀ
ʰ Ŝ ſŜƀ
Ŝſɐ śŵŵʩśʩɐʩſřƀƀ
ʰƃɐɐřɐɐřɐ ɐřɐɐƄ
ʰƃɐɐřɐɐřɐŞŞɐřɐɐƄ
Ŝſɨƀ
ſɨɥƀś
ʰŜ ſ ƀ
ɏʰ Ŝ ſɐŞɯɐƀ
ʰŜ ſƀ
ɏʰŜ ſɐŞɯɐƀ
ſɐśʩʩɐʩſ řƀƀ
Ŝɏſƃ ɏřɏƄƀ
Обратите внимание на то, как в этом коде используется кодировка UTF-8 для
темы и строки значения.
Файл подписчика называется ɏŜ (пример 17.10).
ǷȘȐȔȍȘ]PTBVXES\
ʰɐɨɩɮŜɥŜɥŜɨɐ
ʰɭɮɯɰ
ʰŜſƀ
ʰ Ŝ ſŜƀ
Ŝ ſɐ śŵŵʩśʩɐʩſřƀƀ
ʰƃɐ ɐřɐɐƄ
ś
Ŝ ſŜ ř Ŝ ſɐŞɯɐƀƀ
ś
ɏřɏʰŜ ɏſƀ
ǫȓȈȊȈǬȈȕȕȣȍȊȗȘȖșȚȘȈȕșȚȊȍșȍȚȐ
ȅȚȖȔȖȎȍȚȗȖȒȈȏȈȚȤșȧȕȍȔȕȖȋȖȏȈȗțȚȈȕȕȣȔȕȖȍșȓȐȊȣȝȖȚȐȚȍȗȖȌȗȐșȣȊȈȚȤșȧȕȈ
ȊșȍȚȍȔȣȚȖȕțȎȕȖȗȖȌȗȐșȈȚȤșȧȕȈȗțșȚțȦșȚȘȖȒțȉȈȑȚȖȊ ǵȍșȌȍȓȈȊȥȚȖȋȖȊȣ
ȕȍȗȖȓțȟȐȚȍȕȐȟȍȋȖ
ǬȘțȋȐȍȐȕșȚȘțȔȍȕȚȣ©ǷțȉȓȐȒȈȞȐȐ²ȗȖȌȗȐșȒȐª
Вам могут пригодиться следующие ссылки Python.
RabbitMQ — широко известный посредник сообщений, Python API для него на-
зывается . Обратитесь к тематической документации (KWWSSLNDUHDGWKHGRFVRUJ)
и руководству по «Публикации — подписке» (KWWSELWO\SXEVXEWXW).
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǰȕȚȍȘȕȍȚșȍȘȊȐșȣ
Python имеет широкий набор инструментов для работы с сетями. В следующих
подразделах мы рассмотрим способы автоматизации наиболее популярных ин-
тернет-сервисов. В сети доступна полная официальная документация (KWWSELWO\
S\LQWHUQHW).
ǬȖȔȍȕȕȈȧșȐșȚȍȔȈȐȔȍȕ
Компьютеры имеют числовые IP-адреса, например [Link], однако имена
мы запоминаем лучше, чем числа. Доменная система имен (Domain Name System,
DNS) — критически важный интернет-сервис, который преобразует IP-адреса
в имена и обратно с помощью распределенной базы данных. Когда вы используете
браузер и внезапно видите сообщение наподобие looking up host, вы, возможно,
потеряли соединение с Интернетом, и первым предположением должен стать
сбой DNS.
Некоторые функции DNS можно найти в низкоуровневом модуле . Функ-
ция ſƀ возвращает IP-адрес доменного имени, а ее расширенная версия
gethɏſƀ возвращает имя, список альтернативных имен и список адресов:
ʴʴʴ
ʴʴʴ ŜſɐŜ Ŝ ɐƀ
ɐɭɭŜɭŜɫɫŜɫɐ
ʴʴʴ ŜɏſɐŜ Ŝ ɐƀ
ſɐ Ŝ ɐřƃɐŜ Ŝ ɐƄřƃɐɭɭŜɭŜɫɫŜɫɐƄƀ
Предыдущий вызов вернул два кортежа: первый — для UDP, а второй — для TCP
(6 в строке ɩ, ɨ, 6 — это значение для TCP).
Вы можете запросить информацию лишь для TCP или только для UDP:
ʴʴʴ ŜſɐŜ Ŝ ɐřɯɥř Ŝ ɏ ř
Ŝɏƀ
ƃſɩřɨřɭřɐɐřſɐɭɭŜɭŜɫɫŜɫɐřɯɥƀƀƄ
ǫȓȈȊȈǬȈȕȕȣȍȊȗȘȖșȚȘȈȕșȚȊȍșȍȚȐ
ǴȖȌțȓȐ3\WKRQȌȓȧȘȈȉȖȚȣ
șȥȓȍȒȚȘȖȕȕȖȑȗȖȟȚȖȑ
Стандартная библиотека Python содержит следующие модули для работы с элек-
тронной почтой:
(KWWSVRUHLOO\BN)9) — для отправки сообщений по электронной почте
с помощью простого протокола передачи почты (Simple Mail Transfer Protocol,
SMTP);
(KWWSVRUHLOO\:9*E() — для создания и анализа сообщений электронной
почты;
poplib (KWWSVRUHLOO\[L-7) — для чтения электронной почты с помощью протокола
почтового отделения, версия 3 (Post Office Protocol 3, POP3);
(KWWSVRUHLOO\ZHQJR) — для чтения электронной почты с помощью про-
токола доступа к электронной почте (Internet Message Access Protocol, IMAP).
Если вы хотите написать собственный SMTP-сервер на Python, то попробуйте
(KWWSVRUHLOO\-N/V') или его новую асинхронную версию — (KWWSV
DLRVPWSGUHDGWKHGRFVLR).
ǬȘțȋȐȍȗȘȖȚȖȒȖȓȣ
Используя стандартный модуль ftplib (KWWSELWO\S\IWSOLE), вы можете перемещать
байты с помощью протокола передачи файлов (File Transfer Protocol, FTP). Несмо-
тря на свой возраст, он все еще хорошо работает.
Вы видели, как эти модули применяются повсеместно в разных местах данной кни-
ги. Взгляните также на документацию, касающуюся поддержки интернет-протоколов
в стандартной библиотеке (KWWSELWO\S\LQWHUQHW).
ǪȍȉșȍȘȊȐșȣȐ$3,
Поставщики информации всегда имеют сайт, однако он предназначен для челове-
ческих глаз, а не для машин. Если данные опубликованы только на нем, то любой,
кто хочет получить к ним доступ, должен писать краулер (это показано в разделе
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǹȍȘȐȈȓȐȏȈȞȐȧȌȈȕȕȣȝ
Как вы видели в главе 16, такие форматы данных, как XML, JSON и YAML, пред-
ставляют собой способы хранения структурированных текстовых данных. Сетевым
приложениям необходимо обмениваться данными с другими программами. Преоб-
разование между данными в памяти и последовательностями байтов (в частности,
перед их отправкой другому клиенту) называется сериализацией или маршаллин-
гом. JSON — это популярный формат сериализации, особенно часто используемый
в RESTful-системах, но с его помощью нельзя выразить все типы данных, использу-
емые в Python. Кроме того, как текстовый формат он выглядит более многословным
в отличие от ряда бинарных методов сериализации. Рассмотрим несколько подходов,
с которыми вы можете столкнуться.
ǫȓȈȊȈǬȈȕȕȣȍȊȗȘȖșȚȘȈȕșȚȊȍșȍȚȐ
ǹȍȘȐȈȓȐȏȈȞȐȧșȗȖȔȖȡȤȦSLFNOH
Python предоставляет модуль , позволяющий сохранить и восстановить любой
объект в специальном бинарном формате.
Помните, как JSON сошел с ума, когда встретил объект ? Для
это не проблема:
ʴʴʴ
ʴʴʴ
ʴʴʴɨʰŜŜ ſƀ
ʴʴʴ ʰ Ŝſɨƀ
ʴʴʴɩʰ Ŝſ ƀ
ʴʴʴɨ
Ŝſɩɥɨɫřɭřɩɩřɩɪřɩɫřɨɰřɨɰɬɮɩɩƀ
ʴʴʴɩ
Ŝſɩɥɨɫřɭřɩɩřɩɪřɩɫřɨɰřɨɰɬɮɩɩƀ
ǬȘțȋȐȍȜȖȘȔȈȚȣșȍȘȐȈȓȐȏȈȞȐȐ
Есть и другие бинарные форматы обмена данными, они обычно компактнее и бы-
стрее, чем XML или JSON:
MsgPack (KWWSPVJSDFNRUJ);
Protocol Buffers (KWWSVFRGHJRRJOHFRPSSURWREXI);
Avro (KWWSDYURDSDFKHRUJGRFVFXUUHQW);
Thrift (KWWSWKULIWDSDFKHRUJ);
Lima (KWWSVOLPDUHDGWKHGRFVLR);
Serialize (KWWSVS\SLRUJSURMHFW6HULDOL]H) — это фронтенд Python для других форма-
тов, включающих JSON, YAML, pickle и MsgPack;
Бенчмарк (KWWSVRUHLOO\6(6+) различных пакетов сериализации для Python.
типы данных;
диапазоны значений;
обязательные и необязательные данные.
ǻȌȈȓȍȕȕȣȍȊȣȏȖȊȣȗȘȖȞȍȌțȘ
Удаленные вызовы процедур (Remote Procedure Call, RPC) выглядят как обычные
функции, но выполняются на удаленных машинах по всей сети. Вместо того чтобы
вызывать RESTful API и передавать туда аргументы, закодированные в URL или
теле запросов, вы можете вызвать функцию RPC на собственной машине. При этом
в RPC-клиенте произойдет следующее.
ǫȓȈȊȈǬȈȕȕȣȍȊȗȘȖșȚȘȈȕșȚȊȍșȍȚȐ
;0/53&
Стандартная библиотека содержит только одну реализацию RPC, которая исполь-
зует в качестве формата обмена данными XML, — . Вы определяете и реги-
стрируете функции на сервере, а клиент вызывает их так, будто они были импорти-
рованы. Сначала рассмотрим файл ɏŜ (пример 17.11).
ǷȘȐȔȍȘ[POUSFBVHUYHUS\
Ŝ
ſƀś
Ƌɩ
ʰſſɑ ɑřɭɮɯɰƀƀ
Ŝɏ ſřɑɑƀ
Ŝɏſƀ
ǷȘȐȔȍȘ[POUSFBFOLHQWS\
Ŝ
-62153&
JSON-RPC (версии 1.0 (KWWSVRUHLOO\2NO.D) и 2.0 (KWWSVRUHLOO\&6U)) аналогичны
XML-RPC, но в них используется JSON. Существует множество библиотек для
работы с JSON-RPC, самая простая из них состоит из двух частей: клиента (KWWSV
RUHLOO\QS[I) и сервера (KWWSVRUHLOO\3BX'U).
Они устанавливаются с помощью команд pip install и pip
install .
Эти библиотеки предоставляют множество альтернативных способов напи-
сать клиент (KWWSVRUHLOO\IG) и сервер (KWWSVRUHLOO\6,1HJ). В примерах 17.13
и 17.14 я применяю встроенный в данную библиотеку сервер, который использует
порт 5000 и является простейшим.
Сначала рассмотрим сервер.
ǷȘȐȔȍȘMVRQUSFBVHUYHUS\
ř
ɒ
ſƀś
Ƌɩ
ǫȓȈȊȈǬȈȕȕȣȍȊȗȘȖșȚȘȈȕșȚȊȍșȍȚȐ
ɏɏɏɏʰʰɑɏɏɏɏɑś
ſƀ
ǷȘȐȔȍȘMVRQUSFBFOLHQWS\
ʰɮ
ʰſɑśŵŵ śɬɥɥɥɑřɑɑřʰƀ
ſɑɑřřɑɑřŜŜƀ
Если вы запустили сервер в фоновом режиме, то убейте процесс после того, как
закончите работу.
0HVVDJH3DFN53&
Библиотека кодирования MessagePack имеет собственную реализацию RPC (KWWS
ELWO\PVJSDFNUSF). Она устанавливается следующим образом:
ɛpip install msgpack-rpc-python
ǷȘȐȔȍȘPVJSDFNBVHUYHUS\
ř
ſƀś
ſřƀś
Ƌɩ
ʰſ ſƀƀ
Ŝſſɑ ɑřɭɮɯɰƀƀ
Ŝſƀ
Класс предоставляет свои методы как сервисы RPC. Теперь запустим
клиент, ɏ Ŝ (пример 17.16).
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǷȘȐȔȍȘPVJSDFNBFOLHQWS\
ř
ʰſſɑ ɑřɭɮɯɰƀƀ
ʰɯ
ʰ Ŝ ſɐɐřƀ
ſɑʩʩɑʩſřƀƀ
ɛpython msgpack_client.py
ɯɨɭ
=HURUSF
Пакет zerorpc (KWWSZZZ]HURUSFLR) написан разработчиками Docker (когда они еще
назывались dotCloud). Он использует ZeroMQ и MsgPack для соединения клиентов
и серверов и магическим образом предоставляет функции как конечные точки RPC.
Введите команду pip install , чтобы установить его. В примерах 17.17
и 17.18 показаны клиент и сервер, работающие по принципу «запрос — ответ».
ǷȘȐȔȍȘ]HURUSFBVHUYHUS\
ſƀś
ſřƀś
ɩƋ
ʰ Ŝſſƀƀ
Ŝſɑ śŵŵɥŜɥŜɥŜɥśɫɩɫɩɑƀ
Ŝſƀ
ǷȘȐȔȍȘ]HURUSFBFOLHQWS\
ʰ Ŝſƀ
Ŝ ſɑ śŵŵɨɩɮŜɥŜɥŜɨśɫɩɫɩɑƀ
ʰɮ
ʰ Ŝſƀ
ſɑɑřřɑɑřƀ
1
Или поместим его в фоновый режим с помощью символа &.
ǫȓȈȊȈǬȈȕȕȣȍȊȗȘȖșȚȘȈȕșȚȊȍșȍȚȐ
J53&
Компания Google создала gRPC (KWWSVJUSFLR) как портативный и быстрый способ
определять и соединять сервисы. Этот пакет кодирует данные как буферы прото-
колов (KWWSVRUHLOO\8,1OF).
Установите те части, которые касаются Python:
ɛpip install grpcio
ɛpip install grpcio-tools
7ZLUS
Twirp (KWWSVRUHLOO\EXI[) похож на gRPC, однако его создатели заявляют, что он
проще. Вы определяете файл с расширением Ŝ, как и в случае с gRPC, и twirp
может сгенерировать код Python, который обрабатывает клиентскую и серверную
части.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǰȕșȚȘțȔȍȕȚȣțȌȈȓȍȕȕȖȋȖțȗȘȈȊȓȍȕȐȧ
(KWWSZZZVDOWVWDFNFRP) написан на Python. Он создавался как способ реа-
лизовать удаленное выполнение программ, но позже вырос в полноценную плат-
форму управления системами. Основанный на ZeroMQ вместо SSH, он может
работать с тысячами серверов.
Альтернативными продуктами являются (KWWSSXSSHWODEVFRP) и
(KWWSZZZJHWFKHIFRPFKHI), тесно связанные с Ruby.
Пакет (KWWSZZZDQVLEOHFRPKRPH), который, как и , написан с по-
мощью Python, вполне сопоставим с ними. Вы можете скачать и применять его
бесплатно, но поддержка и отдельные пакеты с надстройками требуют коммерче-
ской лицензии. По умолчанию он использует SSH и не требует установки особого
программного обеспечения на тех компьютерах, которыми будет управлять.
Пакеты и функционально являются супермножествами пакета
, поскольку обрабатывают исходную конфигурацию, развертывание и уда-
ленное выполнение.
ǸȈȉȖȚȈȍȔșȉȖȓȤȠȐȔȐȖȉȢȍȔȈȔȐȌȈȕȕȣȝ
По мере роста Google и других интернет-компаний обнаружилось, что традиционные
вычислительные решения не масштабировались. Программное обеспечение, кото-
рое работало на отдельных или даже на нескольких машинах, не могло справиться
с тысячами.
Из-за объемов дискового пространства для баз данных и файлов поиск требовал
множества механических движений дисковой головки. (Подумайте о виниловой
пластинке и времени, необходимом для перемещения иголки с одной дорожки на
другую вручную. А также подумайте о скрипящем звуке, который она издаст, если
вы надавите слишком сильно, не говоря уже о звуках, которые издаст хозяин пла-
стинки.) Но передавать потоком последовательные фрагменты диска вы можете
быстрее.
Разработчики обнаружили, что гораздо быстрее было распространять и анали-
зировать данные на нескольких объединенных в сеть машинах, чем на отдельных.
Они могли использовать алгоритмы, которые звучали просто, однако на деле в целом
лучше работали с объемными распределенными данными. Один из таких алгоритмов
называется MapReduce, он может распределить вычисления между несколькими
компьютерами и затем собрать результат. Это похоже на работу с очередями.
+DGRRS
После того как компания Google опубликовала (KWWSVRUHLOO\FODG) полученные ре-
зультаты, компания Yahoo! вслед за ней создала пакет с открытым исходным кодом,
написанный на Java, который называется Hadoop (в честь игрушечного плюшевого
слона, принадлежавшего сыну главного разработчика).
ǫȓȈȊȈǬȈȕȕȣȍȊȗȘȖșȚȘȈȕșȚȊȍșȍȚȐ
Здесь вступают в действие слова «большие данные». Зачастую они просто озна-
чают следующее: «данных слишком много, чтобы они поместились на мою маши-
ну» — данные, объем которых превышает дисковое пространство, память, время
работы процессора или все перечисленное. Для некоторых организаций решением
вопроса больших данных является Hadoop. Этот пакет копирует данные среди ма-
шин, пропускает их через программы масштабирования и сжатия и сохраняет на
диск результаты после каждого шага.
Этот процесс может быть медленным. Более быстрый метод — отправка потоком
с помощью Hadoop, который работает как каналы Unix, посылая данные между про-
граммами и не требуя записи на диск после выполнения каждого шага. Вы можете
писать программы, использующие отправку потоком с помощью Hadoop, на любом
языке, включая Python.
Множество модулей Python были написаны для Hadoop, некоторые из них рассма-
триваются в статье блога A Guide to Python Frameworks for Hadoop (KWWSELWO\S\KDGRRS).
Компания Spotify, известная передачей потоковой музыки, открыла исходный код
своего компонента для отправки потоком с помощью Hadoop — написанного на
Python Luigi (KWWSVJLWKXEFRPVSRWLI\OXLJL).
6SDUN
Конкурент по имени Spark (KWWSELWO\DERXWVSDUN) был разработан для того, чтобы
превысить скорость работы Hadoop в 10–100 раз. Он может читать и обрабатывать
любой источник данных и формат Hadoop. Spark включает в себя API для Python
и других языков. Вы можете найти документацию по установке онлайн (KWWSELWO\
GOVSDUN).
'LVFR
Еще одна альтернатива Hadoop — Disco (KWWSGLVFRSURMHFWRUJ), который использует
Python для обработки MapReduce и язык программирования Erlang для коммуника-
ции. К сожалению, вы не можете установить его с помощью pip — см. документацию
(KWWSELWO\JHWGLVFR).
'DVN
Dask (KWWSVGDVNRUJ) похож на Spark, однако написан на Python и широко исполь-
зуется в научных пакетах, таких как NumPy, Pandas и scikit-learn. Он может рас-
пространять задачи в кластерах, содержащих тысячи машин.
Для получения Dask и всех вспомогательных модулей выполните следующую
команду:
ɛpip install dask[complete]
Обратитесь к главе 22, чтобы увидеть связанные с нашей темой примеры парал-
лельного программирования, в которых объемные структурированные вычисления
распространены между несколькими машинами.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǸȈȉȖȚȈȍȔȊȖȉȓȈȒȈȝ
Я действительно совсем не знаю облаков.
Джони Митчелл
$PD]RQ:HE6HUYLFHV
По мере роста компании Amazon от сотен до тысяч и миллионов серверов раз-
работчики столкнулись со всеми проблемами распределенных систем. Однажды
в 2002 году (или около того) СЕО компании Джефф Безос объявил работникам
Amazon, что с этого момента все данные и функционал должны быть доступны
только через интерфейсы сетевых сервисов — не через файлы, базы данных или ло-
кальные вызовы функций. Программистам пришлось разрабатывать эти интерфейсы
так, как если бы их код стал общедоступным. Письмо заканчивалось мотивирующей
фразой: «Тот, кто этого не сделает, будет уволен».
Неудивительно, что разработчики взялись за дело и с течением времени создали
очень крупную архитектуру, ориентированную на сервисы. Они позаимствовали или
придумали сами множество решений, включая Amazon Web Services (AWS) (KWWS
DZVDPD]RQFRP), которое сейчас доминирует на рынке. Официальной библиотекой
Python для работы с AWS является ɪ:
документация (KWWSVRUHLOO\\%D]);
страницы SDK (KWWSVDZVDPD]RQFRPVGNIRUS\WKRQ).
Установите ее следующим образом:
ɛpip install boto3
*RRJOH
Google часто использует Python для внутренних нужд и нанимает именитых разра-
ботчиков Python (у них какое-то время работал сам Гвидо ван Россум). На главной
странице Google (KWWSVFORXGJRRJOHFRP) и странице, посвященной Python (KWWSV
FORXGJRRJOHFRPS\WKRQ), вы можете найти подробную информацию о его сервисах.
0LFURVRIW$]XUH
Microsoft наряду с Amazon и Google предлагает облачный сервис под названием
Azure (KWWSVD]XUHPLFURVRIWFRP). В статье Python on Azure (KWWSVRUHLOO\<R1]) можно
узнать, как разрабатывать и размещать приложения Python в этом сервисе.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
2SHQ6WDFN
OpenStack (KWWSVZZZRSHQVWDFNRUJ) — это бесплатное решение с открытым ис-
ходным кодом, содержащее сервисы Python и Rest API. Многие из них аналогичны
сервисам, предлагаемым коммерческими облаками.
'RFNHU
Простой стандартизированный контейнер отправки ПО произвел революцию
в международной торговле. Всего несколько лет назад Docker применил название
«контейнер» и аналогию к методу виртуализации с помощью малоизвестных осо-
бенностей Linux. Контейнеры гораздо легче, чем виртуальные машины, и немного
тяжелее, чем virtualenvs в Python. Они позволяют упаковать приложение отдель-
но от других программ на одной и той же машине, общим для них будет только
ядро ОС.
Чтобы установить клиентскую библиотеку Docker (KWWSVS\SLRUJSURMHFWGRFNHU),
выполните следующую команду:
ɛpip install docker
.XEHUQHWHV
Технология контейнеризации распространилась по всему вычислительному миру.
В конечном счете возникла потребность в способе управления большим количе-
ством контейнеров и автоматизации операций, выполняемых вручную в крупных
распределенных системах:
обход отказов;
балансировка нагрузки;
масштабирование.
Похоже, что лидером на рынке управления контейнерами становится Kubernetes
(KWWSVNXEHUQHWHVLR).
Чтобы установить его клиентскую библиотеку (KWWSVJLWKXEFRPNXEHUQHWHVFOLHQW
S\WKRQ), выполните следующую команду:
ɛpip install kubernetes
ǿȐȚȈȑȚȍȌȈȓȍȍ
Как говорят на телевидении, наш следующий гость не нуждается в представле-
нии. Узнаем, почему Python является одним из лучших языков для работы в Ин-
тернете.
ǫȓȈȊȈǬȈȕȕȣȍȊȗȘȖșȚȘȈȕșȚȊȍșȍȚȐ
ǻȗȘȈȎȕȍȕȐȧ
17.1. Используйте объект класса , чтобы реализовать сервис, сообщающий
текущее время. Когда клиент отправляет на сервер строку ɐɐ, верните
текущие дату и время как строку ISO.
17.2. Задействуйте сокеты ZeroMQ REQ и REP, чтобы сделать то же самое.
17.3. Попробуйте сделать то же самое с помощью XMLRPC.
17.4. Возможно, вы видели эпизод телесериала I Love Lucy, в котором Люси и Этель
работают на шоколадной фабрике. Парочка стала отставать, когда линия кон-
вейера, направлявшая к ним на обработку конфеты, еще более ускорилась.
Напишите симуляцию, которая отправляет разные типы конфет в список
Redis, и клиент Lucy, делающий блокирующие выталкивания из списка.
Ей нужно 0,5 секунды, чтобы обработать одну конфету. Выведите на экран
время и тип каждой конфеты, которую получит Lucy, а также количество не-
обработанных конфет.
17.5. Используйте ZeroMQ, чтобы публиковать стихотворение из упражнения 12.4
(пример 12.1) по одному слову за раз. Напишите потребитель ZeroMQ, кото-
рый будет выводить на экран каждое слово, начинающееся с гласной. Напи-
шите другой потребитель, который станет выводить все слова, состоящие из
пяти букв. Знаки препинания игнорируйте.
ƋƓƈƊƈ
ǸȈșȗțȚȣȊȈȍȔǪșȍȔȐȘȕțȦȗȈțȚȐȕț
1
Компания, основанная Стивом Джобсом после его ухода из Apple.
ǫȓȈȊȈǸȈșȗțȚȣȊȈȍȔǪșȍȔȐȘȕțȦȗȈțȚȐȕț
ǪȍȉȒȓȐȍȕȚȣ
Низкоуровневая система проводящих путей Интернета называется Transmission
Control Protocol/Internet Protocol (протокол управления передачей/интернет-
протокол) или просто TCP/IP (в одноименном разделе главы 17 на с. 368 данный
протокол рассматривается более подробно). Он перемещает байты между компьюте-
рами, но не обращает внимания на то, что они значат. Это работа высокоуровневых
протоколов — определений синтаксиса для некоторых целей. HTTP — стандартный
протокол для обмена данными в Сети.
Всемирная паутина — это клиент-серверная система. Клиент делает запрос сер-
веру: он открывает соединение TCP/IP, отправляет URL и другую информацию
с помощью HTTP и получает ответ.
Формат ответа также определяется протоколом HTTP. Он включает в себя статус
запроса и (в том случае, если запрос выполнен успешно) данные и формат ответа.
Самый известный веб-клиент — это браузер. Он может создавать HTTP-запросы
несколькими способами. Вы можете инициировать запрос вручную, написав URL
в адресной строке или нажав ссылку на веб-странице. Очень часто для отображения
сайта используются возвращаемые данные: HTML-документы, файлы JavaScript,
1
Развеем старый миф. Сенатор (а впоследствии вице-президент) Эл Гор выступал в под-
держку двухпартийного законодательства и сотрудничества, включая финансирование
группы, создавшей Mosaic, что позволило значительно развить Интернет на раннем этапе.
Он никогда не утверждал, что «изобрел Интернет»; эту фразу ему приписали его полити-
ческие конкуренты, когда он баллотировался в президенты в 2000-м.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
файлы CSS и изображения, но данные могут быть любого типа, в том числе и не
предназначенные для отображения.
Важный аспект HTTP — этот протокол не имеет состояния. Каждое создаваемое
вами соединение HTTP не зависит от других. Это упрощает базовые операции, но
усложняет другие. Рассмотрим несколько примеров таких усложнений.
Кэширование. Удаленный контент, который не меняется, должен быть сохранен
веб-клиентом и использован для того, чтобы не загружать его с сервера снова.
Сессии. Интернет-магазин должен запоминать содержимое вашей корзины.
Аутентификация. Сайты, которые требуют ваши имя пользователя и пароль,
должны запоминать их, пока вы авторизованы.
Решения для описанных усложнений включают в себя cookie, в которых сервер
отправляет клиенту довольно специфическую информацию, позволяющую их рас-
познать, когда клиент отправляет эти файлы назад.
ǺȍșȚȐȘțȍȔșȗȖȔȖȡȤȦWHOQHW
HTTP — протокол, основанный на тексте, поэтому вы можете вручную вводить его
код во время тестирования. Древняя программа telnet позволяет подключиться
к любому серверу и порту и вводить команды для любого сервиса, запущенного
на нем. Создавать безопасные (зашифрованные) соединения с другими машинами
следует с помощью ssh.
Запросим у любимого многими тестового сайта Google базовую информацию
о его главной странице. Введем следующее:
ɛtelnet [Link] 80
ŵ отправляет запрос HTTP глагол (команда) с целью получить информа-
цию о главной странице (ŵ). Вы получите ответ наподобие следующего (я обрезал
некоторые длинные строки с помощью многоточий, чтобы они не вываливались за
пределы страницы):
ŵɨŜɨɩɥɥ
śřɨɥ ɩɥɨɰɨɭśɨɩśɨɪ
śŞɨ
ŞśřŞʰɥ
ŞśŵŚ ʰ ŞɯɯɬɰŞɨ
ɪśʰɑɪ ŠŜ ŵɪŜɑ
ś
ŞŞ śɥ
Ş Şś
Şśɨɏ ʰŜŜŜŚʰŜŜŜ ŚʰŵŚʰŜŜ
Şś ʰŜŜŜŚʰŜŜŜ ŚʰŵŚʰŜŜ Ś
Ş ś
Şś
ś Ş
ǺȍșȚȐȘțȍȔșȗȖȔȖȡȤȦFXUO
Использовать telnet довольно просто, но это делается исключительно вручную.
Программа (KWWSVFXUOKD[[VH), возможно, самый популярный веб-клиент, ра-
ботающий в командной строке. Его документация включает в себя книгу Everything
Curl (KWWSVFXUOKD[[VHERRNKWPO), доступную в форматах HTML, PDF и ebook. В этой
таблице (KWWSVRUHLOO\G/5E) сравниваются и похожие инструменты. На стра-
нице скачивания (KWWSVFXUOKD[[VHGRZQORDGKWPO) перечислены все основные, а также
многие узкоспециализированные платформы.
Простейший вариант использования — неявный запрос (здесь его вывод
будет обрезан):
ɛcurl [Link]
ʳŠ ʴ
ʳʴ
ʳʴ
ʳʴʳŵʴ
ŜŜŜ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǺȍșȚȐȘțȍȔșȐșȗȖȓȤȏȖȊȈȕȐȍȔKWWSLH
Альтернативой в духе Python является httpie (KWWSVKWWSLHRUJ).
ɛpip install httpie
Чтобы выполнить запрос , сделаем шаги, аналогичные шагам для , по-
казанным выше (Ş — это синоним для ŞŞ):
ɛhttp -f POST url a=1 b=2
ɛhttp POST -f url < [Link]
ǺȍșȚȐȘțȍȔșȗȖȔȖȡȤȦKWWSELQ
Вы можете тестировать свои веб-запросы для сайта httpbin (KWWSVKWWSELQRUJ)
или же загрузить и запустить сайт в локальном образе Docker:
ɛdocker run -p 80:80 kennethreitz/httpbin
ǹȚȈȕȌȈȘȚȕȣȍȊȍȉȉȐȉȓȐȖȚȍȒȐ3\WKRQ
В Python 2 модули веб-клиентов и веб-серверов были слегка разбросаны. Одна из
целей Python 3 заключается в том, чтобы разместить эти модули в двух пакетах (как
вы помните из главы 11, пакет — всего лишь каталог для хранения файлов модулей):
http управляет всеми деталями клиент-серверного взаимодействия HTTP:
y выполняет всю работу на стороне клиента;
y server помогает написать веб-сервер Python;
y и управляют cookies, которые сохраняют данные между
посещениями;
urllib работает на базе http:
y request обрабатывает клиентские запросы;
y response обрабатывает ответы сервера;
y parse разбивает URL на части.
ǭșȓȐ Ȋȣ ȝȖȚȐȚȍ ȕȈȗȐșȈȚȤ ȒȖȌ ȒȖȚȖȘȣȑ șȖȊȔȍșȚȐȔ ș3\WKRQ Ȑ 3\WKRQ ȚȖ ȊȈȔ
șȓȍȌțȍȚȗȖȔȕȐȚȤȖȚȖȔȟȚȖȉȐȉȓȐȖȚȍȒȈXUOOLEȏȕȈȟȐȚȍȓȤȕȖ KWWSVRUHLOO\ZZB5
ȐȏȔȍȕȐȓȈșȤȗȘȐȗȍȘȍȝȖȌȍȕȈ3\WKRQǿțȚȤȕȐȎȍȊȗȖȌȘȈȏȌȍȓȍ©ǯȈȗȘȍȌȍȓȈȔȐșȚȈȕ
ȌȈȘȚȕȖȑȉȐȉȓȐȖȚȍȒȐUHTXHVWVªȕȈșȗȘȍȌșȚȈȊȓȍȕȈȉȖȓȍȍțȌȖȉȕȈȧȈȓȤȚȍȘȕȈȚȐȊȈ
Значение ɩɥɥ означает, что все прошло гладко. Существуют десятки кодов ста-
туса HTTP, объединенных в пять диапазонов в соответствии с их первой цифрой
(сотни):
1xx (информация) — сервер получил запрос, но имеет некую дополнительную
информацию для клиента;
2xx (успех) — сработало, каждый код успеха, кроме 200, сообщает дополнитель-
ные детали;
3xx (перенаправление) — ресурс был перемещен, поэтому ответ возвращает кли-
енту новый URL;
4xx (ошибка клиента) — некие проблемы на стороне клиента, например знамени-
тая ошибка 404 (ресурс не найден). Код 418 (I’m a teapot) был первоапрельской
шуткой;
5xx (ошибка сервера) — код 500 — общая ошибка. Вы можете встретить ошиб-
ку 502 (ошибочный шлюз), если произошел разрыв связи между веб-сервером
и машинным интерфейсом.
Чтобы получить содержимое веб-страницы, используйте метод ſƀ перемен-
ной . Вы получите значение типа bytes. Получим данные и выведем на экран
первые 50 байт:
ʴʴʴʰ Ŝſƀ
ʴʴʴſƃśɬɥƄƀ
ɐʳŠ ʴɎʳʴɎʳʴɎʳʴɐ
ŞŞʰɭɥɫɯɥɥ
ŞŵŚ ʰ Şɯ
řɥɬɩɥɨɰɥɪśɥɰśɩɭ
ɑɨɬɫɨɥɩɬɭɭɪʫɑ
řɨɩɩɥɨɰɥɪśɥɰśɩɭ
Ş řɥɰɩɥɨɪɩɪśɬɫśɪɬ
ſŵɬɩɰɭƀ
ǫȓȈȊȈǸȈșȗțȚȣȊȈȍȔǪșȍȔȐȘȕțȦȗȈțȚȐȕț
Помните пример работы с telnet, который я показывал ранее? Теперь наша би-
блиотека Python может разбирать заголовки этих HTTP-запросов и размещать их
в словарь. и кажутся довольно очевидными, некоторые другие — нет.
Полезно знать, что HTTP имеет набор стандартных заголовков, таких как Ş
, и множество опциональных.
ǯȈȗȘȍȌȍȓȈȔȐșȚȈȕȌȈȘȚȕȖȑȉȐȉȓȐȖȚȍȒȐUHTXHVWV
В начале главы 1 вы увидели программу, которая получает доступ к Wayback
Machine API с помощью стандартных библиотек Ŝ и . За ним
следовал другой пример, использовавший стороннюю библиотеку requests. Он был
короче и проще для понимания.
Я считаю, что для большинства задач, связанных с разработкой веб-клиентов,
проще использовать библиотеку requests. Вы можете просмотреть ее документацию
по адресу KWWSVRUHLOO\])F\ (она довольно хорошо написана), чтобы получить более
подробную информацию. Я покажу основные принципы работы с этой библиотекой
в данном подразделе и буду задействовать ее на протяжении всей книги для решения
задач, связанных с веб-клиентами.
Для начала нужно установить библиотеку requests:
ɛpip install requests
ǷȘȐȔȍȘLDS\
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ſƀś
ʰɑśŵŵ Ŝŵ Ŝɑ
ʰƇɑɑśɑśſƇƈƀɑř
ɑɑśɑɑř
ɑɑśɑřɑř
ɑɑśɬɥř
ɑɑśɨřƈ
ʰŜſřʰƀ
Ŝſƀ
ɏɏɏɏʰʰɑɏɏɏɏɑś
ʰŜƃɨƄ
ʰ ſƀ
ʰƃɑɑƄƃɑ ɑƄ
ſɑ Ƈſ ƀƈřɨɥɑƀ
ſɑɎɑƀ
ƃśɨɥƄś
ſƃɑɑƄřƃɑɑƄřʰɑɎɑƀ
ǪȍȉșȍȘȊȍȘȣ
Веб-разработчики обнаружили, что Python хорошо подходит для написания веб-
серверов и программ, работающих на серверной стороне. Это привело к появлению
такого множества фреймворков, написанных на данном языке, что теперь уже стано-
вится трудно исследовать их все и сделать выбор, не говоря уже о принятии решения
о том, какие из них обсудить в книге.
Веб-фреймворк предоставляет функции, позволяющие построить сайты, поэтому
может решать большее количество задач, чем простой веб-сервер (HTTP). Вы встре-
титесь с функциями маршрутизации (URL к функции сервера), шаблонами (HTML
с динамическими включениями), отладкой и др.
ǫȓȈȊȈǸȈșȗțȚȣȊȈȍȔǪșȍȔȐȘȕțȦȗȈțȚȐȕț
Я не буду говорить в этой книге обо всех фреймворках — рассмотрю лишь те,
которые относительно просты в использовании и подходят для создания настоящих
сайтов. Я также покажу, как запускать динамические части сайта на традиционном
веб-сервере с помощью Python и других составляющих.
ǷȘȖșȚȍȑȠȐȑȊȍȉșȍȘȊȍȘ3\WKRQ
Вы можете запустить простейший веб-сервер, просто введя одну строку кода Python:
ɛpython -m [Link]
Запись ɥŜɥŜɥŜɥ означает любой адрес TCP, поэтому веб-клиенты могут получать
к нему доступ независимо от того, какой адрес имеет сервер. В главе 11 вы можете
прочитать о некоторых низкоуровневых деталях TCP и других системах соединения
в сеть.
Теперь вы можете запрашивать файлы, чьи пути относительны к вашему текуще-
му каталогу, и они будут вам возвращены. Если вы введете в своем браузере строку
śŵŵ śɯɥɥɥ, то должны увидеть список каталогов и сервер выведет на
экран строки обращения к журналам, например такие:
ɨɩɮŜɥŜɥŜɨŞŞƃɩɥŵ ŵɩɥɨɪɩɩśɥɩśɪɮƄɑ ŵ ŵɨŜɨɑɩɥɥŞ
Этот сервер, написанный только на Python, лучше всего подходит для быстрых
тестов. Вы можете выключить его, убив его процесс нажатием &WUO+&.
Вы не должны использовать этот простой сервер для загруженного производ-
ственного сайта. Традиционные веб-серверы, такие как Apache и NGINX, гораздо бы-
стрее работают со статическими файлами. Кроме того, этот простой сервер не может
взаимодействовать с динамическим содержимым, в отличие от более продвинутых
серверов, принимающих дополнительные параметры.
:HE6HUYHU*DWHZD\,QWHUIDFH :6*,
Довольно быстро необходимость в простых файлах исчезает, и нам уже нужен сер-
вер, который может запускать программы динамически. В первые годы существова-
ния Всемирной паутины общий интерфейс шлюза (Common Gateway Interface, CGI)
был разработан для того, чтобы веб-серверы могли запускать внешние программы
и возвращать результаты. CGI также обрабатывал получение входных аргументов
от клиента, передавая их через сервер сторонним программам. Однако программы
запускались заново при каждом обращении клиента. Масштабировать такие систе-
мы было трудно, поскольку даже у небольших программ время загрузки довольно
велико.
Чтобы избежать задержки запуска, люди начали встраивать интерпретатор
языка в веб-сервер. Apache запускал код на PHP внутри своего модуля ɏ,
Perl — внутри модуля ɏ и Python — внутри модуля ɏ. Далее код
этих динамических языков мог быть выполнен внутри долгоиграющего процесса
Apache, а не во внешних программах.
Альтернативный метод заключается в том, чтобы запускать динамический язык
внутри отдельной долгоиграющей программы и заставить ее обмениваться данными
с веб-сервером. Примерами таких программ являются FastCGI и SCGI.
Веб-разработка на Python совершила рывок с появлением Web Server Gateway
Interface (WSGI) — универсального API между веб-приложениями и веб-серверами.
Все веб-фреймворки и веб-серверы Python, показанные далее, используют WSGI.
Обычно вам не нужно знать, как функционирует данный интерфейс (для этого
многого и не потребуется), но знание основных принципов его функционирования
может действительно помочь разработке. Такое соединение называется синхрон-
ным — за одним шагом следует другой.
ǫȓȈȊȈǸȈșȗțȚȣȊȈȍȔǪșȍȔȐȘȕțȦȗȈțȚȐȕț
$6*,
Я уже несколько раз упоминал, что в Python начали появляться возможности асин-
хронного программирования, такие как , await и . ASGI (Asynchronous
Server Gateway Interface) — аналог WSGI, который использует все эти возможности.
В приложении В вы познакомитесь с этой темой более подробно, а также увидите
примеры новых веб-фреймворков, применяющих ASGI.
DSDFKH
Лучшим WSGI-модулем (KWWSKWWSGDSDFKHRUJ) является ɏ (KWWSV
FRGHJRRJOHFRPSPRGZVJL). Он может запускать код, написанный на Python, вну-
три процесса Apache или в отдельном процессе, который обменивается данными
с Apache. Если вы используете Linux или OS X, в вашей системе уже уста-
новлен. Для Windows вам придется устанавливать его самостоятельно (KWWSELWO\
DSDFKHKWWS).
Наконец, установите предпочитаемый веб-фреймворк Python, основанный на
WSGI. Попробуем использовать в наших примерах фреймворк bottle. Практически
вся работа включает в себя конфигурирование Apache, что может оказаться довольно
затруднительным.
Создайте тестовый файл и сохраните его как ŵŵŵŵŜ (при-
мер 18.2).
ǷȘȐȔȍȘKRPHZVJL
ʰŜɏſƀ
ɒŜſɐŵɐƀ
ſƀś
ɑ řɑ
ŵŵŵŵŵŜ
ʳ ŵŵŵʴ
ř
ʳŵ ʴ
ʳŵ ʴ
Запустите или, если он работал, перезапустите, с целью указать ему, что
следует использовать новую конфигурацию. Перейдя в браузере по адресу KWWS
ORFDOKRVW, вы должны увидеть эту строку:
ř
Это запустит ɏ во встроенном режиме как часть самого .
Вы также можете запустить его в режиме демона — как один или несколько про-
цессов, отдельных от . Для этого добавьте две новые строки директив в ваш
файл конфигурации :
ŞʰŞʰŞʰɩɬ
Ş
ŵŵŵŵŵŜ
ʳ ŵŵŵʴ
ř
ʳŵ ʴ
ʳŵ ʴ
1*,1;
Веб-сервер NGINX (KWWSQJLQ[RUJ) не имеет встроенного модуля Python. Вместо
этого он обменивается данными с помощью отдельного сервера WSGI, такого как
uWSGI или gUnicorn. Вместе они представляют собой очень быструю и удобную
в конфигурации платформу для веб-разработки на Python.
ǫȓȈȊȈǸȈșȗțȚȣȊȈȍȔǪșȍȔȐȘȕțȦȗȈțȚȐȕț
ǬȘțȋȐȍȊȍȉșȍȘȊȍȘȣ3\WKRQ
Ниже перечислены некоторые независимые WSGI-серверы, написанные на Python,
которые работают как или и используют несколько процессов и/или
потоков (см. раздел «Конкурентность» главы 15 на с. 308) для обработки одновре-
менных запросов:
uwsgi (KWWSSURMHFWVXQELWLWXZVJL);
(KWWSZZZFKHUU\S\RUJ);
pylons (KWWSZZZS\ORQVSURMHFWRUJ).
А это серверы, основанные на событиях, которые пользуются одним процессом,
но избегают блокирования любым одиночным запросом:
(KWWSZZZWRUQDGRZHERUJ);
gevent (KWWSJHYHQWRUJ);
(KWWSJXQLFRUQRUJ).
О событиях я подробнее рассказывал в разделе «Конкурентность» на с. 308.
ǼȘȍȑȔȊȖȘȒȐȌȓȧȘȈȉȖȚȣȊȍȉșȍȘȊȍȘȈȔȐ
Веб-серверы обрабатывают детали работы HTTP и WSGI, но вам нужно использо-
вать веб-фреймворки, чтобы написать код на Python, который будет поддерживать
сайт. Так что мы немного поговорим о фреймворках, а затем вернемся к альтерна-
тивным способам обслуживания сайтов, использующих их.
Написать сайт на Python можно с помощью множества веб-фреймворков (не-
которые даже могут сказать, что их слишком много). Веб-фреймворк обрабаты-
вает как минимум запросы клиента и ответы сервера. Большинство крупных веб-
фреймворков могут решать такие задачи, как:
обработка протокола HTTP;
аутентификация (authn, или «кто ты?»);
авторизация (authz, или «что ты можешь сделать?»);
создание сессии;
получение параметров;
валидация параметров (обязательные/опциональные, тип, диапазон);
обработка глаголов HTTP;
маршрутизация (функции/классы);
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
%RWWOH
Bottle состоит из одного файла Python, поэтому его довольно легко опробовать
и развернуть. Bottle не является частью стандартной библиотеки Python, поэтому
установите его с помощью следующей команды:
ɛpip install bottle
ǷȘȐȔȍȘERWWOHS\
ř
ɒſɐŵɐƀ
ſƀś
ɑ ɐ řɐɑ
ſʰɐ ɐřʰɰɰɰɰƀ
ǷȘȐȔȍȘERWWOHS\
řř ɏ
ɒſɐŵɐƀ
ſƀś
ɏſɐŜɐřʰɐŜɐƀ
ſʰɐ ɐřʰɰɰɰɰƀ
ǷȘȐȔȍȘERWWOHS\
řř ɏ
ɒſɐŵɐƀ
ſƀś
ɏſɐŜɐřʰɐŜɐƀ
ɒſɐŵ ŵʳʴɐƀ
ſƀś
ɑśʩŠɑʩ
ſʰɐ ɐřʰɰɰɰɰƀ
ǷȘȐȔȍȘERWWOHBWHVWS\
)ODVN
Bottle — это хороший фреймворк для того, чтобы начать работу. Но если вам нужно
больше возможностей, то попробуйте Flask. Он был создан в 2010 году как перво-
апрельская шутка, но реакция энтузиастов вдохновила его автора, Армина Ронахера,
сделать его настоящим фреймворком. Он назвал результат Flask («склянка»), обыгры-
вая название Bottle — «бутылка».
Flask почти так же прост в использовании, как и Bottle, но поддерживает мно-
жество расширений, которые могут оказаться полезными в профессиональной
веб-разработке, например аутентификацию с помощью Facebook и интеграцию с ба-
ǫȓȈȊȈǸȈșȗțȚȣȊȈȍȔǪșȍȔȐȘȕțȦȗȈțȚȐȕț
зами данных. Это решение мне нравится больше других веб-фреймворков Python,
поскольку в нем сбалансированы простота применения и богатый набор функций.
Пакет включает в себя библиотеку WSGI и библиотеку шаблонов
ɩ. Вы можете установить его с помощью терминала:
ɛpip install flask
ǷȘȐȔȍȘIODVNS\
ɒŜſɐŵɐƀ
ſƀś
Ŝɏ ɏſɐŜɐƀ
ɒŜſɐŵ ŵʳʴɐƀ
ſƀś
ɑśʩɑʩ
Ŝſʰɰɰɰɰřʰƀ
Есть еще одно преимущество установки параметра равным при вызове
метода run. Если в серверном коде генерируется исключение, то Flask возвращает
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
До сих пор примеры с использованием Flask повторяли то, что мы делали с по-
мощью фреймворка Bottle. Что такого может делать Flask в отличие от Bottle? Flask
содержит ɩ — более широкую систему шаблонов. Рассмотрим небольшой при-
мер одновременного применения ɩ и Flask.
Создайте каталог и файл ɩŜ внутри него (пример 18.8).
ǷȘȐȔȍȘIODVNKWPO
ʳʴ
ʳʴ
ʳʴ ɩʳŵʴ
ʳŵʴ
ʳʴ
śƇƇƈƈ
ʳŵʴ
ʳŵʴ
ǷȘȐȔȍȘIODVNS\
řɏ
ʰ ſɏɏɏɏƀ
ɒŜſɐŵ ŵʳʴɐƀ
ſƀś
ɏſɐɩŜɐřʰƀ
Ŝſʰɰɰɰɰřʰƀ
Аргумент thing ʰ thing утверждает, что для передачи переменной с именем thing
в шаблон эта переменная содержит значение строки thing.
Убедитесь, что файл ɨŜ перестал работать, и запустите файл ɩŜ:
ɛpython [Link]
ǷȘȐȔȍȘIODVNDS\
řɏ
ʰ ſɏɏɏɏƀ
Ŝſʰɰɰɰɰřʰƀ
Или же вы можете передать аргументы как параметры команды , как это по-
казано в примере 18.11; сохраните файл как ɪŜ.
ǷȘȐȔȍȘIODVNES\
řɏř
ʰ ſɏɏɏɏƀ
ɒŜſɐŵ ŵɐƀ
ſƀś
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ʰŜŜſɐɐƀ
ʰŜŜſɐ ɐƀ
ɏſɐɪŜɐřʰř ʰ ƀ
Ŝſʰɰɰɰɰřʰƀ
ǷȘȐȔȍȘIODVNFS\
řɏř
ʰ ſɏɏɏɏƀ
ɒŜſɐŵ ŵɐƀ
ſƀś
ʰƇƈ
ƃɐɐƄʰŜŜſɐɐƀ
ƃɐ ɐƄʰŜŜſɐ ɐƀ
ɏſɐɪŜɐřƋƋƀ
Ŝſʰɰɰɰɰřʰƀ
'MDQJR
(KWWSVZZZGMDQJRSURMHFWFRP) — очень популярный веб-фреймворк, написан-
ный на Python, особенно для крупных сайтов. Его стоит изучить по многим при-
чинам, среди которых регулярно появляющиеся требования опыта работы с
в объявлениях о вакансиях. Он содержит код ORM (об ORM мы говорили в подраз-
деле SQLAlchemy на с. 348), позволяющий создавать автоматические веб-страницы
для типичных функций баз данных (создание, замена, обновление, удаление),
которые я рассматривал в главе 16. Он также включает автоматические страницы
ǫȓȈȊȈǸȈșȗțȚȣȊȈȍȔǪșȍȔȐȘȕțȦȗȈțȚȐȕț
ǬȘțȋȐȍȜȘȍȑȔȊȖȘȒȐ
Вы можете сравнить фреймворки с помощью онлайн-таблицы, размещенной по
адресу KWWSELWO\ZHEIUDPHV:
fastapi (KWWSVIDVWDSLWLDQJHORFRP) обрабатывает как синхронные (WSGI), так
и асинхронные (ASGI) вызовы, использует подсказки типов и генерирует тесто-
вые страницы. Очень хорошо задокументирован. Рекомендую;
ɩ (KWWSZZZZHES\FRP) работает примерно с тем же, с чем и , только
немного в другом стиле;
(KWWSVWU\S\UDPLGFRP) появился из более раннего проекта pylons, с точки
зрения функционала похож на ;
turbogears (KWWSWXUERJHDUVRUJ) поддерживает ORM, множество баз данных и не-
сколько языков шаблонов;
Ŝ (KWWSS\WKRQKRVWHGRUJZKHH]\ZHE) более молодой фреймворк, оптими-
зирован для повышения производительности. Недавние исследования показали,
что он работает быстрее других (KWWSELWO\ZKHH]\ZHE);
(KWWSVPROWHQIUDPHZRUNFRP) также использует подсказки типов, но под-
держивает только WSGI;
apistar (KWWSVGRFVDSLVWDUFRP) похож на fastapi, но это скорее инструмент для
валидации API, чем веб-фреймворк;
(KWWSVGRFVPDVRQLWHSURMHFWFRP) — аналог Ruby on Rails или Laravel, на-
писанный на Python.
ǼȘȍȑȔȊȖȘȒȐȌȓȧȘȈȉȖȚȣșȉȈȏȈȔȐȌȈȕȕȣȝ
Интернет и базы данных — это неразлучная парочка: где одно, там и другое. В реаль-
ных приложениях Python в какой-то момент вам может понадобиться предоставить
веб-интерфейс (сайт и/или API) реляционной базе данных.
Вы можете создать собственный интерфейс с помощью:
веб-фреймворка, такого как Bottle или Flask;
пакет для работы с БД, наподобие db-api или SQLAlchemy;
драйвер для базы данных вроде pymysql.
Вместо этого вы также можете использовать один из пакетов, объединяющих
Интернет и базы данных:
connexion (KWWSVFRQQH[LRQUHDGWKHGRFVLR);
datasette (KWWSVGDWDVHWWHUHDGWKHGRFVLR);
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
sandman2 (KWWSVJLWKXEFRPMHIINQXSSVDQGPDQ);
flask-restless (KWWSVIODVNUHVWOHVVUHDGWKHGRFVLR).
Или можете использовать фреймворк со встроенной поддержкой баз данных,
такой как Django.
Кроме того, ничто не заставляет вас выбирать именно реляционную базу данных.
Если схема ваших данных может значительно изменяться — столбцы явно разли-
чаются в разных строках, — то вам стоит выбрать базу данных, не имеющую схемы.
Это могут быть базы данных NoSQL, которые мы рассматривали в главе 16. Однажды
я работал над сайтом, который изначально хранил данные в базе данных NoSQL,
затем переключался на одну реляционную базу данных, затем на другую, потом на
другую базу данных NoSQL и, наконец, возвращался к одной из реляционных.
ǪȍȉșȍȘȊȐșȣȐȈȊȚȖȔȈȚȐȏȈȞȐȧ
Мы рассмотрели традиционные веб-клиенты и серверные приложения, потребля-
ющие и генерирующие HTML-страницы. Интернет оказался мощным способом
объединять приложения и данные во многих форматах, не только HTML.
ǴȖȌțȓȤZHEEURZVHU
Начнем с небольшого сюрприза. Запустите сессию Python в окне терминала и вве-
дите следующую строку:
ʴʴʴ
1
Если вы по какой-то причине не видите ее, то посетите сайт xkcd ([Link]
ǫȓȈȊȈǸȈșȗțȚȣȊȈȍȔǪșȍȔȐȘȕțȦȗȈțȚȐȕț
ǴȖȌțȓȤZHEYLHZ
Вместо вызова браузера, как это делает модуль webbrowser, модуль webview ото-
бражает страницу в собственном окне, используя интерфейс, нативный для вашей
машины. Чтобы установить его в ОС Linux или macOS:
ɛpip install pywebview[qt]
В Windows:
ɛpip install pywebview[cef]
ǸȐșǶȒȕȖZHEYLHZ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
5(67$3,
Зачастую данные доступны только внутри веб-страниц. При желании получить
к ним доступ вам нужно получить доступ к странице через браузер и прочитать ее.
Если с момента вашего последнего визита авторы сайта внесли какие-нибудь из-
менения, то местоположение и стиль данных могли измениться.
Вместо того чтобы публиковать веб-страницы, вы можете предоставить до-
ступ к данным через веб-интерфейс программирования приложений (Application
Programming Interface, API). Клиенты получают доступ к вашему сервису, делая
запросы к URL, и получают ответы, содержащие статус и данные. Вместо HTML-
страниц данные имеют формат, который удобнее использовать в других програм-
мах, таких как JSON и XML (в главе 16 содержится более подробная информация
о форматах).
Понятие «передача состояния представления» (Representational State Transfer,
REST) было определено Роем Филдингом (Roy Fielding) в его докторской диссерта-
ции. Многие продукты имеют REST-интерфейс или интерфейс RESTful. На практике
это часто означает, что они имеют веб-интерфейс — определения URL, предназна-
ченные для доступа к веб-сервису.
Сервис RESTful использует глаголы HTTP определенными способами, описан-
ными далее:
получает информацию о ресурсе, но не его данные;
получает данные ресурса с сервера. Это стандартный метод, используемый
вашим браузером. не должен применяться для создания, изменения или
удаления данных;
создает новый ресурс;
заменяет существующий ресурс, создавая его, если его нет;
частично обновляет ресурс;
— этот глагол говорит сам за себя: DELETE удаляет. Мы за правдивость
в рекламе!
Клиент RESTful также может запрашивать содержимое одного или нескольких
типов с помощью заголовков запроса HTTP. Например, сложный сервис с интер-
фейсом REST может принимать и возвращать данные в строках JSON.
ǷȖȐșȒȐȊȣȉȖȘȒȈȌȈȕȕȣȝ
Иногда вам нужно получить немного больше информации — рейтинг фильма, цену
акции или доступность продукта, — но требуемая информация доступна только на
HTML-страницах, при этом окружена рекламой и посторонним контентом.
Вы можете извлечь необходимую информацию вручную, сделав следующее.
1. Введите URL в браузер.
2. Подождите, пока загрузится удаленная страница.
3. Просмотрите отображенную страницу на предмет необходимой информации.
ǫȓȈȊȈǸȈșȗțȚȣȊȈȍȔǪșȍȔȐȘȕțȦȗȈțȚȐȕț
4. Запишите ее где-нибудь.
5. Повторите процесс для связанных URL.
Однако гораздо более приятно автоматизировать некоторые из этих шагов.
Программа, автоматически получающая данные из Сети, называется краулером или
веб-пауком1. После того как содержимое было получено с одного из удаленных веб-
серверов, скрапер анализирует ее, чтобы найти иголку в стоге сена.
6FUDS\
Если вам нужно мощное решение, объединяющее в себе возможности краулера
и скрапера, то стоит загрузить Scrapy (KWWSVFUDS\RUJ):
ɛpip install scrapy
Эта команда установит сам модуль и программу , работающую в команд-
ной строке.
Scrapy — это фреймворк, а не модуль, в отличие от . Он имеет боль-
ше возможностей, но зачастую его трудно настроить. Чтобы узнать больше о Scrapy,
прочтите Scrapy at a Glance (KWWSVRUHLOO\,<RH) и руководство (KWWSVRUHLOO\+B$:).
%HDXWLIXO6RXS
Если у вас уже есть HTML-данные с сайта и вы просто хотите извлечь оттуда дан-
ные, то вам подойдет (KWWSVRUHLOO\FP9). Анализировать HTML
труднее, чем кажется. Это происходит потому, что большая часть HTML-кода
на общедоступных веб-страницах технически некорректна: незакрытые теги, не-
правильная вложенность и прочие усложнения. Если вы пытаетесь написать свой
HTML-анализатор с помощью регулярных выражений, которые мы рассматривали
в разделе «Текстовые строки: регулярные выражения» на с. 253, то довольно скоро
столкнетесь с подобным беспорядком.
Чтобы установить , введите следующую команду (не забудьте по-
ставить в конце ɫ, иначе pip попробует установить более старую версию и, возможно,
выдаст ошибку):
ɛpip install beautifulsoup4
Теперь воспользуемся им для того, чтобы получить все ссылки с веб-страницы.
HTML-элемент a — это ссылка, а href — ее атрибут, который представляет собой
место назначения ссылки. В примере 18.13 мы определим функцию ɏſƀ,
которая делает грязную работу, и основную программу, получающую один или не-
сколько URL как аргументы командной строки.
ǷȘȐȔȍȘOLQNVS\
ɏſƀś
ɫ
ʰŜſƀ
1
Неприятный термин, если вы арахнофоб.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ʰŜ
ʰſƀ
ʰƃŜſɐɐƀ ŜɏſɐɐƀƄ
ɏɏɏɏʰʰɐɏɏɏɏɐś
ŜƃɨśƄś
ſɐɐřƀ
řſɏſƀřʰɨƀś
ſřƀ
ſƀ
Я сохранил эту программу под именем Ŝ, а затем запустил с помощью
данной команды:
ɛpython [Link] [Link]
Взгляните на первые несколько отображенных строк:
śŵŵŜŵ
ɨśŵŵŜŵŜ
ɩśŵŵŜŵ ŵŵ
ɪśŵŵŜŵ ŵŵ
ɫśŵŵŜŵ ŵ
ɬśŵŵŜŵ ŵŵ
ɭśŵŵŜŜŵ
ɮ śſɥƀ
ɯśŵŵŜŜŵ
ɰśŵŵŜŵ
ɨɥśŵŵŜŵ
5HTXHVWV+70/
Кеннет Ритц, автор популярного пакета для работы с веб-клиентами requests, на-
писал новую библиотеку для скрапинга, которая называется Requests-HTML (KWWS
KWPOS\WKRQUHTXHVWVRUJ) (для Python 3.6 и более новых версий).
Она получает страницу и обрабатывает ее элементы, поэтому вы, например,
можете найти все ссылки, все содержимое или атрибуты любого элемента HTML.
Библиотека имеет простой дизайн, похожий на requests и другие пакеты этого
автора. В конечном счете она может быть проще в использовании, чем
или Scrapy.
ǬȈȊȈȑȚȍȗȖșȔȖȚȘȐȔȜȐȓȤȔ
Напишем полноценную программу.
Она будет искать видео с помощью API архива Internet Archive1. Это один из
немногих API, которые позволяют получить анонимный доступ, и он будет суще-
ствовать и после того, как данная книга будет напечатана.
1
Если помните, я использовал еще один API для работы с архивами в основном примере
главы 1.
ǫȓȈȊȈǸȈșȗțȚȣȊȈȍȔǪșȍȔȐȘȕțȦȗȈțȚȐȕț
ǩȖȓȤȠȐȕșȚȊȖȊȍȉ$3,ȚȘȍȉțȦȚȖȚȊȈșȗȖȓțȟȐȚȤȒȓȦȟ$3,ȐȗȘȍȌȖșȚȈȊȓȧȚȤȍȋȖȊșȧȒȐȑ
ȘȈȏȒȖȋȌȈȊȣȝȖȚȐȚȍȗȖȓțȟȐȚȤȒȕȍȔțȌȖșȚțȗǷȖȟȍȔț"ȅȚȖ©ȚȘȈȋȍȌȐȧȖȉȡȐȕª²
ȉȍșȗȓȈȚȕȣȍȘȍșțȘșȣșȈȕȖȕȐȔȕȣȔȌȖșȚțȗȖȔȏȈȟȈșȚțȦȐșȗȖȓȤȏțȦȚșȧșȓȐȠȒȖȔȔȕȖȋȖ
ȐȕȍȗȘȈȊȐȓȤȕȖǪȖȚȗȖȟȍȔțțȕȈșȕȍȔȖȎȍȚȉȣȚȤȝȖȘȖȠȐȝșȍȘȊȐșȖȊ
ǷȘȐȔȍȘLDPRYLHVS\
ɨɑɑɑǭȔȝȘșȠȖȜȘșȢȖ
ɩȣȢȨȤȔȗȠșȡȦȧȡȔțȖȔȡȜȳȜȢȦȢȕȤȔțȜȠșȗȢŜɑɑɑ
ɪ
ɫ
ɬ
ɭ
ɮ
ɯ ſƀś
ɰɑɑɑǢȢțȖȤȔȭȔșȠȥȣȜȥȢȞȞȢȤȦșȚșȝřȥȢȥȦȢȳȭȜȩȜțȦȤșȩȱȟșȠșȡȦȢȖ
ɨɥſȜȘșȡȦȜȨȜȞȔȦȢȤřțȔȗȢȟȢȖȢȞřȢȣȜȥȔȡȜșƀřȞȢȦȢȤȯșȢȣȜȥȯȖȔȲȦȖȜȘșȢȤȢȟȜȞȜř
ɨɨȫȰȜțȔȗȢȟȢȖȞȜȫȔȥȦȜȫȡȢȥȢȢȦȖșȦȥȦȖȧȲȦțȡȔȫșȡȜȲȣșȤșȠșȡȡȢȝŜɑɑɑ
ɨɩ ɏʰɑśŵŵ Ŝŵ Ŝɑ
ɨɪʰƇ
ɨɫɑɑśɑśſƇƈƀśſƀɑŜſƀř
ɨɬɑɑśɑřř ɑř
ɨɭɑɑśɑɑř
ɨɮɑɑśɨɥř
ɨɯɑɑśɨř
ɨɰƈ
ɩɥʰŜſ ɏřʰƀ
ɩɨʰŜſƀ
ɩɩ ʰƃſ ƃɑɑƄř ƃɑɑƄř ƃɑ ɑƄƀ
ɩɪ ƃɑɑƄƃɑ ɑƄƄ
ɩɫ
ɩɬ
ɩɭ ſ ƀś
ɩɮɑɑɑǢȯȖșȘșȠȡȢȠșȤȥȦȤȢȞȜřțȔȗȢȟȢȖȢȞȜȫȔȥȦȜȫȡȢșȢȣȜȥȔȡȜșȘȟȳ
ɩɯȞȔȚȘȢȗȢȞȢȤȦșȚȔȜțȥȣȜȥȞȔś ŜǯȢțȖȢȟȜȠȣȢȟȰțȢȖȔȦșȟȲȖȯȕȤȔȦȰ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ɩɰȡȢȠșȤȥȦȤȢȞȜŜǥȥȟȜȢȡȞȢȤȤșȞȦșȡřȖșȤȡșȠȣșȤȖȯȝȱȟșȠșȡȦȖȯȕȤȔȡȡȢȗȢ
ɪɥȞȢȤȦșȚȔſɑȜȘșȡȦȜȨȜȞȔȦȢȤɑƀŜǢȣȤȢȦȜȖȡȢȠȥȟȧȫȔșȖșȤȡșȠŜɑɑɑ
ɪɨʰſ ƀŞɨ
ɪɩř ſ ƀś
ɪɪſɑƇƈśſƇ ƃɨƄƈƀƇ ƃɩƄƃśɪɥƄƈŜŜŜɑƀ
ɪɫʰſɑ ſɥƇƈƀţɑƀ
ɪɬś
ɪɭ ƃſƀƄƃɥƄ
ɪɮ ś
ɪɯ
ɪɰ
ɫɥſƀś
ɫɨɑɑɑǮȦȢȕȤȔțȜȠȖȜȘșȢȜțȔȤȩȜȖȔȖȕȤȔȧțșȤșȥȣȢȠȢȭȰȲȜȘșȡȦȜȨȜȞȔȦȢȤȔɑɑɑ
ɫɩɏʰɑśŵŵ ŜŵŵƇƈɑŜſƀ
ɫɪſɑɑřɏƀ
ɫɫŜſɏƀ
ɫɬ
ɫɭſƀś
ɫɮɑɑɑǭȔȝȘșȠȖȥșȨȜȟȰȠȯřȫȰșȡȔțȖȔȡȜșȥȢȢȦȖșȦȥȦȖȧșȦțȡȔȫșȡȜȲȣșȤșȠșȡȡȢȝ
ɫɯśŜdzțȡȔșȠȖȯȕȢȤȣȢȟȰțȢȖȔȦșȟȳȜȢȦȢȕȤȔțȜȠșȗȢȖȕȤȔȧțșȤșŜɑɑɑ
ɫɰʰ ſƀ
ɬɥś
ɬɨʰ ſƀ
ɬɩś
ɬɪſƀ
ɬɫś
ɬɬſɑ ɑƀ
ɬɭś
ɬɮſɑɑřƀ
ɬɯ
ɬɰɏɏɏɏʰʰɑɏɏɏɏɑś
ɭɥſŜƃɨƄƀ
Вот что я получил, запустив эту программу и выполнив поиск для буквосочета-
ния eegah1:
ɛpython [Link] eegah
ɥśſƀ śŜŜŜ
ɨśſƀŜŜŜ
ɩśſƀ ŜŜŜ
ɪśſſɨɰɭɩƀƀŜŜŜ
ɫśſ ɐɑɑŞɩƀŜŜŜ
ɬśſ ƀŞ ŜŜŜ
ɭśſ ɐɑɑŞɨƀ ŜŜŜ
ɮśſśƀ ŜŜŜ
ſɥɮƀţɩ
śŵŵ Ŝŵŵ
1
В этом фильме Ричард Кил снялся в роли пещерного человека за много лет до того, как
сыграл Челюсти в фильме о Джеймсе Бонде.
ǫȓȈȊȈǸȈșȗțȚȣȊȈȍȔǪșȍȔȐȘȕțȦȗȈțȚȐȕț
ǸȐșǸȍȏțȓȤȚȈȚȗȖȐșȒȈȜȐȓȤȔȈ
ǿȐȚȈȑȚȍȌȈȓȍȍ
Следующая глава чрезвычайно практична, в ней рассматриваются основы совре-
менной разработки на Python. Узнайте же, как стать хладнокровным питонщиком.
ǻȗȘȈȎȕȍȕȐȧ
18.1. Если вы еще не установили Flask, то сделайте сейчас. Это также позволит
установить , ɩ и, возможно, другие пакеты.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
18.2. Создайте скелет сайта с помощью веб-сервера Flask. Убедитесь, что сервер
начинает свою работу по адресу на стандартном порте 5000. Если
ваш компьютер уже использует этот порт для чего-то еще, то воспользуйтесь
другим портом.
18.3. Добавьте функцию ſƀ для обработки запросов к главной странице. Пусть
она возвращает строку ɐ Š.
18.4. Создайте шаблон для ɩ, который называется Ŝ и содержит сле-
дующий контент:
ʳʴ
ʳʴ
ʳʴ ɐŠʳŵʴ
ʳʴ
ɐ ƇƇƈƈř ƇƇƈƈ
ƇƇ ƈƈŜ
ʳŵʴ
ʳŵʴ
Эллиот Лох
Эта глава посвящена науке и искусству разработки с помощью Python, она содер-
жит практические рекомендации и правила хорошего тона. Изучите их, и вы тоже
сможете стать настоящим питонщиком.
ǶȗȘȖȋȘȈȔȔȐȘȖȊȈȕȐȐ
Для начала я хочу сказать пару слов о программировании с высоты личного
опыта.
Я начинал свою деятельность в области науки и обучился программированию,
чтобы анализировать и отображать экспериментальные данные. Мне казалось, про-
граммирование окажется похожим на бухгалтерский учет: будет точным и скучным.
Но я удивился, когда понял, что мне это нравится. Одними из интересных для меня
аспектов стали логическая — программирование похоже на складывание пазлов —
и творческая составляющие. Вы должны написать программу так, чтобы получить
правильные результаты, но вольны написать ее тем способом, который вам больше
нравится. Такое соотношение использования левого и правого полушарий мозга
необычно.
Начав свою карьеру в программировании, я также узнал, что в этой области су-
ществует множество ниш для разных задач и типов людей. Вы можете погрузиться
в область компьютерной графики, операционных систем, бизнес-приложений
и даже науки.
Если вы программист, то у вас мог быть похожий опыт. В противном случае
можете попробовать начать программировать, чтобы посмотреть, подходит ли это
вам или хотя бы помогает ли решить какие-либо задачи. Как я уже писал в данной
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
книге, знание математики здесь не так уж важно. Скорее всего, самое главное —
способность мыслить логически и склонность к языкам, что может помочь при про-
граммировании. Наконец, вам пригодится терпение, особенно если вы отслеживаете
баг в своем коде.
ǰȡȍȔȒȖȌȕȈ3\WKRQ
Когда вам нужно написать некий код, самым быстрым решением является кража…
из тех источников, которые позволяют это делать.
Стандартная библиотека Python (KWWSGRFVS\WKRQRUJOLEUDU\) широка, глубока
и довольно понятна.
Как и в случае с залами славы в спорте, модулю требуется время, чтобы попасть
в стандартную библиотеку. Новые пакеты появляются довольно часто, и на про-
тяжении этой книги я отмечал те из них, которые либо делают что-то новое, либо
улучшают что-то старое. Python поставляется сразу «с батарейками», но иногда вам
нужна батарейка другого вида.
Так где же, помимо стандартной библиотеки, следует искать хороший код
Python?
Первое место, на которое вы должны обратить внимание, — это каталог пакетов
Python (Python Package Index, PyPI) (KWWSVS\SLRUJ). Ранее носивший имя Cheese
Shop в честь скетча Monty Python, данный сайт постоянно обновляется — на момент
написания этой книги он содержит более 113 000 пакетов. Когда вы используете
pip (см. следующий раздел), он ищет пакет на сайте PyPI. Основная страница PyPI
показывает самые свежие пакеты. Вы также можете выполнить прямой поиск, вве-
дя что-нибудь в строку поиска посередине главной страницы PyPI. Например, по
ключевому слову genealogy определяется 21 совпадение, а по слову — 528.
Еще один популярный репозиторий — GitHub. Взгляните, какие пакеты Python
популярны в данный момент (KWWSVJLWKXEFRPWUHQGLQJ"O S\WKRQ).
Сайт Popular Python recipes (KWWSELWO\SRSXODUUHFLSHV) содержит более 4000 ко-
ротких программ Python на любую тему.
ǻșȚȈȕȖȊȒȈȗȈȒȍȚȖȊ
Существует множество способов установить пакет Python.
Использовать pip, если есть такая возможность. На данный момент это самый
распространенный метод установки. С помощью pip вы можете установить
большинство пакетов.
Задействовать pipenv, в нем объединены pip и virtualenv.
Иногда вы можете применить менеджер пакетов своей операционной системы.
Использовать , если вы выполняете большое количество научной работы
и хотите задействовать дистрибутив Python, который называется Anaconda.
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
SLS
Использование пакетов Python имело несколько ограничений. Более ранний инстру-
мент для установки ɏ был заменен pip, но ни один из них не находился
в стандартном пакете Python. Если мы должны устанавливать пакеты с помощью
pip, то где же его взять? Начиная с Python 3.4, pip наконец-то включили в стандарт-
ный пакет Python, чтобы избежать подобного экзистенциального кризиса. Если вы
работаете с более ранней версией Python и у вас не установлен pip, то можете скачать
его, перейдя по ссылке KWWSZZZSLSLQVWDOOHURUJ.
Простейший вариант использования pip — установка последней версии одного
пакета с помощью следующей команды:
ɛpip install flask
Или минимальную версию (это полезно, когда некая особенность, без которой
вы жить не можете, появляется только в определенной версии):
ɛɐʶɥŜɰŜɥɐ
YLUWXDOHQY
Стандартный способ установки сторонних пакетов — это использование pip
и virtualenv . Я покажу, как устанавливать virtualenv , в разделе «Установка
virtualenv» приложения Б на с. 535.
Виртуальное окружение — это обычный каталог, содержащий интерпретатор
Python, несколько других программ наподобие pip, а также некие пакеты. Вы мо-
жете активизировать его, запустив сценарий оболочки, который лежит в каталоге
bin этого виртуального окружения. Это изменит значение переменной окружения
ɛ , и теперь ваша оболочка будет знать, где искать программы. Активизируя
виртуальное окружение, вы помещаете его каталог bin перед остальными катало-
гами в переменной ɛ . В результате, когда вы введете такие команды, как pip
или python, ваша оболочка сначала найдет те программы, которые располагаются
в вашем виртуальном окружении, а не те, что находятся в системных каталогах на-
подобие ŵ, ŵŵ или ŵŵ ŵ.
Вы не захотите устанавливать программы в эти системные каталоги в любом
случае, поскольку:
у вас нет разрешения на запись в них;
даже если бы вы могли выполнить запись, переписывание стандартных программ
вашей системы (такой как python) может вызвать проблемы.
SLSHQY
Недавно появился пакет pipenv (KWWSVJLWKXEFRPS\SDSLSHQY), в котором объединены
уже знакомые нам pip и virtualenv. Вдобавок он решает проблемы с зависимостями,
которые могут возникнуть при использовании pip в разных окружениях (например,
на локальной машине, а также на этапе подготовки и развертывания):
ɛpip install pipenv
ǴȍȕȍȌȎȍȘȗȈȒȍȚȖȊ
Операционная система macOS от Apple содержит сторонние менеджеры пакетов
homebrew (brew) (KWWSEUHZVK) и ports (KWWSZZZPDFSRUWVRUJ). Они работают при-
мерно так же, как и pip, но не ограничены пакетами Python.
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
ǻșȚȈȕȖȊȒȈȐȏȐșȝȖȌȕȖȋȖȒȖȌȈ
Иногда пакет еще совсем новый или же автор просто не сделал его доступным через
pip. Чтобы создать пакет, вы, как правило, делаете следующее:
загружаете код;
извлекаете файлы с помощью , tar или другого подходящего инструмента,
если они заархивированы или сжаты;
запускаете команду python Ŝ install в каталоге, который содержит файл
Ŝ.
DzȈȒȊșȍȋȌȈȊȈȔșȓȍȌțȍȚȉȣȚȤȖșȚȖȘȖȎȕȣȔȐșȚȍȔȟȚȖȊȣșȒȈȟȐȊȈȍȚȍȐțșȚȈȕȈȊȓȐ
ȊȈȍȚȍǪȗȘȖȋȘȈȔȔȈȝȕȈȗȐșȈȕȕȣȝȕȈ3\WKRQȊȘȍȌȖȕȖșȕȣȑȒȖȌșȗȘȧȚȈȚȤȚȘțȌȕȍȍ
ȗȖșȒȖȓȤȒțȖȕȐȗȘȍȌșȚȈȊȓȧȦȚșȖȉȖȑȟȐȚȈȉȍȓȤȕȣȑȚȍȒșȚȕȖȐȕȖȋȌȈȥȚȖșȓțȟȈȍȚșȧ
ǰȕȚȍȋȘȐȘȖȊȈȕȕȣȍșȘȍȌȣȘȈȏȘȈȉȖȚȒȐ
Для написания программ, представленных в данной книге, я использовал текстовый
интерфейс, но это не значит, что вы должны запускать весь код в консоли или тек-
стовом окне. Существует множество бесплатных и коммерческих интегрированных
сред разработки (Integrated Development Environment, IDE), которые являются гра-
фическими интерфейсами, поддерживающими такие инструменты, как текстовые
редакторы, отладчики, поиск по библиотеке и т. д.
,'/(
IDLE (KWWSELWO\S\LGOH) — это IDE, предназначенная только для Python, которая
поставляется со стандартным дистрибутивом. Она основана на интерфейсе tkinter
и имеет простой GUI.
3\&KDUP
PyCharm (KWWSZZZMHWEUDLQVFRPS\FKDUP) — это относительно новая графическая
IDE, имеющая множество возможностей. Версия для сообщества бесплатна, также
вы можете получить бесплатную лицензию для профессиональной версии, чтобы ис-
пользовать ее для обучения или работы над проектом с открытым исходным кодом.
На рис. 19.1 показан ее начальный экран.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǸȐșǵȈȟȈȓȤȕȣȑȥȒȘȈȕ3\&KDUP
,3\WKRQ
IPython (KWWSLS\WKRQRUJ) начал свой путь как улучшенная терминальная (тексто-
вая) IDE для Python, но затем эволюционировал и приобрел графический интер-
фейс, похожий на блокнот. Он интегрировал множество пакетов, рассмотренных
в этой книге, включая Matplotlib и NumPy, и стал популярным инструментом для
научных вычислений.
Вы можете установить базовую текстовую версию (как уже догадались) с по-
мощью команды pip install ipython. Запустив ее, вы увидите нечто похожее на
следующий блок:
ɛipython
ɪŜɮŜɪſɪŜɮŜɪśɫ ɭɨɩřɩɬɩɥɨɰřɨɭśɪɰśɥɥƀ
ɐ ɐřɐ ɐɐ ɐ
ɮŜɪŜɥŞŞ ŜɐţɐŜ
ƃɨƄś
ƃɩƄś
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
ƃɬƄśanswer?
ś
śɫɩ
ś
ſʰɥƀŞʴ
ſřʰɨɥƀŞʴ
řɥ
Ŝ řŜɏɏɏɏſƀŜ ř
Ŝ
řř
ř
Ŝ ɐʫɐɐŞɐ
ŜɨɥŜɥɩŞɪɭŜ
ɥŜ
ʴʴʴſɐɥɨɥɥɐřʰɥƀ
ɫ
Поиск по имени — это популярная возможность такой IDE, как IPython. Если
вы нажмете клавишу 7DE после того, как введете некие символы, то IPython пока-
жет все переменные, ключевые слова и функции, начинающиеся с этих символов.
Определим некоторые переменные, а затем найдем все, что начинается с буквы f:
ƃɭƄśfee = 1
ƃɮƄśfie = 2
ƃɯƄśfo = 3
ƃɰƄśfum = 4
ƃɨɥƄśftab
ʩʩ
Если вы введете fe, а затем нажмете клавишу 7DE, то увидите только переменную
fee, единственную переменную в этой программе, которая начинается с буквосоче-
тания fe:
ƃɨɨƄśfee
ƃɨɨƄśɨ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
-XS\WHU1RWHERRN
Jupyter (KWWSVMXS\WHURUJ) — это эволюционировавший IPython. В его названии объ-
единены языки Julia, Python и R — все они популярны в области науки о данных
и научных вычислений. Jupyter Notebooks — современный способ разработки и пу-
бликации вашего кода, содержащий документацию к этим языкам.
Если вы хотите исследовать его, не устанавливая на свой компьютер, то можете
запустить его (KWWSVMXS\WHURUJWU\) в браузере.
Чтобы установить Jupyter Notebook локально, введите команду pip install
. Запустите его с помощью .
-XS\WHU/DE
JupyterLab — это Jupyter Notebook нового поколения, в конечном счете он заменит
старую версию. Как и в случае с Notebook, вы сначала можете попробовать (KWWSV
MXS\WHURUJWU\) JupyterLab в своем браузере. Установить его локально можно с помо-
щью команды pip install , а запустить — с помощью lab.
ǰȔȍȕȖȊȈȕȐȍȐȌȖȒțȔȍȕȚȐȘȖȊȈȕȐȍ
Вы не вспомните написанное. Иногда случается так, что я смотрю на код, даже на
тот, который написал недавно, и не понимаю, откуда он взялся. Именно поэтому
полезно документировать собственный код. Это могут быть комментарии; также
полезно давать переменным, функциям, модулям и классам осмысленные имена.
Однако не перегибайте палку, как в этом примере:
ʴʴʴɤǧȘșȥȰȳȥȢȕȜȤȔȲȥȰȣȤȜȥȖȢȜȦȰțȡȔȫșȡȜșɨɥȣșȤșȠșȡȡȢȝɑɑś
ŜŜŜʰɨɥ
ʴʴʴɤǭȔȘșȲȥȰřȱȦȢȥȤȔȕȢȦȔȟȢŜ
ŜŜŜſƀ
ɨɥ
ʴʴʴɤǴȧȩŜ
ǷȘȐȔȍȘIWRFS\
ſɏƀś
ɑ ʳɏʴŜɑ
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
ɏɏʰɩɨɩŜɥ
ɏɏʰɪɩŜɥ
ɏɏʰɨɥɥŜɥ
ɏɏʰɥŜɥ
ɏʰɏɏŞɏɏ
ɏʰ ɏɏŞ ɏɏ
ɏ ɏʰ ɏŵɏ
ɏʰſɏŞɏɏƀƋɏ ɏʫ ɏɏ
ɏ
ɏɏɏɏʰʰɐɏɏɏɏɐś
ɏƃŞɫɥŜɥřɥŜɥřɪɩŜɥřɨɥɥŜɥřɩɨɩŜɥƄś
ɏʰ ſɏƀ
ſɐʩ ʰʴʩɐʩſɏř ɏƀƀ
Запустим тесты:
ɛpython [Link]
ŞɫɥŜɥɥɥɥɥɥ ʰʴŞɫɥŜɥɥɥɥɥɥ
ɥŜɥɥɥɥɥɥ ʰʴŞɨɮŜɮɮɮɮɮɯ
ɪɩŜɥɥɥɥɥɥ ʰʴɥŜɥɥɥɥɥɥ
ɨɥɥŜɥɥɥɥɥɥ ʰʴɪɮŜɮɮɮɮɮɯ
ɩɨɩŜɥɥɥɥɥɥ ʰʴɨɥɥŜɥɥɥɥɥɥ
ǷȘȐȔȍȘIWRFS\
ɏ ɏʰɩɨɩŜɥ
ɏ ɏʰɪɩŜɥ
ɏ ɏʰɨɥɥŜɥ
ɏ ɏʰɥŜɥ
ɏ ʰ ɏ ɏŞ ɏ ɏ
ɏ ʰɏ ɏŞɏ ɏ
ɏɏ ʰɏ ŵ ɏ
ſɏƀś
ɑ ʳɏʴŜɑ
ɏʰſɏŞ ɏ ɏƀƋ ɏɏ ʫɏ ɏ
ɏ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ɏɏɏɏʰʰɐɏɏɏɏɐś
ɏƃŞɫɥŜɥřɥŜɥřɪɩŜɥřɨɥɥŜɥřɩɨɩŜɥƄś
ɏʰ ſɏƀ
ſɐʩ ʰʴʩɐʩſɏř ɏƀƀ
ǬȖȉȈȊȓȍȕȐȍȗȖȌșȒȈȏȖȒȚȐȗȖȊ
Статические языки требуют от вас определять типы переменных, они могут отлавли-
вать ошибки на этапе компиляции. Как вам известно, Python так не делает, вы можете
столкнуться с багом только при запуске кода. Переменные в Python — это имена, они
лишь ссылаются на реальные объекты. Объекты имеют строго определенный тип, но
имя может указывать на разные объекты в различные моменты времени.
В реальном коде (на Python и других языках) имя, как правило, ссылается на
конкретный объект. Было бы полезно, по крайней мере в документации, если бы мы
могли оставлять аннотации (к объектам, возвращаемым значениям функций и т. д.),
указывавшие бы на ожидаемый тип объекта, на который они ссылаются. В таком
случае разработчикам не пришлось бы просматривать большое количество кода,
чтобы увидеть, как переменная должна вести себя.
В Python версий 3.х для решения этой проблемы были добавлены подсказки
типов (или аннотации типов). Ими пользоваться не обязательно, они не задают
жесткий тип переменной. Подсказки типов предназначены для того, чтобы помочь
разработчикам, привыкшим к статическим языкам, понять, где должны быть объ-
явлены типы переменных.
Подсказка для функции, которая преобразует строку в число, может выглядеть
так:
ɏɏſśƀŞʴś
ſƀ
Это лишь подсказки, они не меняют способ работы Python. Они нужны для
документирования, однако люди придумывают и другое применение. Например,
веб-фреймворк FastAPI (KWWSVIDVWDSLWLDQJRORFRP) использует подсказки для того,
чтобы сгенерировать веб-документацию, а также лайв-формы для тестирования.
ǺȍșȚȐȘȖȊȈȕȐȍȒȖȌȈ
Возможно, вы уже знаете, однако на всякий случай напомню: даже тривиальные
изменения в коде могут сломать вашу программу. В Python недостает проверки
типов, присущей статическим языкам, что упрощает некоторые аспекты програм-
мирования, но повышает вероятность получить нежелательные результаты. Тести-
рование — это важно.
Самый простой способ протестировать программы, написанные на Python, —
добавить операторы ſƀ. Read-Evaluate-Print Loop (REPL) интерактивного
интерпретатора позволяет быстро изменять код и тестировать изменения. Однако
в производственном коде операторы ſƀ использовать не стоит, поэтому вам
нужно помнить о том, что их все следует удалять.
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
ǷȘȖȋȘȈȔȔȣS\OLQWS\IODNHVIODNHȐȓȐ3(3
Следующий шаг перед созданием настоящих программ для тестирования — исполь-
зование контролера кода Python. Самыми популярными являются pylint (KWWS
ZZZS\OLQWRUJ) и (KWWSELWO\S\IODNHV). Вы можете установить любой из них
(или даже оба) с помощью pip:
ɛpip install pylint
ɛpip install pyflakes
ǷȘȐȔȍȘVW\OHS\
ʰɨ
ʰɩ
ſƀ
ſƀ
ſ ƀ
Если пролистать дальше, к разделу evaluation, то можно увидеть наш счет
(10.0 — это высший балл):
ŞɪŜɪɪŵɨɥ
ǷȘȐȔȍȘVW\OHS\
ʰɨ
ʰɩ
ʰɪ
ſƀ
ſƀ
ſ ƀ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ɛpylint [Link]
ř
ƋƋƋƋƋƋƋƋƋƋƋƋƋɩ
śɨřɥś
śɨřɥś ɑɑ
ſ ſſƃŞɏƄƃŞɥŞɰɏƄƋƀŶſɏɏŜƋɏɏƀƀɛƀ
śɩřɥś ɑɑ
ſ ſſƃŞɏƄƃŞɥŞɰɏƄƋƀŶſɏɏŜƋɏɏƀƀɛƀ
śɪřɥś ɑ ɑ
ſ ſſƃŞɏƄƃŞɥŞɰɏƄƋƀŶſɏɏŜƋɏɏƀƀɛƀ
ǷȘȐȔȍȘVW\OHS\
ɑ ɑ
ſƀś
ɑ Ŝ řŠɑ
ʰɨ
ʰɩ
ʰɪ
ſƀ
ſ ƀ
ſƀ
ſƀ
ɛpylint [Link]
ř
Не так уж и плохо?
Еще один контролер стиля — ɯ (KWWSVS\SLS\WKRQRUJS\SLSHS), вы можете
установить его привычным способом:
ɛpip install pep8
Чтобы сделать код еще более стильным, он рекомендует добавить пустую строку
после начальной строки документации модуля.
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
ǷȈȒȍȚXQLWWHVW
Мы убедились, что больше не оскорбляем чувство стиля богов кода, поэтому теперь
можно перейти к настоящим тестам логики вашей программы.
Хорошим тоном являются написание и запуск тестовых программ до отправки
кода в систему контроля исходного кода. Написание тестов поначалу может быть
утомительным, но они действительно помогают находить проблемы быстрее, осо-
бенно регрессионные тесты (суть которых заключается в том, чтобы сломать то,
что раньше работало). Болезненный опыт учит всех разработчиков: даже самое
маленькое изменение, которое, по их заверениям, не затрагивает другие области при-
ложения, на самом деле влияет на них. Если вы взглянете на качественные пакеты
Python, то заметите, что они поставляются с набором тестов.
Стандартная библиотека содержит не один, а целых два пакета для тестирова-
ния приложений. Начнем с unittest (KWWSVRUHLOO\,P)P(). Мы напишем модуль,
который записывает слова с прописной буквы. Наша первая версия будет ис-
пользовать стандартную строковую функцию ſƀ, что, как вы увидите,
приведет к неожиданным результатам. Сохраните этот файл под именем Ŝ
(пример 19.6).
ǷȘȐȔȍȘFDSS\
ɏɏſƀś
Ŝ ſƀ
ǷȘȐȔȍȘWHVWBFDSS\
ſŜƀś
ſƀś
ſƀś
ɏɏſƀś
ʰɐ ɐ
ʰ Ŝɏɏſƀ
Ŝſřɐ ɐƀ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ɏɏſƀś
ʰɐ ɐ
ʰ Ŝɏɏſƀ
Ŝſřɐ ɐƀ
ɏɏɏɏʰʰɐɏɏɏɏɐś
Ŝſƀ
Ŝ
ʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰ
śɏɏſɏɏɏɏŜƀ
ŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞ
ſ ƀś
ɑɏ Ŝɑřɩɥřɏɏ
Ŝſřɐ ɐƀ
śɐ ɐŠʰɐ ɐ
Ş
ţɋɋɋɋ
ʫ
ţɋɋɋɋ
ŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞ
ɩɥŜɥɥɨ
ſʰɨƀ
ǷȘȐȔȍȘǪȖȏȊȘȈȡȈȍȔșȧȒFDSS\
ɏɏſƀś
Ŝſƀ
ŜŜ
ŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞ
ɩɥŜɥɥɥ
Все прошло отлично. Хотя на самом деле нет. Нам нужно добавить в файл ɏ
Ŝ как минимум еще один метод (пример 19.9).
ǷȘȐȔȍȘǪȖȏȊȘȈȡȈȍȔșȧȒWHVWBFDSS\
ɏɏɏſƀś
ʰɑ ɐɑ
ʰ Ŝɏɏſƀ
Ŝſřɑ ɐ ɑƀ
ŜŜ
ʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰ
śɏɏɏſɏɏɏɏŜƀ
ŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞ
ſ ƀś
ɑɏ Ŝɑřɩɬřɏɏɏ
Ŝſřɑ ɐ ɑƀ
śɑ ɐ ɑŠʰɑ ɐ ɑ
Ş ɐ
ţɋ
ʫ ɐ
ţɋ
ŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞ
ɪɥŜɥɥɨ
ſʰɨƀ
ǷȘȐȔȍȘǹȕȖȊȈȊȖȏȊȘȈȡȈȍȔșȧȒFDSS\
ɏɏſƀś
ſƀ
ɛpython test_cap.py
ŜŜŜ
ŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞ
ɪɥŜɥɥɫ
Наконец-то мы это сделали! Э-э-э, на самом деле нет. Нужно добавить еще один
тест в файл ɏ Ŝ (пример 19.11).
ǷȘȐȔȍȘǹȕȖȊȈȊȖȏȊȘȈȡȈȍȔșȧȒWHVWBFDSS\
ɏɏɏſƀś
ʰɑɎɑɐ řɎɑ ɑ
ʰ Ŝɏɏſƀ
ŜſřɑɎɑɐ řɎɑ ɑƀ
Сработало?
ɛpython test_cap.py
ŜŜŜ
ʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰ
śɏɏɏſɏɏɏɏŜƀ
ŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞ
ſ ƀś
ɑɏ Ŝɑřɪɥřɏɏɏ
ŜſřɑɎɑɐ
řɎɑ ɑƀśɐɑɎɐ řɑ
ɐ
ŠʰɐɑɎɐ řɑ ɐŞɑɐ řɑ
ţɋʫɑɐ řɑ
ţɋ
ŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞ
ɫɥŜɥɥɫ
ſʰɨƀ
Выглядит так, будто первая двойная кавычка смутила даже функцию ,
нашего текущего фаворита. Она попробовала увеличить символ " и уменьшить все
остальное (ɐ). Нам также нужно проверить, оставила ли функция-увеличитель
остальную часть строки нетронутой.
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
ǷȈȒȍȚGRFWHVW
Второй пакет для тестирования стандартной библиотеки — (KWWSELWO\S\
GRFWHVW). Он позволяет писать тесты внутри строки документации, которые и сами
будут служить документацией. Он выглядит как интерактивный интерпретатор:
символы ʴʴʴ , за ними следует вызов, а затем результаты в следующей строке.
Вы можете запустить некоторые тесты в интерактивном интерпретаторе и просто
вставить результат в свой тестовый файл. Модифицируем файл Ŝ (убрав тот
проблемный тест с кавычками) и сохраним его под именем ɩŜ, как показано
в примере 19.12.
ǷȘȐȔȍȘFDSS\
ɏɏſƀś
ɑɑɑ
ʴʴʴɏɏſɐ ɐƀ
ɐ ɐ
ʴʴʴɏɏſɐ ɐƀ
ɐ ɐ
ʴʴʴɏɏſɑ ɐɑƀ
ɑ ɐ ɑ
ɑɑɑ
ſƀ
ɏɏɏɏʰʰɐɏɏɏɏɐś
Ŝſƀ
ś
ɏɏſɐ ɐƀ
ś
ɐ ɐ
ś
ɏɏſɑ ɐɑƀ
ś
ɑ ɐ ɑ
ɨś
ɏɏɏɏ
ɨś
ɪɏɏɏɏŜɏɏ
ɪɩŜ
ɪɥŜ
Ŝ
ǷȈȒȍȚQRVH
Сторонний пакет nose (KWWSVRUHLOO\J:.U) — еще одна альтернатива пакету unittest.
Команда, позволяющая установить его, выглядит так:
ɛpip install nose
Вам не нужно создавать класс, который содержит тестовые методы, как мы де-
лали при работе с unittest. Любая функция, содержащая в своем имени слово test,
будет запущена. Модифицируем наш последний тестировщик и сохраним
его под именем ɏ ɏŜ (пример 19.13).
ǷȘȐȔȍȘWHVWBFDSBQRVHS\
ɩ
Ŝɏ
ɏɏſƀś
ʰɐ ɐ
ʰ Ŝɏɏſƀ
ɏſřɐ ɐƀ
ɏɏſƀś
ʰɐ ɐ
ʰ Ŝɏɏſƀ
ɏſřɐ ɐƀ
ɏɏɏſƀś
ʰɑ ɐɑ
ʰ Ŝɏɏſƀ
ɏſřɑ ɐ ɑƀ
ɏɏɏſƀś
ʰɑɎɑɐ řɎɑ ɑ
ʰ Ŝɏɏſƀ
ɏſřɑɎɑɐ řɎɑ ɑƀ
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
Запустим тесты:
ɛnosetests test_cap_nose.py
ŜŜŜ
ʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰ
śɏ ɏŜɏɏɏ
ŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞ
ſ ƀś
ɑŵŵŜŜŜŵŞ ŵŵ Ŝɑřɨɰɯř
ŜſƋŜƀ
ɑŵŵŜŜŜŵŵɏ ɏŜɑřɩɪřɏɏɏ
ɏſřɑɎɑɐ řɎɑ ɑƀ
śɐɑɎɐ řɑ ɐŠʰ
ɐɑɎɐ řɑ ɐ
ŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞ
ɫɥŜɥɥɬ
ſʰɨƀ
Мы нашли ту же ошибку, что и при использовании unittest. К счастью, в конце
этой главы приводится упражнение, в котором вам предстоит ее исправить.
ǬȘțȋȐȍȜȘȍȑȔȊȖȘȒȐȌȓȧȚȍșȚȐȘȖȊȈȕȐȧ
По какой-то причине людям нравится писать тестовые фреймворки для Python.
Если вам любопытно, то можете взглянуть на другие популярные решения:
(KWWSWR[UHDGWKHGRFVRUJ);
Ŝ (KWWSVS\WHVWRUJ);
green (KWWSVJLWKXEFRP&OHDQ&XWJUHHQ).
ǷȖșȚȖȧȕȕȈȧȐȕȚȍȋȘȈȞȐȧ
Когда ваша группа генерирует много кода каждый день, полезно автоматизировать
тесты по мере появления изменений. Вы можете автоматизировать системы кон-
троля версий так, чтобы тесты запускались при возникновении нового кода. Таким
образом, каждый будет знать, сломал ли кто-то сборку и убежал обедать пораньше —
или на новую работу.
Эти системы велики, и я не буду рассматривать детали их установки и исполь-
зования. Если они вам когда-нибудь понадобятся, то вы будете знать, где их искать:
(KWWSEXLOGERWQHW) — эта система контроля версий, написанная на
Python, автоматизирует построение, тестирование и выпуск кода;
(KWWSMHQNLQVFLRUJ) — система написана на Java, в данный момент вы-
глядит наиболее предпочтительным инструментом для постоянной интеграции;
Ş (KWWSWUDYLVFLFRP) — эта система автоматизирует проекты, размещен-
ные на GitHub, бесплатна для проектов с открытым исходным кодом;
(KWWSVFLUFOHFLFRP) — эта система коммерческая, но бесплатна для част-
ных проектов и проектов с открытым исходным кодом.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǶȚȓȈȌȒȈȒȖȌȈ
Отладка — почти как расследование преступления,
где главный преступник — тоже вы.
Филипе Фортес
Брайан Керниган
Всегда тестируйте код. Чем лучше ваши тесты, тем меньше кода вам потом при-
дется исправлять. Но иногда баги все равно случаются, и их нужно исправлять при
обнаружении.
Обычно код ломается из-за действий, которые вы сделали только что. Поэтому
обычно отладка выполняется «снизу вверх», начиная с ваших самых последних из-
менений1.
Но иногда причина кроется где-то еще, в чем-то, чему вы доверяли и думали, что
оно работает. Вы могли бы подумать: если бы проблема была в том, чем пользовались
многие люди, то кто-то уже заметил бы ее. Но так бывает не всегда. Самые хитрые
баги, которые требовали на свое исправление больше недели, появились из внешних
источников. Поэтому после того, как обвините человека в зеркале, пересмотрите
свои предположения. Данный подход называется нисходящим и занимает больше
времени.
Далее мы рассмотрим некоторые приемы отладки, начиная с быстрых и «гряз-
ных» и заканчивая медленными и зачастую такими же «грязными».
ǼțȕȒȞȐȧSULQW
Самый простой способ выполнять отладку в Python — построчно выполнять код.
Полезно отображать результат работы функции ſƀ, которая извлекает значения
ваших локальных переменных, включая аргументы функций:
ʴʴʴ ſƋřƋƋƀś
ŜŜŜſſƀƀ
ŜŜŜ
ʴʴʴ ſɨřɩřɪƀ
ƇɐɐśſɨřɩřɪƀřɐɐśƇƈƈ
ʴʴʴ ſƃɐɐřɐɐřɐɐƄƀ
ƇɐɐśſƃɐɐřɐɐřɐɐƄřƀřɐɐśƇƈƈ
1
Вы как детектив: «Я знаю, что я здесь! И если не выйду с поднятыми руками, то приду за
собой!»
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
ǶȚȓȈȌȒȈșȗȖȔȖȡȤȦȌȍȒȖȘȈȚȖȘȖȊ
Как вы уже знаете из раздела «Декораторы» главы 9, декоратор может вызывать код,
располагающийся до или после функции, не модифицируя его внутри нее самой.
Это значит, что вы можете использовать декоратор для выполнения какого-либо
действия до или после вызова любой функции, а не только тех, которые написали
вы. Определим декоратор , позволяющий вывести на экран входные аргументы
и выводимые значения любой функции по мере ее вызова (разработчики знают, что
выходные данные нужно декорировать), как показано в примере 19.14.
ǷȘȐȔȍȘGXPSS\
ſ ƀś
ɑſƀɑ
ſƋřƋƋƀś
ſɑ śɑř Ŝɏɏɏɏƀ
ſɑ śɑřɐɐŜſſřƀƀƀ
ſɑ śɑřŜſƀƀ
ʰ ſƋřƋƋƀ
ſɑśɑřƀ
ǷȘȐȔȍȘWHVWBGXPSS\
ɒ
ſƋřƋƋƀś
ɑɑ
ɏʰƃɩƋƄ
ɏ ʰƇśɩƋřŜſƀƈ
ɏřɏ
ɏɏɏɏʰʰɐɏɏɏɏɐś
ʰſɪřɬřʰɨɥɥřʰɰɯŜɭřʰŞɫɥƀ
Запустите пример:
ɛpython test_dump.py
ś
śɪɬ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ś ɏſƃſɐɐřɨɥɥƀřſɐɐřɰɯŜɭƀř
ſɐɐřŞɫɥƀƄƀ
śſƃɭřɨɥƄřƇɐɐśɩɥɥřɐɐśɨɰɮŜɩřɐɐśŞɯɥƈƀ
ǶȚȓȈȌȟȐȒSGE
Эти приемы полезны, но иногда ничто не сможет заменить настоящий отладчик.
Большинство IDE содержат отладчики, возможности и пользовательские интер-
фейсы которых могут варьироваться. В данном подразделе я опишу использование
стандартного отладчика Python (KWWSVRUHLOO\,,1\).
ǭșȓȐȊȣȏȈȗțșȒȈȍȚȍȗȘȖȋȘȈȔȔțșȜȓȈȋȖȔLȚȖȗȘȐȍȍȕȍțȌȈȟȕȖȔȏȈȊȍȘȠȍȕȐȐ3\WKRQ
ȊȍȘȕȍȚȊȈșȊȐȕȚȍȘȈȒȚȐȊȕȣȑȐȕȚȍȘȗȘȍȚȈȚȖȘ
ǷȘȐȔȍȘFLWLHVFVY
ř
ř
ř
ȧȘȔȟȜȦȰȣȤȢȕșȟȯȖȡȔȫȔȟșȜȞȢȡȪș
țȔȣȜȥȔȦȰȥȦȤȔȡȧȜȥȦȢȟȜȪȧȥȣȤȢȣȜȥȡȢȝȕȧȞȖȯ
ȖȯȖșȥȦȜȡȔȱȞȤȔȡȥȦȢȟȜȪȧřțȔȣȳȦȧȲȜȥȦȤȔȡȧ
ǷȘȐȔȍȘFDSLWDOVS\
ɏ ſƀś
ſřɐɐƀś
ś
ʰŜſƀ
ɐɐŜſƀś
ř ʰŜſɐřɐƀ
ʰ Ŝſƀ
ʰ Ŝſƀ
ſ Ŝſƀř Ŝſƀřʰɐřɐƀ
ɏɏɏɏʰʰɐɏɏɏɏɐś
ɏ ſŜƃɨƄƀ
ǷȘȐȔȍȘFLWLHVFVY
ř
ř
ř
ř
ř
ř
ř
ř
ř
ř Ü
ř
ř
ř
ř
quit
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ř
ř
ř
ř
ř
ʴŵŵ ŵŵ Ŝſɨƀʳʴſƀ
Şʴ ɏ ſƀś
Программа завершилась нормально, точно так же, как и раньше, когда мы запу-
скали ее вне отладчика. Попробуем запустить ее снова, использовав специальные
команды, чтобы сузить место поиска проблемы. Похоже, имеет место логическая
ошибка, а не синтаксическая проблема или исключение (которые бы выдали со-
общение об ошибке).
Введите s (step — «шаг»), чтобы пройти по отдельным строкам кода. Это позво-
лит пройти по всем строкам кода Python: вашим, стандартной библиотеки и любых
других применяемых вами модулей. Используя команду s, вы также входите во все
функции и проходите каждую построчно. Введите n (next — «следующий»), чтобы
идти по шагам, но не заходить внутрь функций: когда вы находитесь на строке,
где вызывается функция, эта команда выполняет всю функцию и вы оказываетесь
на следующей строке. Используйте s, если не уверены в том, где конкретно есть
проблема, а n — будучи уверенными, что некая функция не вызывает проблем,
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
особенно когда она длинная. Зачастую вы будете проходить построчно весь свой
код и пропускать библиотечный, поскольку подразумевается, что он хорошо проте-
стирован. Используем s с целью начать двигаться от начала программы к функции
ɏ ſƀ:
ſƀs
ſƀs
ſƀs
ſƀs
ŞŞŞŞ
ʴŵŵ ŵŵ Ŝſɨƀ ɏ ſƀ
Şʴ ɏ ſƀś
ſƀs
ʴŵŵ ŵŵ Ŝſɩƀ ɏ ſƀ
Şʴſřɐɐƀś
случае мы хотим узнать, почему функция ɏ ſƀ вызывает завершение
программы до прочтения всех введенных строк. Строка 3 (for line in ś) будет
считывать каждую строку входного файла, поэтому выглядит невинно. Единствен-
ное место, где мы можем вернуться из функции до прочтения всех данных, — это
строка 6 (return). Поставим точку останова на этой строке:
ſƀb 6
Далее продолжим выполнение программы до тех пор, пока она либо не достигнет
точки останова, либо не завершится обычным образом:
ſƀc
ř
ř
ř
ř
ř
ʴŵŵ ŵŵ Ŝſɭƀ ɏ ſƀ
Şʴ
Ага, она остановилась на точке останова в строке 6. Это показывает, что програм-
ма хочет завершиться после прочтения страны, которая идет вслед за Колумбией.
Выведем значение переменной line с целью увидеть только что прочитанное нами:
ſƀp line
ɐ řɐ
ɨŵŵ ŵŵ Ŝśɭ
ɨ
Команда l покажет строки кода, текущую строку (Şʴ) и все имеющиеся точки
останова (). Вызов команды l без аргументов выведет все строки, начиная с точки
предыдущего вызова этой команды, поэтому включите в вызов опциональный па-
раметр — стартовую строку (в нашем примере начнем с ɨ):
ſƀl 1
ɪś
ɫʰŜſƀ
ɬɐɐŜſƀś
ɭŞʴ
ɮ ř ʰŜſɐřɐƀ
ɯ ʰ Ŝſƀ
ɰ ʰ Ŝſƀ
ɨɥſ Ŝſƀř Ŝſƀřʰɐřɐƀ
ɨɨ
Теперь модифицируем наш тест, как показано в примере 19.19, чтобы выполня-
лась проверка на полное совпадение со строкой quit без всяких других символов.
ǷȘȐȔȍȘFDSLWDOVS\
ɏ ſƀś
ſřɐɐƀś
ś
ʰŜſƀ
ɐɐʰʰŜſƀś
ř ʰŜſɐřɐƀ
ʰ Ŝſƀ
ʰ Ŝſƀ
ſ Ŝſƀř Ŝſƀřʰɐřɐƀ
ɏɏɏɏʰʰɐɏɏɏɏɐś
ɏ ſŜƃɨƄƀ
ř
ř
ř
ř
ř
ř
ř
ř
ř
Üř
ř
ř
ř
ř
Это был краткий обзор отладчика — его достаточно для демонстрации того,
что вы можете сделать и какие команды будете использовать бо' льшую часть
времени.
Помните: больше тестов — меньше отладки.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǼțȕȒȞȐȧEUHDNSRLQW
В Python 3.7 появилась новая встроенная функция ſƀ. Если вы добавите
ее в свой код, то отладчик запустится автоматически и будет останавливаться в каж-
дой локации. Без нее вам придется запускать такой отладчик, как , и расставлять
точки останова вручную, как вы уже видели ранее.
Отладчик, используемый по умолчанию, вам уже знаком (), но его можно из-
менить, установив переменную окружения . Например, вы можете
использовать удаленный отладчик, работающий на основе веб-подключения Ş
(KWWSVS\SLRUJSURMHFWZHESGE):
ɛexport PYTHONBREAKPOINT='web_pdb.set_trace'
ǯȈȗȐșȣȊȈȍȔȊȎțȘȕȈȓșȖȖȉȡȍȕȐȧȖȉȖȠȐȉȒȈȝ
В какой-то момент вам может понадобиться перейти от использования выражений
ſƀ к записи сообщений в журнал. Журнал, как правило, представляет собой
системный файл, в котором накапливаются сообщения, содержащие полезную
информацию, например временную метку или имя пользователя, запустившего
программу. Зачастую журналы ежедневно ротируются (переименовываются) и сжи-
маются, благодаря чему не переполняют ваш диск и не создают проблем. Если ваша
программа работает «не так», то вы можете просмотреть соответствующий файл
журнала и увидеть, что произошло. Содержимое исключений особенно полезно за-
писывать в журнал, поскольку оно подсказывает номер строки, после выполнения
которой программа завершилась, и причину такого завершения.
Для журналирования используется модуль стандартной библиотеки logging
(KWWSELWO\S\ORJJLQJ). Большинство его описаний я считаю немного непонятными.
Спустя некоторое время они будут казаться осмысленными, но поначалу выглядят
чересчур сложными. Модуль logging содержит следующие концепции:
сообщение, которое вы хотите сохранить в журнал;
уровни приоритета и соответствующие функции — ſƀ , ſƀ , ſƀ ,
ſƀ и ſƀ;
один или несколько объектов журналирования для основной связи с модулем;
обработчики, которые направляют значение в терминал, файл, базу данных или
куда-либо еще;
средства форматирования выходных данных;
фильтры, принимающие решения в зависимости от входных данных.
Рассмотрим простейший пример журналирования — просто импортируем модуль
и воспользуемся некоторыми из его функций:
ʴʴʴ
ʴʴʴŜſɑɑƀ
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
ʴʴʴŜſɑɑƀ
ʴʴʴŜſɑ ţɑƀ
śś ţ
ʴʴʴŜſɑţɑƀ
śśţ
ʴʴʴŜ ſɑ Šɑƀ
śś Š
Вы заметили, что вызовы ſƀ и ſƀ не сделали ничего, а два других вывели
на экран строку dzǰǮǢǥǭǼśś перед каждым сообщением? Пока они выглядят как
оператор ſƀ, имеющий несколько личностей.
Но это полезно. Вы можете выполнить поиск определенного значения уровня
в журнале с целью найти конкретные сообщения, сравнить временны ' е метки и уви-
деть, что случилось, прежде чем упал ваш сервер, и т. д.
Глубокое погружение в документацию отвечает на первую загадку (на вторую
мы ответим уже через пару страниц): уровень приоритета по умолчанию — ,
он будет записан в журнал, когда мы вызовем первую функцию (Ŝſƀ).
Мы можем указать уровень по умолчанию с помощью функции ſƀ. Самый
низкий уровень — , это дает возможность поймать более высокие уровни:
ʴʴʴ
ʴʴʴŜ ſʰŜ ƀ
ʴʴʴŜſɑ ɐɑƀ
śś ɐ
ʴʴʴŜſɑɑƀ
śś
ǶȗȚȐȔȐȏȈȞȐȧȒȖȌȈ
Обычно Python довольно быстр, однако иногда его скорости не хватает. В боль-
шинстве случаев вы можете ускорить работу, выбрав более качественный алгоритм
или структуру данных. Идея заключается в том, чтобы знать, где это сделать. Даже
опытные программисты ошибаются довольно часто. Нужно быть очень осторожны-
ми и семь раз отмерить, прежде чем отрезать. Это приводит нас к использованию
таймеров.
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
ǰȏȔȍȘȧȍȔȊȘȍȔȧ
Вы уже видели, что функция модуля возвращает текущее время в фор-
мате как число секунд с плавающей точкой. Быстрый способ засечь время —
получить текущее, что-то сделать, получить новое время и вычесть из него первое.
Напишем соответствующий код, показанный в примере 19.20, и назовем файл
(как бы вы думали?) ɨŜ.
ǷȘȐȔȍȘWLPHS\
ɨʰſƀ
ʰɬ
Ƌʰɩ
ſſƀŞɨƀ
ǷȘȐȔȍȘWLPHS\
ř
ɨʰſƀ
ſɨŜɥƀ
ſſƀŞɨƀ
1
Во многих книгах в примерах, где требуется пропустить какое-то время, приводится расчет
чисел Фибоначчи, но я бы лучше проспал это время.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
Как и ожидалось, программе для работы требуется около секунды. Если бы это
оказалось не так, то либо нашему таймеру, либо функции ſƀ должно было
стать стыдно.
Существует более удобный способ измерить время выполнения таких фрагмен-
тов кода, как этот, — использование стандартного модуля (KWWSELWO\S\WLPHLW).
У него имеется функция с именем, как вы уже догадались, ſƀ, которая запу-
стит ваш код заданное количество раз и выведет результаты. Ее синтаксис выглядит
следующим образом: ŜſȞȢȘř ȫȜȥȟȢř ȞȢȟȜȫșȥȦȖȢɕȤȔțƀ.
В примерах этого подраздела код должен находиться в кавычках, чтобы он вы-
полнялся не после нажатия клавиши 5HWXUQ, а лишь внутри функции ſƀ.
(В следующем подразделе вы увидите, как можно измерить время выполнения
некой функции, передав ее имя в функцию ſƀ .) Запустим предыдущий
пример и измерим время его выполнения. Назовем этот файл ɨŜ (при-
мер 19.22).
ǷȘȐȔȍȘWLPHLWS\
ſſɐʰɬŚƋʰɩɐřʰɨƀƀ
Эти две строки кода снова выполняются примерно за две миллионные доли се-
кунды. Мы можем использовать аргумент repeat функции ſƀ модуля ,
чтобы выполнить код большее количество раз. Сохраните этот файл под именем
ɩŜ (пример 19.23).
ǷȘȐȔȍȘWLPHLWS\
ſſɐʰɬŚƋʰɩɐřʰɨřʰɪƀƀ
Первый запуск занял две миллионные доли секунды, а второй и третий про-
шли быстрее. Почему? Так могло произойти по многим причинам. Например, мы
тестировали очень небольшой фрагмент кода и скорость его выполнения зависит
от того, что компьютер делал в эти моменты, как система Python оптимизировала
вычисления, и от многого другого.
Использование ſƀ означает, что вы оборачиваете код, производительность
которого измеряете, в строку. А если у вас несколько строк? Вы могли бы передать
их как строку с тройными кавычками, но такую нотацию будет сложно прочитать.
Определим ленивую функцию ſƀ, которая дремлет одну секунду, как и мы
все время от времени.
Для начала обернем саму функцию ſƀ. Нам нужно включить аргументы
ʰſƀ (это поможет Python найти функцию ) и ʰɨ (запу-
стить ее только один раз; по умолчанию используется значение ɨɥɥɥɥɥɥ, а у нас нет
столько времени):
ʴʴʴ
ʴʴʴ
ʴʴʴ
ʴʴʴſƀś
ŜŜŜŜſɨƀ
ŜŜŜ
ʴʴʴ ʰſɐſƀɐřʰſƀřʰɨƀ
ʴʴʴſɑʩŜɫɑʩ ƀ
ɨŜɥɥɪɬ
ŜŜŜŜſɨƀ
ŜŜŜ
ʴʴʴ ś
ŜŜŜɏɏɏɏſƀś
ŜŜŜŜɨʰŜſƀ
ŜŜŜ
ŜŜŜɏɏɏɏſřřř ƀś
ŜŜŜɩʰŜſƀ
ŜŜŜſɑƇſɩŞŜɨƀśŜɫƈɑƀ
ŜŜŜ
ʴʴʴ
ʴʴʴſƀś
ŜŜŜſƀ
ŜŜŜ
ɨŜɥɥɨɰ
ǨȓȋȖȘȐȚȔȣȐșȚȘțȒȚțȘȣȌȈȕȕȣȝ
Дзен Python (KWWSELWO\]HQS\) гласит: «Должен существовать один, и желательно
только один, очевидный способ сделать это». К сожалению, иногда способ не явля-
ется очевидным и вам приходится сравнивать альтернативные варианты. Например,
что лучше использовать для создания списка: цикл for или включение списка? И что
на самом деле значит «лучше»: быстрее, проще для понимания, менее затратно по
ресурсам или более характерно для Python?
В следующем упражнении мы создадим список разными способами, сравнив
скорость, читабельность и стиль. Перед вами файл ɏŜ (пример 19.24).
ǷȘȐȔȍȘWLPHBOLVWVS\
ɏɏɨſƀś
ʰƃƄ
ſɨɥɥɥƀś
Ŝſƀ
ɏɏɩſƀś
ʰƃſɨɥɥɥƀƄ
ſɐɏɏɨɐřſɏɏɨřʰɨɥɥɥƀřɐ ɐƀ
ſɐɏɏɩɐřſɏɏɩřʰɨɥɥɥƀřɐ ɐƀ
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
ɏɏɨɥŜɨɫɨɨɮɫɩɯɭɰɰɭɯɩɰɪɩ
ɏɏɩɥŜɥɭɨɮɫɨɫɬɰɥɥɨɫɰɬɰɮ
Включение списка отработало как минимум в два раза быстрее, чем добавление
элементов в список с помощью функции ſƀ. Как правило, включение быстрее,
чем создание вручную.
Используйте эти идеи, чтобы ускорить свой код.
&\WKRQ1XP3\ȐȘȈșȠȐȘȍȕȐȧ&
Если вы усердно работаете, но все еще не можете достичь необходимой произво-
дительности, то у вас есть и другие варианты.
Cython (KWWSF\WKRQRUJ) — гибрид языков Python и C, разработанный для преоб-
разования Python: в скомпилированный код языка С внесены некоторые улучшения
производительности. Эти аннотации относительно малы, они похожи на объявление
типов некоторых переменных, аргументов функций или возвращаемых функциями
значений. Подобные подсказки значительно ускорят научные вычисления, вы-
полняющиеся в циклах, — в 1000 раз. Документацию и примеры см. в Cython wiki
(KWWSVRUHLOO\0P:BY).
В главе 22 вы можете подробнее узнать о NumPy. Это математическая библио-
тека Python, написанная для ускорения на С.
Многие части Python и его стандартной библиотеки написаны на С для скорости
и обернуты кодом на Python для удобства. При написании приложений эти приемы
доступны и вам. Если вы знаете С и Python и действительно хотите, чтобы ваш код
«летал», то напишите расширение на языке С — это труднее, но улучшение оправ-
дает затраченные усилия.
3\3\
Около 20 лет назад, когда язык Java только появился, он был медленным, как
шнауцер, больной артритом. Но когда он стал дорого стоить компании Sun и про-
чим, они вложили миллионы в оптимизацию интерпретатора Java и лежащей в его
основе виртуальной машины Java (Java Virtual Machine, JVM), заимствуя приемы
из уже существовавших тогда языков Smalltalk и LISP. Компания Microsoft также
вложила много усилий в оптимизацию своего языка C# и .NET VM.
У языка Python нет владельца, поэтому никто так сильно не старается сделать его
быстрее. Возможно, вы используете стандартную реализацию Python. Она написана
на С и часто называется CPython (не путать с Cython).
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
Как и языки PHP, Perl и даже Java, Python не компилируется в машинный код,
он преобразуется в промежуточный язык (называемый байт-кодом или p-кодом),
который затем интерпретирует виртуальная машина.
PyPy (KWWSS\S\RUJ) — это новый интерпретатор Python, который пользуется
некоторыми приемами, ускорившими язык программирования Java. Тесты произ-
водительности интерпретатора (KWWSVSHHGS\S\RUJ) показывают, что PyPy в каждом
тесте быстрее CPython в среднем более чем в шесть раз и до 20 раз в отдельных
случаях. PyPy работает с Python 2 и 3. Вы можете скачать его и использовать вместо
CPython. PyPy постоянно улучшается и однажды может заменить CPython. Чтобы
узнать, подходит ли он вам, посетите его официальный сайт.
1XPED
Вы можете использовать пакет Numba (KWWSQXPEDS\GDWDRUJ), чтобы динамически
скомпилировать свой код в машинный и ускорить его.
Устанавливается этот пакет так же, как и другие:
ɛpip install numba
ɥŜɨɯɪɫɪɬɪɬɮɥɥɥɥɥɮɬɮ
ʴʴʴſɐɏɏſɬřɭƀɐřʰſƀƀ
ɥŜɨɬɪɯɮɥɭɮɪɥɥɥɥɩɯɬɬ
ǻȗȘȈȊȓȍȕȐȍȐșȝȖȌȕȣȔȒȖȌȖȔ
Работая над небольшой группой программ, вы обычно можете отслеживать измене-
ния, внесенные собственноручно, — до тех пор пока не сделаете глупую ошибку и не
потеряете несколько дней работы. Системы управления исходным кодом защитят
ваш код от сил зла в лице вас самих. Если вы работаете в группе, то управление исход-
ным кодом становится необходимостью. Для этой области было создано множество
коммерческих и бесплатных решений. Наиболее популярные в мире открытого ис-
ходного кода (где и живет Python) — Mercurial и Git. Они оба являются примерами
распределенных систем контроля версий, которые создают несколько копий репо-
зиториев кода. Ранние системы наподобие Subversion работают на одном сервере.
0HUFXULDO
Mercurial (KWWSPHUFXULDOVFPRUJ) написан на Python. Научиться пользоваться им
довольно легко, он имеет множество подкоманд для скачивания кода из репозито-
рия Mercurial, добавления файлов, проверки на наличие изменений и объединения
изменений из разных источников. Сайт bitbucket (KWWSVELWEXFNHWRUJ) и другие пред-
лагают бесплатный или коммерческий хостинг.
*LW
Изначально Git (KWWSJLWVFPFRP) создавался для разработки ядра Linux, но теперь
является доминирующим в области открытого исходного кода в целом. Он похож
на Mercurial, хотя некоторые считают, что обучиться ему сложнее. GitHub (KWWS
JLWKXEFRP) — это самый крупный хостинг для git, содержащий более миллиона
репозиториев, но существует и множество других хостов (KWWSELWO\JLWKRVWVFP).
Отдельные примеры программ из этой книги доступны в публичном репозито-
рии git на GitHub (KWWSVRUHLOO\85P\). Если у вас установлена программа git, то
вы можете скачать примеры с помощью следующей команды:
ɛgit clone [Link]
ǷȘȐȔȍȘWHVWS\
ſɐɐƀ
ś
ſɑŞŞ ʳʴŜŜŜɑƀ
śŜ
Это значит, что файл Ŝ стал частью локального репозитория, но изменения
еще не были отправлены. Исправим данное обстоятельство:
ɛgit commit -m "simple print program"
Строка Ş ɑ first ɑ — ваш комментарий. Если вы опустите ее, то git
выведет на экран редактор и тем самым предложит вам ввести сообщение. Оно ста-
новится частью истории изменений нашего файла.
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
ř
О’кей, все текущие изменения были отправлены. Это значит, что мы можем ме-
нять содержимое файла и не беспокоиться о потере его оригинала. Внесем изменение
в файл Ŝ — заменим на Š и сохраним файл (пример 19.26).
ǷȘȐȔȍȘǪȖȏȊȘȈȡȈȍȔșȧȒWHVWS\
ſɐŠɐƀ
ś
ſɑʳʴŜŜŜɑ ƀ
ſɑ ŞŞʳʴŜŜŜɑ ƀ
śŜ
Используйте команду git , чтобы увидеть, какие строки изменились с момен-
та последней отправки:
ɛgit diff
ŞŞŵŜŵŜ
ɮɭɯ ɪɰŜŜɭɩɮɯɩɩɨɥɥɭɫɫ
ŞŞŞŵŜ
ʫʫʫŵŜ
ɒɒŞɨʫɨɒɒ
Şſɐɐƀ
ʫſɐŠɐƀ
ś
śŜ
Фраза for означает, что вам нужно добавить файл; в примерном
переводе она выглядит как «Эй, git, смотри сюда!»:
ɛgit add [Link]
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
Вы также могли ввести команду git Ŝ, чтобы добавить все измененные фай-
лы в текущий каталог, — это удобно, когда вы изменили несколько файлов с целью
гарантировать отправку всех изменений. Теперь можно отправить изменения:
ɛgit commit -m "my first change"
ǸȈșȗȘȖșȚȘȈȕȍȕȐȍȊȈȠȐȝȗȘȖȋȘȈȔȔ
Вы знаете, что ваши файлы нужно установить в файлы и каталоги, а также то, что
программу, написанную на Python, можно запустить с помощью интерпретатора.
Менее известен тот факт, что интерпретатор Python тоже может выполнять код,
размещенный в архивах ZIP. Еще менее известно то, что особые архивы, которые на-
зываются pex-файлами (KWWSVSH[UHDGWKHGRFVLR), также могут быть скомпилированы.
DzȓȖȕȐȘțȑȚȍȥȚțȒȕȐȋț
Вы можете получить копию всех программ из данной книги. Посетите репозито-
рий Git (KWWSVRUHLOO\)E)$() и следуйте инструкциям по их копированию на ваш
локальный компьютер. Если у вас есть git, то запустите команду git śŵŵ
Ŝ ŵ ŵ Ş, чтобы создать репозиторий Git на вашем
компьютере. Вы также можете загрузить файлы в формате ZIP.
DzȈȒțȏȕȈȚȤȉȖȓȤȠȍ
Вы прочитали лишь введение. Скорее всего, в нем говорится слишком много о не-
нужном вам и слишком мало о том, что вам интересно. Позвольте мне порекомен-
довать ресурсы, связанные с Python, которые я считаю полезными.
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
DzȕȐȋȐ
Я обнаружил, что книги, представленные в следующем списке, особенно полез-
ны. Их уровень варьируется от начального до продвинутого, в них описываются
и Python 2, и Python 3.
Бизли Д., Джонс Б. Python. Книга рецептов. — М.: ДМК-Пресс, 2020.
Рейтц К., Шлюссер Т. Автостопом по Python. — СПб.: Питер, 2017.
Barry P. Head First Python (2nd Edition). — O’Reilly, 2016.
Beazley D. M. Python Essential Reference. 5th ed. — Addison-Wesley, 2019.
Gorelick M., Ozsvald I. High Performance Python. — O’Reilly, 2014.
Maxwell A. Powerful Python. — Powerful Python Press, 2017.
McKinney W. Python for Data Analysis: Data Wrangling with Pandas, NumPy and
IPython. — O’Reilly, 2012.
Ramalho L. Fluent Python. — O’Reilly, 2015.
Slatkin B. Effective Python. — Addison-Wesley, 2015.
Summerfield M. Python in Practice: Create Better Programs Using Concurrency,
Libraries and Patterns. — Addison-Wesley, 2013.
Конечно же, хороших книг гораздо больше (KWWSVZLNLS\WKRQRUJPRLQ3\WKRQ%RRNV).
ǹȈȑȚȣ
Вот несколько сайтов, где вы можете найти полезные руководства:
Python for You and Me (KWWSVS\PERRNUHDGWKHGRFVLR) — введение в Python, в ко-
тором также рассматриваются нюансы работы с ОС Windows;
Real Python (KWWSUHDOS\WKRQFRP) — многие авторы внесли свой вклад в создание
этих руководств;
Learn Python the Hard Way (KWWSOHDUQS\WKRQWKHKDUGZD\RUJERRN), автор Зед Шоу;
Dive Into Python 3 (KWWSVRUHLOO\8-F*0), автор Марк Пилгрим;
Mouse Vs. Python (KWWSZZZEORJS\WKRQOLEUDU\RUJ), автор Майкл Дрисколл.
Если вам интересно узнавать о том, что происходит в мире Python, то обратите
внимание на эти новостные сайты:
[Link] (KWWSELWO\FRPSODQJS\WKRQ);
[Link] (KWWSELWO\FRPSODQJS\DQQRXQFH);
r/python subreddit (KWWSZZZUHGGLWFRPUS\WKRQ);
Planet Python (KWWSSODQHWS\WKRQRUJ).
Наконец, рассмотрим сайты, с которых можно скачать разнообразные пакеты:
The Python Package Index (KWWSVS\SLS\WKRQRUJS\SL);
Awesome Python (KWWSVDZHVRPHS\WKRQFRP);
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǫȘțȗȗȣ
В сообществах программистов вы можете найти широкий диапазон типажей: энту-
зиастов, спорщиков, глупцов, хипстеров, интеллигентов — и множество других. Со-
общество Python довольно дружелюбно. В зависимости от вашего местонахождения
вы можете найти группы, увлекающиеся Python (KWWSS\WKRQPHHWXSFRP). Проводят
встречи и местные пользовательские группы по всему миру (KWWSVZLNLS\WKRQRUJ
PRLQ/RFDO8VHU*URXSV). Другие группы распределены по всему миру и основываются
на общих интересах. Например, PyLadies (KWWSZZZS\ODGLHVFRP) — сеть женщин,
заинтересованных в Python и ПО с открытым исходным кодом.
DzȖȕȜȍȘȍȕȞȐȐ
Самые крупные из множества конференций (KWWSZZZS\FRQRUJ) и совещаний по
всему миру (KWWSVZZZS\WKRQRUJFRPPXQLW\ZRUNVKRSV) проводятся в Северной Аме-
рике (KWWSVXVS\FRQRUJ) и Европе (KWWSVHXURS\WKRQHXHQ).
ǪȈȒȈȕșȐȐșȊȧȏȈȕȕȣȍș3\WKRQ
Чтобы найти вакансии, связанные с Python, воспользуйтесь следующими сайтами:
Indeed (KWWSVZZZLQGHHGFRP);
Stack Overflow (KWWSVVWDFNRYHUIORZFRPMREV);
ZipRecruiter (KWWSVZZZ]LSUHFUXLWHUFRPFDQGLGDWHVXJJHVWHGMREV);
Simply Hired (KWWSVZZZVLPSO\KLUHGFRP);
CareerBuilder (KWWSVZZZFDUHHUEXLOGHUFRP);
Google (KWWSVZZZJRRJOHFRPVHDUFK"T MREV);
LinkedIn (KWWSVZZZOLQNHGLQFRPMREVVHDUFK).
На большей части этих сайтов введите слово python в первой строке поиска и ваше
местоположение во второй. Среди хороших локальных сайтов могу порекомендо-
вать Craigslist, эта ссылка, например, работает для Сиэтла (KWWSVVHDWWOHFUDLJVOLVWRUJ
VHDUFKMMM). Просто измените seattle на sfbay, boston, или другой префикс сайта
Craigslist, чтобы выполнить поиск в других районах. Для поиска вакансий Python,
подразумевающих удаленную работу (на базе дистанционного доступа или «работу
из дома»), воспользуйтесь следующими сайтами:
Indeed (KWWSVRUHLOO\S)4ZE);
Google (KWWSVRUHLOO\/,);
LinkedIn (KWWSVRUHLOO\QK9V);
ǫȓȈȊȈǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
ǿȐȚȈȑȚȍȌȈȓȍȍ
Но погодите, это еще не конец! В следующих трех главах вы можете узнать, как
использовать Python в искусстве, бизнесе и науке. Вы найдете как минимум одну
область для исследований. В Сети можно отыскать множество блестящих объектов.
Только вы сможете сказать, какие из них — бижутерия, а какие — серебряные пули.
И даже если вас в данный момент не преследуют оборотни, серебряные пули могут
пригодиться. На всякий случай.
Наконец, вы узнаете ответы на все эти раздражающие упражнения в конце
каждой главы, детали установки Python и его друзей, а также получите несколько
вспомогательных таблиц для вещей, которые мне постоянно нужно подсматривать.
Ваш мозг, скорее всего, лучше подготовлен, но так они всегда будут под рукой.
ǻȗȘȈȎȕȍȕȐȧ
Питонщикам сегодня ничего не задавали.
ƋƓƈƊƈ
ǷȐǨȘȚ
Граучо Маркс
ǬȊțȔȍȘȕȈȧȋȘȈȜȐȒȈ
Все языки программирования в какой-то степени работают с компьютерной гра-
фикой. Многие мощные платформы в этом приложении в целях быстродействия
были написаны на С или С++, но для продуктивности добавлены библиотеки
Python. Начнем с рассмотрения некоторых библиотек для работы с двумерными
изображениями.
ǹȚȈȕȌȈȘȚȕȈȧȉȐȉȓȐȖȚȍȒȈ
В стандартной библиотеке содержатся всего несколько модулей, связанных с изо-
бражениями. Рассмотрим два из них:
— этот модуль определяет тип некоторых файлов изображений;
— этот модуль преобразует цвета между разными системами: RGB, YIQ,
HSV и HLS.
ǫȓȈȊȈǷȐǨȘȚ
ǸȐșǰȏȖȉȘȈȎȍȕȐȍȐȏWXUWOHGHPR
3,/Ȑ3LOORZ
Многие годы библиотека изображений Python (Python Image Library, PIL) (KWWS
ELWO\S\LPDJH), несмотря на ее отсутствие в стандартной библиотеке, является самой
известной библиотекой для обработки двумерных изображений. Она предшествова-
ла таким установщикам, как pip, поэтому был создан «дружественный форк» с на-
званием Pillow (KWWSSLOORZUHDGWKHGRFVRUJ). Код для работы с изображениями Pillow
совместим с кодом PIL, а его документация хороша, поэтому используем его здесь.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
Если вы уже устанавливали пакеты , libfreetype и , то они будут об-
наружены и использованы Pillow. На странице с инструкциями по установке (KWWS
ELWO\SLOORZLQVWDOO) вы узнаете больше.
Откроем файл изображения:
ʴʴʴ
ʴʴʴʰ ŜſɐŜɐƀ
ʴʴʴŜ
ɐ ɐ
ʴʴʴŜ
ſɨɬɫřɨɫɨƀ
ʴʴʴŜ
ɐ ɐ
Хоть пакет и называется , вы импортируете его как , чтобы код был
совместим со старым .
Чтобы отобразить изображение на экране с помощью метода ſƀ объекта
, вы сначала должны установить пакет ImageMagick, описанный в следующем
подразделе, а затем попробовать вот что:
ʴʴʴŜſƀ
ǸȐșǰȏȖȉȘȈȎȍȕȐȍȗȖȓțȟȍȕȕȖȍșȗȖȔȖȡȤȦȉȐȉȓȐȖȚȍȒȐȐȏȖȉȘȈȎȍȕȐȑ3\WKRQ
смещении вниз. Мы хотим задать значения левого края х (55), верхнего края у (70),
правого края х (85) и нижнего края у (100) для метода ſƀ, поэтому передаем
кортеж, содержащий эти значения в соответствующем порядке:
ʴʴʴ ʰſɬɬřɮɥřɯɬřɨɥɥƀ
ʴʴʴɩʰŜ ſ ƀ
ʴʴʴɩŜſƀ
ǸȐșǶȉȘȍȏȈȕȕȖȍȐȏȖȉȘȈȎȍȕȐȍ
ǸȐșǵȈȠȔȐȓȣȑȏȊȍȘȍȒ ǸȐșǰȕȖȗȓȈȕȍȚȕȈȧȚȍȝȕȖȓȖȋȐȧ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǷȘȐȔȍȘFKBFULWWHUS\
,PDJH0DJLFN
ImageMagick (KWWSZZZLPDJHPDJLFNRUJ) — это комплект программ для конверти-
рования, изменения и отображения двумерных изображений. Он существует более
20 лет. Различные библиотеки Python подключены к библиотеке ImageMagick,
написанной на С. Самая недавняя из них, поддерживающая Python 3, называется
wand (KWWSGRFVZDQGS\RUJ). Чтобы установить ее, введите следующую команду:
ɛpip install Wand
ǺȘȍȝȔȍȘȕȈȧȋȘȈȜȐȒȈ
Для работы с трехмерной графикой в Python существуют следующие пакеты:
VPython (KWWSVYS\WKRQRUJ) содержит примеры (KWWSVRUHLOO\-W), которые вы
можете запустить в своем браузере;
ǫȓȈȊȈǷȐǨȘȚ
ǺȘȍȝȔȍȘȕȈȧȈȕȐȔȈȞȐȧ
Посмотрите длинные финальные титры любого современного фильма, и вы увидите
огромное количество людей, занимавшихся спецэффектами и анимацией. Боль-
шинство крупных студий: Walt Disney Animation, ILM, Weta, Dreamworks, Pixar —
нанимают людей, имеющих опыт работы с Python. Поищите в Интернете «python
анимация работа», чтобы увидеть действующие предложения.
Далее показаны некоторые пакеты Python для работы с 3D.
Panda3D (KWWSZZZSDQGDGRUJ) — этот пакет имеет открытый исходный код,
и его можно использовать бесплатно даже для создания коммерческих приложе-
ний. Вы можете скачать его версию с сайта Panda3D (KWWSELWO\GOSDQGD).
VPython (KWWSVYS\WKRQRUJ) — поставляется с большим количеством примеров
(KWWSVRUHLOO\-W).
Blender (KWWSZZZEOHQGHURUJ) — это бесплатное средство создания 3D-анимации
и игр. Если вы скачаете и установите его (KWWSZZZEOHQGHURUJGRZQORDG), то на ваш
компьютер также будет установлена копия Python 3.
Maya (KWWSVRUHLOO\3K:Q) — это коммерческая система для создания 3D-анимации
и графики. Она поставляется вместе с версией Python — в данный момент
Python 2.7. Чед Вернон написал о ней бесплатно загружаемую книгу Python
Scripting for Maya Artists (KWWSELWO\S\PD\D). Если вы поищете в Интернете ин-
формацию о Python и Maya, то сможете найти множество других ресурсов, как
бесплатных, так и коммерческих, включая видеоролики.
Houdini (KWWSVZZZVLGHI[FRP) — это коммерческий пакет, однако вы можете
скачать бесплатную версию, которая называется Apprentice. Как и другие пакеты
для анимации, он поставляется с привязкой к Python (KWWSVRUHLOO\/&U).
ǫȘȈȜȐȟȍșȒȐȍȗȖȓȤȏȖȊȈȚȍȓȤșȒȐȍ
ȐȕȚȍȘȜȍȑșȣ *8,
Название содержит слово «графический», но GUI (Graphical User Interface) кон-
центрируется скорее на пользовательском интерфейсе: виджетах для представления
данных, методах ввода, меню, кнопках и окнах.
Страница «Википедии» GUI programming (KWWSELWO\JXLSURJUDP) и список часто
задаваемых вопросов (KWWSELWO\JXLIDT) содержат множество примеров GUI, создан-
ных с помощью Python. Начнем с единственного встроенного в стандартную библио-
теку примера — Tkinter (KWWSVZLNLS\WKRQRUJPRLQ7N,QWHU). Он прост, но работает на
всех платформах и создает естественно выглядящие окна и виджеты.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǬȐȈȋȘȈȔȔȣȋȘȈȜȐȒȐȐȊȐȏțȈȓȐȏȈȞȐȧ
Python — отличный инструмент для создания диаграмм, графиков и визуализации
данных и особенно популярен в научной среде (см. главу 22). Полезные обзоры
с примерами встречаются в официальной Python wiki (KWWSVRUHLOO\:GWHU) и Python
Graph Gallery (KWWSVS\WKRQJUDSKJDOOHU\FRP).
Рассмотрим самые популярные. В следующей главе вы снова увидите некоторые
из них, но они будут использованы для создания карт.
0DWSORWOLE
Бесплатную библиотеку для создания двумерных диаграмм Matplotlib (KWWS
PDWSORWOLERUJ) можно установить с помощью следующей команды:
ɛpip install matplotlib
ʰŜſɐŜɐƀ
Ŝſƀ
Ŝſƀ
которых включает по 20 целых чисел. В один из них войдут числа, плавно увеличива-
ющиеся от 1 до 20, а второй будет похож на первый, но с небольшими отклонениями
там и тут (пример 20.2).
ǸȐșǰȏȖȉȘȈȎȍȕȐȍȗȖȒȈȏȈȕȕȖȍșȗȖȔȖȡȤȦȉȐȉȓȐȖȚȍȒȐ0DWSORWOLE
ǷȘȐȔȍȘ20.2.FKBPDWSORWOLES\
Ŝ
ʰſſɨřɩɨƀƀ
ʰſʫſŞɨřɨƀƀ
řʰŜſʰɨř ʰɪƀ
ʰſſɥřɩɨřɬƀƀ
ś
Ŝɏ ſ ƀ
Ŝɏ ſ ƀ
ƃɥƄŜ ſřƀ
ƃɨƄŜſřƀ
ƃɩƄŜſřřɐŞɐƀ
Ŝſƀ
ǫȓȈȊȈǷȐǨȘȚ
ǸȐșǩȈȏȖȊȣȍȋȘȈȜȐȒȐ0DWSORWOLE ȌȐȈȋȘȈȔȔȈȘȈșșȍȐȊȈȕȐȧ
ȐȓȐȕȍȑȕȣȍȋȘȈȜȐȒȐ
6HDERUQ
Seaborn (KWWSVVHDERUQS\GDWDRUJ) — это библиотека для визуализации данных
(рис. 20.10), построенная на основе Matplotlib и имеющая соединение с Pandas.
Для нее работает базовая мантра инсталляции (pip install seaborn).
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǸȐșǩȈȏȖȊȈȧȌȐȈȋȘȈȔȔȈȘȈșșȍȐȊȈȕȐȧȐȗȘȧȔȖȓȐȕȍȑȕȈȧȘȍȋȘȍșșȐȧȊ6HDERUQ
ǷȘȐȔȍȘFKBVHDERUQS\
Ŝ
ʰŜɏſɑɑƀ
ŜſʰɑɏɑřʰɑɑřʰƀŚ
Ŝſƀ
ǷȘȐȏȈȗțșȒȍȌȈȕȕȖȋȖȒȖȌȈșȗȖȔȖȡȤȦșȚȈȕȌȈȘȚȕȖȋȖȐȕȚȍȘȗȘȍȚȈȚȖȘȈ3\WKRQȊȈȔȗȖ
ȕȈȌȖȉȐȚșȧțȒȈȏȈȚȤȗȍȘȊțȦșȚȘȖȒțȐȔȗȖȘȚȈ LPSRUWPDWSORWOLES\SORWDVSOW ȐȗȖșȓȍȌ
ȕȦȦșȚȘȖȒț SOWVKRZ ȒȈȒȗȖȒȈȏȈȕȖȊȗȘȐȔȍȘȍȐȕȈȟȍȋȘȈȜȐȒȕȍȖȚȖȉȘȈȏȐȚșȧ
ǭșȓȐȊȣȐșȗȖȓȤȏțȍȚȍ-XS\WHUȚȖȉȐȉȓȐȖȚȍȒȈ0DWSORWOLEțȎȍȊșȚȘȖȍȕȈȊșȘȍȌț²ȕȍȚ
ȕȍȖȉȝȖȌȐȔȖșȚȐȍȍȐȔȗȖȘȚȐȘȖȊȈȚȤǷȖȔȕȐȚȍȥȚȖȒȖȋȌȈȉțȌȍȚȍȐșșȓȍȌȖȊȈȚȤȗȘȐȔȍȘȣ
ȒȖȌȈȘȈȉȖȚȈȦȡȍȋȖșȐȕșȚȘțȔȍȕȚȈȔȐȗȖșȚȘȖȍȕȐȧȒȈȘȚȊ3\WKRQ
ǫȓȈȊȈǷȐǨȘȚ
%RNHK
На заре существования Интернета разработчики генерировали графику на сервере
и давали браузеру URL для доступа к ней. С недавних пор JavaScript повысил свою
производительность и получил инструменты генерации графики на стороне клиента,
такие как D3. Пару страниц назад я говорил о возможности использовать Python
как часть архитектуры фронтенд-бэкенд-графики и GUIs. Новый инструмент, кото-
рый называется Bokeh (KWWSERNHKS\GDWDRUJ), совмещает плюсы Python (крупные
наборы данных, простота использования) и JavaScript (интерактивность, меньшая
латентность графики). Bokeh делает акцент на быстрой визуализации крупных на-
боров данных.
Если вы уже установили необходимые для Bokeh пакеты (NumPy, Pandas
и Redis), то можете установить и сам этот инструмент, введя следующую команду:
ɛpip install bokeh
ǰȋȘȣ
Оказывается, Python — настолько хорошая платформа для написания игр, что об
этом пишут книги, например:
Invent Your Own Computer Games with Python, автор Эл Свайгарт (KWWSLQYHQWZLWK
S\WKRQFRP)1;
The Python Game Book, автор Хорст Йенс (книга в формате docuwiki) (KWWS
WKHS\WKRQJDPHERRNFRP).
1
Свайгарт Эл. Учим Python, делая крутые игры. — М.: Эксмо, 2017.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǨțȌȐȖȐȔțȏȣȒȈ
I sought the serif
But that did not suit Claude Debussy1.
Deservedly Anonymous
Что насчет звука, музыки и котов, которые поют Jingle Bells? Ну, как говорит
Meatloaf, два из трех — это не так плохо.
В напечатанной книге звук представить сложно, так что взгляните на эти акту-
альные ссылки на пакеты Python, предназначенные для работы со звуком и музыкой.
С помощью Google вы можете найти намного больше:
модули стандартной библиотеки для работы с аудио (KWWSGRFVS\WKRQRUJOLEUDU\
PPKWPO);
сторонние инструменты для работы с аудио (KWWSVZLNLS\WKRQRUJPRLQ$XGLR);
десятки сторонних музыкальных (KWWSVZLNLS\WKRQRUJPRLQ3\WKRQ,Q0XVLF) прило-
жений: графические и CLI-проигрыватели, преобразователи, нотации, анализ,
плейлисты, MIDI и др.
Наконец, как насчет онлайн-источников музыки? На протяжении этой книги вы
видели примеры кода, которые получали доступ к Internet Archive. Вот ссылки на
некоторые из аудио-архивов:
аудиозаписи (KWWSVDUFKLYHRUJGHWDLOVDXGLR) (> 5 000 000);
живая музыка (KWWSVDUFKLYHRUJGHWDLOVHWUHH) (> 200 000);
живые концерты группы Grateful Dead (KWWSVDUFKLYHRUJGHWDLOV*UDWHIXO'HDG )
(> 13 000).
ǿȐȚȈȑȚȍȌȈȓȍȍ
Имитируем бурную деятельность! В дело вступает Python.
ǻȗȘȈȎȕȍȕȐȧ
20.1. Установите . Нарисуйте диаграмму рассеивания для следующих
пар ſř ƀ: ( ſɥř ɥƀ, ſɪřɬƀ, ſɭř ɩƀ, ſɰř ɯƀ, ſɨɫř ɨɥƀ ƀ.
20.2. Нарисуйте линейчатый график на основе тех же данных.
20.3. Нарисуйте график на основе тех же данных.
1
Обыгрывается строка из песни I shot the Sheriff. — Примеч. пер.
ƋƓƈƊƈ
ǯȈȘȈȉȖȚȖȑ
7KH0LFURVRIW2IILFH6XLWH
Бизнес сильно зависит от приложений Microsoft Office и форматов файлов. Несмо-
тря на то что эти библиотеки Python не очень широко известны и в ряде случаев
плохо задокументированы, они могут пригодиться. Рассмотрим некоторые из них,
работающие с документами Microsoft Office:
docx (KWWSVS\SLS\WKRQRUJS\SLGRF[) — эта библиотека создает, считывает и запи-
сывает файлы для Microsoft Office Word 2007 с расширением Ŝ ;
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǪȣȗȖȓȕȧȍȔȉȐȏȕȍșȏȈȌȈȟȐ
Вы можете найти модуль Python практически для чего угодно. Посетите сайт PyPI
(KWWSVS\SLS\WKRQRUJS\SL) и введите что-либо в строку поиска. Многие модули — это
интерфейсы для общедоступных API различных сервисов. Вам могут быть интерес-
ны примеры, связанные с бизнес-задачами:
отправка через Fedex (KWWSVJLWKXEFRPJWD\ORUS\WKRQIHGH[) или UPS (KWWSVJLWKXEFRP
RSHQODEV3\836);
отправка почты с помощью API [Link] (KWWSVJLWKXEFRPM]HPSHOVWDPSV);
ǫȓȈȊȈǯȈȘȈȉȖȚȖȑ
ǶȉȘȈȉȖȚȒȈȉȐȏȕȍșȌȈȕȕȣȝ
Бизнес очень любит данные. К сожалению, во многих отраслях бизнеса с данными
принято обращаться весьма своеобразно, словно для того, чтобы специально услож-
нить вам работу.
Электронные таблицы стали хорошим изобретением, и с течением времени
бизнес пристрастился к ним. Многие непрограммисты стали заниматься програм-
мированием, поскольку эти таблицы стали называть макросами, а не программами.
Но Вселенная постоянно расширяется, и данные пытаются выдержать ее темп. Более
старые версии Excel были ограничены 65 536 рядами, а более новые не могли об-
работать больше миллиона. Когда данные организаций переросли один компьютер,
ситуация стала похожа на то, как если бы штат перерос сотню человек, — внезапно
вам требуются новые слои, промежуточные уровни и коммуникация.
Программы, работающие с большим количеством данных, появились не из-за
того, что данные на одном компьютере значительно разрослись, — они стали ре-
зультатом попытки обобщить все данные, появляющиеся в бизнесе. Реляционные
базы данных обрабатывают миллионы рядов, не взрываясь при этом, но могут взаи-
модействовать только с определенным количеством рядов или обновлений за раз.
Старые добрые текстовые или бинарные файлы могут занимать гигабайты памяти,
но если вам нужно обработать их все одновременно, то требуется иметь достаточное
количество памяти. Традиционное программное обеспечение для этого не подходит.
Таким компаниям, как Google и Amazon, пришлось изобрести решения, позволя-
ющие работать с данными такого масштаба. Netflix (KWWSELWO\S\QHWIOL[) — пример
такого решения, созданный в облаке AWS от Amazon, который использует Python
для объединения RESTful API, безопасности, развертывания и баз данных.
ǰȏȊȓȍȟȍȕȐȍȗȘȍȖȉȘȈȏȖȊȈȕȐȍȐȏȈȋȘțȏȒȈ
Подводные части айсбергов данных содержат всю работу по получению данных
в первую очередь. Если говорить языком бизнеса, распространенными терминами
являются «извлечение», «преобразование», «загрузка» (extract, transform, load, или
ETL). Синонимы наподобие «выпас данных» (data munging, data wrangling) могут
создать впечатление, будто вы приручаете непокорного зверя, — такая метафора
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
может оказаться близкой. Данная задача выглядит решенной с точки зрения инже-
нерии, но по большей части это искусство. Я немного говорил об этом в главе 12.
Мы рассмотрим науку о данных более подробно в главе 22, поскольку именно на эту
область разработчики тратят бо' льшую часть времени.
Если вы видели фильм «Волшебник страны Оз», то, помимо летающих обезьян,
должны помнить фрагмент в конце, когда добрая волшебница сказала Дороти, что
она может отправиться домой в Канзас, просто стукнув каблучком о каблучок.
Даже будучи моложе, я думал: «И она говорит об этом только сейчас?!» Хотя теперь
понимаю, что фильм был бы гораздо короче, если бы волшебница дала такой совет
раньше.
Вот только мы живем не в фильме, здесь мы говорим о мире бизнеса, где со-
кращение времени на выполнение задач — это хорошо. Позвольте мне поделиться
с вами парой советов. Большинство инструментов, которые вам понадобятся для
повседневной работы с данными в бизнесе, вы уже знаете, поскольку прочитали
о них в этой книге. Среди таких инструментов высокоуровневые структуры данных,
например словари и объекты, тысячи стандартных и сторонних библиотек, а также
сообщество экспертов, которое можно найти в поисковике.
Если вы программист, пишущий программы для бизнеса, то ваш рабочий процесс
практически всегда содержит следующее.
1. Извлечение данных из файлов странных форматов или баз данных.
2. Очистку данных, которая охватывает множество областей, заполненных подвод-
ными камнями.
3. Преобразование дат, времени и наборов символов.
4. Выполнение каких-либо действий над данными.
5. Сохранение полученного результата в базе данных.
6. Откат к шагу 1: намылить, смыть, повторить.
Рассмотрим пример: вам нужно переместить данные из электронной таблицы
в базу данных. Вы можете сохранить таблицу в формате CSV и использовать би-
блиотеки Python, показанные в главе 16. Или же найти модуль, который считывает
непосредственно бинарный формат электронной таблицы. Ваши пальцы знают, как
набрать строку python в поисковике и найти сайты наподобие Working with
Excel files in Python (KWWSZZZS\WKRQH[FHORUJ). Вы можете установить один из не-
обходимых пакетов с помощью pip и найти драйвер базы данных для Python, чтобы
выполнить последнюю часть задания. Я упоминал SQLAlchemy и непосредственные
драйверы базы данных в той же главе. Теперь вам нужно написать промежуточный
код, и именно здесь структуры данных и библиотеки Python могут сэкономить ваше
время.
Попробуем выполнить поставленную задачу, а затем решить ее снова, но уже ис-
пользуя библиотеки, которые позволяют сэкономить немного времени. Мы считаем
CSV-файл, агрегируем все числа в одном столбце, упорядочив их по уникальному
значению, и выведем результат на экран. Если бы мы решали задачу с помощью SQL,
то применили бы SELECT, JOIN и GROUP BY.
ǫȓȈȊȈǯȈȘȈȉȖȚȖȑ
Для начала рассмотрим файл Ŝ , который содержит следующую инфор-
мацию: тип животного, сколько раз оно укусило посетителя, количество потребо-
вавшихся швов и сумма, которую мы заплатили посетителю за то, чтобы он ничего
не говорил журналистам:
řř ř
řɨřɪɬřɪɥɥ
řɨřɩřɩɬɥ
řɩřɫɩřɬɥɥ
řɨřɪɥřɨɥɥ
řɫřɮřɬɥ
řɩřɥřɨɥ
Мы хотим узнать, какое животное обходится нам дороже всего, поэтому агреги-
руем общую сумму взяток для каждого типа животного (количеством укусов и швов
пусть займется врач). Мы используем модуль , который рассматривали в подраз-
деле «CSV» на с. 328, и счетчик из подраздела «Подсчитываем элементы
с помощью Counter()» на с. 233. Сохраните этот код как ɏ Ŝ:
ʰſƀ
ſɐŜ ɐřɐɐƀś
ʰ Ŝſƀ
řſ ƀś
ʴɥś
ƃƃɥƄƄʫʰſƃŞɨƄƀ
ř Ŝſƀś
ſɑʩɨɥʩɨɥɑʩſřƀƀ
Ага! Это был медведь! Он был нашим основным подозреваемым все время, но
теперь у нас есть доказательства.
Далее воссоздадим этот пример с инструментария для обработки данных
Bubbles (KWWSEXEEOHVGDWDEUHZHU\RUJ). Вы можете установить его, введя следующую
команду:
ɛpip install bubbles
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
Он требует наличия SQLAlchemy. Если у вас его нет, то вам поможет команда pip
install . Так выглядит тестовая программа (назовите файл ɨŜ),
адаптированная из документации (KWWSELWO\S\EXEEOHV):
ʰŜſƀ
Ŝ ſŜɏ ſɐ ɏ ɐřɐŜ ɐřɏʰƀƀ
Ŝſɐɐřɐɐƀ
Ŝɏſƀ
1
Свайгарт Э. Автоматизация рутинных задач с помощью Python. Практическое руковод-
ство для начинающих. — Киев: Диалектика, 2018.
ǫȓȈȊȈǯȈȘȈȉȖȚȖȑ
ǪȈȓȐȌȈȞȐȧȌȈȕȕȣȝ
При очистке данных вам зачастую нужно проверить следующее:
тип данных (целое число, число с плавающей точкой или строка);
диапазон возможных значений;
корректность значений, например рабочий номер телефона или адрес электрон-
ной почты;
дубликаты;
отсутствующие данные.
Это особенно важно при обработке веб-запросов и ответов.
Для работы с определенными данными можно использовать следующие по-
лезные пакеты Python:
ɏ (KWWSVS\SLRUJSURMHFWYDOLGDWHBHPDLO);
(KWWSVS\SLRUJSURMHFWSKRQHQXPEHUV).
Кроме того, порекомендую полезные инструменты общего назначения:
(KWWSVYDOLGDWRUVUHDGWKHGRFVLR);
(KWWSVS\GDQWLFGRFVKHOSPDQXDOLR) — для версий Python 3.6 и выше; ис-
пользует подсказки типов;
(KWWSVPDUVKPDOORZUHDGWKHGRFVLRHQ) — также выполняет сериали-
зацию и десериализацию;
(KWWSGRFVS\WKRQFHUEHUXVRUJHQVWDEOH);
многие другие (KWWSVOLEUDULHVLRVHDUFK"NH\ZRUGV YDOLGDWLRQ ODQJXDJHV 3\WKRQ).
ǬȖȗȖȓȕȐȚȍȓȤȕȣȍȐșȚȖȟȕȐȒȐȐȕȜȖȘȔȈȞȐȐ
Иногда вам нужны данные, которые появляются где-то в другом месте. Рассмот-
рим некоторые источники данных из области бизнеса и правительственной ин-
формации:
[Link] (KWWSVZZZGDWDJRY) открывает доступ к тысячам наборов данных и ин-
струментов. Его API (KWWSVZZZGDWDJRYGHYHORSHUVDSLV) созданы на основе CKAN
(KWWSFNDQRUJ), системы управления данными Python;
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǷȈȒȍȚȣȌȓȧȘȈȉȖȚȣșȉȐȏȕȍșȌȈȕȕȣȔȐ
șȖȚȒȘȣȚȣȔȐșȝȖȌȕȣȔȒȖȌȖȔ
Odoo (KWWSVZZZRGRRFRP) — обширная ERP-платформа.
Tryton (KWWSZZZWU\WRQRUJ) — еще одна обширная платформа.
Oscar (KWWSRVFDUFRPPHUFHFRP) — фреймфорк для электронной коммерции, на-
писанный на Django.
Grid Studio (KWWSVJULGVWXGLRLR) — основанные на Python таблицы, работают ло-
кально или в облаке.
3\WKRQȊȖȉȓȈșȚȐȜȐȕȈȕșȖȊ
С недавнего времени в финансовой индустрии развился значительный интерес
к Python. Адаптируя программное обеспечение, показанное в главе 22, а также
разрабатывая собственное, группа quants создает новое поколение финансовых
инструментов:
Quantitative economics (KWWSTHFRQRPLFVRUJRMVLQGH[SKS) — этот инструмент пред-
назначен для экономического моделирования с помощью большого количества
математических расчетов и Python;
Python for finance (KWWSZZZS\WKRQIRUILQDQFHFRP) — этот сайт представляет книгу
Derivatives Analytics with Python: Data Analytics, Models, Simulation, Calibration and
Hedging Ива Хилпиша (издательство Wiley);
Quantopian (KWWSVZZZTXDQWRSLDQFRP) — это интерактивный сайт, на котором вы
можете писать собственный код Python и работать с его помощью с архивными
данными об акциях;
PyAlgoTrade (KWWSJEHFHGJLWKXELRS\DOJRWUDGH) — еще один инструмент для тести-
рования на исторических данных, но уже для вашего собственного компьютера;
Quandl (KWWSZZZTXDQGOFRP) — используйте этот инструмент для поиска в мил-
лионах единиц финансовых данных;
ǫȓȈȊȈǯȈȘȈȉȖȚȖȑ
ǩȍȏȖȗȈșȕȖșȚȤȉȐȏȕȍșȌȈȕȕȣȝ
Безопасность — особая забота для бизнеса. Данной теме посвящены целые книги,
поэтому я лишь упомяну несколько советов, связанных с Python.
В подразделе «scapy» раздела «TCP/IP» главы 17 рассматривается , язык на
базе Python для экспертизы пакетов. Он используется для объяснения некоторых
крупных сетевых атак.
Сайт Python Security (KWWSZZZS\WKRQVHFXULW\RUJ) содержит дискуссии на тему
безопасности, детали некоторых модулей Python и вспомогательные таблицы.
Книга Violent Python (KWWSELWO\YLROHQWS\WKRQ) (с подзаголовком A Cookbook for
Hackers, Forensic Analysts, Penetration Testers and Security Engineers) Ти Джея
О’Коннора (издательство Syngress) — это широкий обзор Python и компьютерной
безопасности.
DzȈȘȚȣ
Карты стали полезными для многих бизнесов. Python очень хорошо рисует карты,
так что мы потратим не много времени на эту тему. Менеджеры любят графики,
и если вы можете быстро нарисовать красивую карту сайта вашей организации, то
это вам не повредит.
В ранние дни существования Интернета я посещал экспериментальный сайт по
созданию карт у Xerox. Когда появились крупные сайты, такие как Google Maps,
они стали откровением (к тому же вызывали мысль: «Почему я не подумал об этом
и не заработал миллионы?»). Теперь сервисы картографии и сервисы, основанные на
определении местоположения, практически везде, они особенно удобны в мобильных
устройствах.
Здесь пересекается множество терминов: картография, GIS (geographic information
system — географическая информационная система), GPS (Global Positioning
System — глобальная система позиционирования), анализ геопространства и многое
другое. Блог Geospatial Python (KWWSELWO\JHRVSDWLDOS\) воплощает образ системы
размером с «800-фунтовую гориллу» GDAL/OGR, GEOS и PROJ.4 (проекции)
и вспомогательные системы, представленные как обезьяны (помогающие этой го-
рилле). Многие из этих сервисов имеют интерфейсы Python. Поговорим о некоторых
из них, начиная с самых простых форматов.
1
Хилпиш И. Python для финансовых расчетов. — Киев: Диалектика, 2019.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǼȖȘȔȈȚȣ
Мир картографии имеет множество форматов: векторный (линии), растровый (изо-
бражения), метаданные (слова) и их комбинации.
Esri, первая географическая система, изобрела формат «шейп-файл» более 20 лет
назад. Файл данного формата содержит несколько файлов, включающих как мини-
мум следующую информацию:
Ŝ — информацию о фигуре (вектор);
Ŝ — индекс формы;
Ŝ — базу данных атрибутов.
Получим шейп-файл для нашего следующего примера. Посетите страницу KWWS
ELWO\FXOWXUDOYHFWRUV. В разделе $GPLQ²6WDWHV3URYLQFHV (Admin 1 — штаты, провинции)
нажмите зеленую кнопку GRZQORDGVWDWHVDQGSURYLQFHV (Скачать штаты и провинции),
чтобы скачать архив. Затем разархивируйте файл. Вы должны увидеть такой ре-
зультат:
ɏɨɨɥɏɏɨɏɏ ɏŜŜ
ɏɨɨɥɏɏɨɏɏ ɏŜ
ɏɨɨɥɏɏɨɏɏ ɏŜ Ŝ
ɏɨɨɥɏɏɨɏɏ ɏŜ
ɏɨɨɥɏɏɨɏɏ ɏŜ
ɏɨɨɥɏɏɨɏɏ ɏŜ
ɏɨɨɥɏɏɨɏɏ ɏŜ
ɏɨɨɥɏɏɨɏɏ ɏŜ
ǵȈȘȐșțȍȔȒȈȘȚțȕȈȖșȕȖȊȍȠȍȑȗȜȈȑȓȈ
В этом подразделе приводится очень упрощенная демонстрация чтения и отобра-
жения шейп-файла. Вы увидите, что результат неидеален, и поймете преимущества
работы с пакетами более высокого уровня, которые будут показаны ниже.
Для прочтения шейп-файла вам понадобится эта библиотека:
ɛpip install pyshp
ɤȣȤșȢȕȤȔțȧșȠșȘȜȡȜȪȯȜțȠșȤșȡȜȳȞȔȤȦȖșȘȜȡȜȪȯȜțȠșȤșȡȜȳȜțȢȕȤȔȚșȡȜȝ
ʰŵ
ʰŵ
ʰ Ŝſɑ ɑřſřƀřɑɑƀ
ʰ Ŝſƀ
Ŝſƀś
ʰƃ
ſſŞſſŞƀƋ ƀƀřſſŞƀƋ ƀƀ
řŜƄ
ŜʰʰŜ ś
Ŝſřʰɐ ɐƀ
ŜʰʰŜ ś
Ŝſřʰɐ ɐƀ
Ŝſƀ
ɏɏɏɏʰʰɐɏɏɏɏɐś
ɏſŜƃɨƄřɮɥɥřɮɥɥƀ
По поводу первого пункта: в логике программы есть ошибка, но что мне делать?
В главе 19 рассматриваются советы для разработчиков, включая информацию об
отладке, но мы можем рассмотреть и другие варианты. Я мог бы написать несколько
тестов и работать, пока не исправлю ошибку, или же использовать какую-нибудь
другую библиотеку для создания карты. Возможно, более высокоуровневое решение
поможет мне справиться со всеми тремя проблемами (лишние линии, сплющенный
вид и примитивный стиль).
Насколько я знаю, не существует пакета для работы с картами, основанного на
чистом Python. К счастью, есть более изящные пакеты; рассмотрим их.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǸȐșǷȘȍȌȊȈȘȐȚȍȓȤȕȈȧȒȈȘȚȈ
*HRSDQGDV
Пакет Geopandas (KWWSJHRSDQGDVRUJ) интегрирует в себе Matplotlib, Pandas и другие
библиотеки Python в одну платформу, которая позволяет работать с геопростран-
ственными данными.
Основной пакет устанавливается с помощью знакомой команды pip install
, но полагается и на другие пакеты, которые вам также нужно устанавли-
вать, используя pip, если их у вас еще нет:
;
(версия 0.23.4 или выше);
shapely (интерфейс для GEOS);
ǫȓȈȊȈǯȈȘȈȉȖȚȖȑ
ǷȘȐȔȍȘJHRSDQGDVS\
Ŝ
ɏʰŜŜɏſɐɏɐƀ
ʰŜɏſɏƀ
ɏʰŜŜɏſɐɏ ɐƀ
ʰŜɏſ ɏƀ
ʰŜſ ʰɐ ɐƀ
Ŝſʰř ʰɐ ɐřʰɩƀ
Ŝſƀ
ǸȐșDzȈȘȚȈșȖȏȌȈȕȕȈȧșȗȖȔȖȡȤȦ*HRSDQGDV
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǬȘțȋȐȍȗȈȒȍȚȣȌȓȧȘȈȉȖȚȣșȒȈȘȚȈȔȐ
Перед вами набор ссылок на другое ПО для работы с картами; многие из них могут
не полностью устанавливаться с помощью pip, но для некоторых можно задейство-
вать (альтернативный установщик пакетов Python, особенно полезный для
научного ПО):
pyshp (KWWSVS\SLRUJSURMHFWS\VKS) — это библиотека для работы с шейп-файлами,
упомянутая выше, в подразделе «Нарисуем карту на основе шейп-файла»;
kartograph (KWWSNDUWRJUDSKRUJ) отрисовывает шейп-файлы в карты формата SVG
на сервере или клиенте;
shapely (KWWSVVKDSHO\UHDGWKHGRFVLR) решает геометрические вопросы наподобие
«Какие строения в этом городе через 50 лет окажутся в зоне наводнения?»;
basemap (KWWSPDWSORWOLERUJEDVHPDS) основана на Matplotlib, предназначена для
рисования карт и перекрытия их данных; к сожалению, после появления Cartopy
считается устаревшей;
cartopy (KWWSVVFLWRROVRUJXNFDUWRS\GRFVODWHVW) продолжает дело Basemap и решает
задачи, для которых обычно нужен пакет Geopandas;
folium (KWWSVS\WKRQYLVXDOL]DWLRQJLWKXELRIROLXP) работает с Ŝ, используется
;
plotly (KWWSVSORWO\S\WKRQPDSV) — еще один пакет для построения, который вклю-
чает в себя возможность работы с графиками;
dash (KWWSVGDVKSORWO\) использует Plotly, Flask и JavaScript для создания инте-
рактивных визуализаций, включая карты;
fiona (KWWSVJLWKXEFRP7REOHULW\)LRQD) оборачивает библиотеку OGR, которая ра-
ботает с шейп-файлами и другими векторными форматами;
Open Street Map (KWWSVRUHLOO\%-HKD) получает доступ к обширной коллекции карт
мира OpenStreetMap (KWWSVZZZRSHQVWUHHWPDSRUJ);
mapnik (KWWSPDSQLNRUJ) — библиотека, написанная на C++, имеющая привязку
к Python; используется для создания векторных (линии) и растровых (изобра-
жения) карт;
Vincent (KWWSYLQFHQWUHDGWKHGRFVRUJ) преобразуется в Vega, инструмент визуали-
зации JavaScript; см. руководство Mapping data in Python with pandas and vincent
(KWWSVRUHLOO\7E7&);
Python for ArcGIS (KWWSELWO\S\DUFJLV) — ссылки на ресурсы Python для коммер-
ческого продукта ArcGIS фирмы Esri;
Using geospatial data with Python (KWWSELWO\JHRVS\) — видеопрезентации;
ǫȓȈȊȈǯȈȘȈȉȖȚȖȑ
So you’d like to make a map using Python (KWWSELWO\S\WKRQPDS) использует Pandas,
Matplotlib, shapely и другие модули Python для создания карт с расположением
памятных плит на зданиях;
Python Geospatial Development (KWWSELWO\S\JHRGHY)1 (издательство Packt) —
книга Эрика Вестры, содержащая примеры использования и других
инструментов;
Learning Geospatial Analysis with Python (KWWSELWO\OHDUQJHRS\) (издательство
Packt) — еще одна книга. Ее написал Джоэл Лохед. Он сделал обзор форматов
и библиотек, а также включил геопространственные алгоритмы;
geomancer (KWWSVJLWKXEFRPWKLQNLQJPDFKLQHVJHRPDQFHU) полезен для геопростран-
ственных работ, например для нахождения расстояния от некой точки до бли-
жайшего ирландского бара.
Если вам интересны карты, то попробуйте скачать и установить один из этих
пакетов и посмотреть, что вы можете сделать с его помощью. Или можете избежать
установки ПО и попытаться соединиться с API удаленного сервера самостоятель-
но — в главе 18 показывается, как соединяться с веб-серверами и декодировать
ответы JSON.
ǷȘȐȓȖȎȍȕȐȧȐȌȈȕȕȣȍ
Мы говорили о рисовании карт, но с данными о картах вы можете сделать гораздо
большее. Геокодирование преобразует адреса в географические координаты и наобо-
рот. Существует множество геокодирующих API (KWWSVRUHLOO\=TZ:) (их сравнение
вы можете увидеть на сайте KWWSELWO\IUHHJHRDSL) и библиотек Python:
geopy (KWWSVFRGHJRRJOHFRPSJHRS\);
pygeocoder (KWWSVS\SLS\WKRQRUJS\SLS\JHRFRGHU);
googlemaps (KWWSS\JRRJOHPDSVVRXUFHIRUJHQHW).
Если вы авторизуетесь с помощью Google или другого источника, чтобы полу-
чить ключ для API, то сможете получить доступ к другим сервисам, выполняющим,
например, пошаговое прокладывание маршрутов путешествий или локальный
поиск.
Вот несколько ресурсов, касающихся отображения данных:
KWWSZZZFHQVXVJRYJHRPDSVGDWD — обзор файлов карт U.S. Census Bureau;
KWWSZZZFHQVXVJRYJHRPDSVGDWDGDWDWLJHUKWPO — множество географических
и демографических карт;
KWWSZLNLRSHQVWUHHWPDSRUJZLNL3RWHQWLDOB'DWDVRXUFHV — мировые ресурсы;
KWWSZZZQDWXUDOHDUWKGDWDFRP — векторные и растровые данные карт в трех мас-
штабах.
1
Вестра Э. Разработка геоприложений на языке Python. — М.: ДМК Пресс, 2017.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǿȐȚȈȑȚȍȌȈȓȍȍ
Мы отправимся на научную ярмарку и посмотрим все экспонаты, связанные
с Python.
ǻȗȘȈȎȕȍȕȐȧ
21.1. Установите Geopandas и запустите пример 21.1. Попробуйте поизменять цвета
и размеры меток.
ƋƓƈƊƈ
3\WKRQȊȕȈțȒȍ
В последние годы в основном из-за ПО, показанного в этой главе, Python стал очень
популярен среди ученых. Если вы и сами ученый или студент, то, возможно, пользо-
вались такими инструментами, как MatLab и R, или традиционными языками, на-
пример Java, C или C++. Сейчас вы увидите, что Python стал отличной платформой
для научного анализа и публикации результатов.
ǴȈȚȍȔȈȚȐȒȈȐșȚȈȚȐșȚȐȒȈ
ȊșȚȈȕȌȈȘȚȕȖȑȉȐȉȓȐȖȚȍȒȍ
Для начала вернемся к стандартной библиотеке и рассмотрим ряд особенностей
и модулей, которые мы проигнорировали.
ǴȈȚȍȔȈȚȐȟȍșȒȐȍȜțȕȒȞȐȐ
Python имеет множество математических функций в стандартной библиотеке math
(KWWSVRUHLOO\6+3). Просто введите , чтобы получить к ним доступ из
своих программ.
Она содержит такие константы, как pi и e:
ʴʴʴ
ʴʴʴŜ
ʴʴʴɪŜɨɫɨɬɰɩɭɬɪɬɯɰɮɰɪ
ʴʴʴŜ
ɩŜɮɨɯɩɯɨɯɩɯɫɬɰɥɫɬ
1
Оригинальная цитата: In her reign the power of steam On land and sea became supreme,
And all now have strong reliance In fresh victories of science. — Примеч. пер.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
Если вы хотите задать другое основание логарифма, то передайте его как второй
аргумент:
ʴʴʴŜſɯřɩƀ
ɪŜɥ
ǸȈȉȖȚȈșȒȖȔȗȓȍȒșȕȣȔȐȟȐșȓȈȔȐ
Комплексные числа полностью поддерживаются основой языка Python в традици-
онной нотации с мнимой и действительной частями:
ʴʴʴɤȘșȝȥȦȖȜȦșȟȰȡȢșȫȜȥȟȢ
ŜŜŜɬ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ɬ
ʴʴʴɤȠȡȜȠȢșȫȜȥȟȢ
ŜŜŜɯ
ɯ
ʴʴʴɤȠȡȜȠȢșȫȜȥȟȢ
ŜŜŜɪʫɩ
ſɪʫɩƀ
Поскольку мнимое число i (в Python оно записывается как ɨ) определено как
квадратный корень из –1, мы можем выполнить следующее:
ʴʴʴɨƋɨ
ſŞɨʫɥƀ
ʴʴʴſɮʫɨƀƋɨ
ſŞɨʫɮƀ
ǸȈșșȟȐȚȣȊȈȍȔȚȖȟȕȖȍȏȕȈȟȍȕȐȍȟȐșȍȓ
șȗȓȈȊȈȦȡȍȑȚȖȟȒȖȑșȗȖȔȖȡȤȦȔȖȌțȓȧGHFLPDO
Числа с плавающей точкой в вычислительной технике не похожи на настоящие
числа, которые мы изучали в школе:
ʴʴʴʰɨɥŜɥŵɪŜɥ
ʴʴʴ
ɪŜɪɪɪɪɪɪɪɪɪɪɪɪɪɪɪɬ
Эй, что это за пятерка в конце? На ее месте должна быть тройка. Так происходит
потому, что количество битов в регистрах процессора ограничено и числа, которые
не являются степенями двойки, не могут быть выражены точно.
С помощью модуля (KWWSVRUHLOO\REP5) вы можете записывать числа
с желаемым уровнем точности. Это особенно важно для расчетов денежных сумм.
Сумма в валюте Соединенных Штатов не может быть меньше одного цента (сотая
часть доллара), поэтому при подсчете количества долларов и центов нам нужно
быть предельно точными. Если мы попробуем представить доллары и центы как
значения с плавающей точкой, такие как 19,99 или 0,06, то потеряем некоторую часть
точности в последних битах еще до начала вычислений. Как с этим справиться?
Легко. Нужно использовать модуль :
ʴʴʴ
ʴʴʴ ʰ ſɐɨɰŜɰɰɐƀ
ʴʴʴʰ ſɐɥŜɥɭɐƀ
ʴʴʴʰ ʫſ Ƌƀ
ʴʴʴ
ſɐɩɨŜɨɯɰɫɐƀ
ʴʴʴʰ ſɐɥŜɥɨɐƀ
ʴʴʴŜſƀ
ſɐɩɨŜɨɰɐƀ
ǪȣȗȖȓȕȧȍȔȊȣȟȐșȓȍȕȐȧȌȓȧȘȈȞȐȖȕȈȓȤȕȣȝȟȐșȍȓ
șȗȖȔȖȡȤȦȔȖȌțȓȧIUDFWLRQV
Вы можете представлять числа как числитель, разделенный на знаменатель, с по-
мощью модуля стандартной библиотеки Python (KWWSVRUHLOO\OJ).
Рассмотрим пример простой операции умножения 1/3 на 2/3:
ʴʴʴ
ʴʴʴ ſɨřɪƀƋ ſɩřɪƀ
ſɩřɰƀ
ǰșȗȖȓȤȏțȍȔ3DFNHG6HTXHQFHV
șȗȖȔȖȡȤȦȔȖȌțȓȧDUUD\
В Python список больше похож на связанный список, а не на массив. Если вы
хотите получить одномерную последовательность элементов одинакового типа,
то применяйте тип array (KWWSVRUHLOO\9HM38). Переменные этого типа используют
меньше места и поддерживают многие методы работы со списками. Создайте массив
с помощью команды вида array(ȞȢȘ ȦȜȣȔř ȜȡȜȪȜȔȟȜțȔȦȢȤƀ. Код типа указывает на
тип данных (такой как int или float), а опциональный ȜȡȜȪȜȔȟȜțȔȦȢȤ содержит
исходные значения, которые можно передать как список, строку или итерируемое
значение.
Я никогда не использовал этот пакет для решения реальных задач. Это низко-
уровневая структура данных, полезная для представления чего-то наподобие изо-
бражений. Если для выполнения числовых подсчетов вам на самом деле нужен мас-
сив, особенно имеющий больше одного измерения, то лучше задействовать NumPy,
о котором мы поговорим чуть позже.
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǶȉȘȈȉȈȚȣȊȈȍȔȗȘȖșȚțȦșȚȈȚȐșȚȐȒț
șȗȖȔȖȡȤȦȔȖȌțȓȧVWDWLVWLFV
Начиная с версии Python 3.4, (KWWSVRUHLOO\'(/Q0) — стандартный модуль.
Он содержит традиционные функции: среднее, медиану, режим, стандартное откло-
нение, распределение и т. д. Входными аргументами являются последовательности
(списки или кортежи) или итераторы любого числового типа данных: int, float,
и . Одна из функций, , также принимает в качестве аргументов
строки. Для Python существует множество других статистических функций, доступ-
ных в пакетах, таких как SciPy и Pandas, которые мы рассмотрим далее в этой главе.
ǷȍȘȍȔȕȖȎȍȕȐȍȔȈȚȘȐȞ
Начиная с Python 3.5, вы увидите символ ɒ, который делает необычные вещи. Он все
еще может использоваться для декораторов, но будет применяться также и для пере-
множения матриц (KWWSVRUHLOO\IDNR'). Если вы работаете со старой версией Python,
то вам следует задействовать NumPy.
3\WKRQȌȓȧȕȈțȒȐ
В оставшейся части этой главы рассматриваются сторонние пакеты Python для
науки и математики. Несмотря на то что вы можете установить их индивидуально,
следует рассмотреть их одновременное скачивание в качестве части научного дис-
трибутива Python. Рассмотрим основные варианты.
Anaconda (KWWSVZZZDQDFRQGDFRP) — это бесплатный пакет, имеющий множе-
ство самых свежих возможностей. Он поддерживает Python 2 и 3 и не вредит
установленной у вас версии Python.
Enthought Canopy (KWWSVDVVHWVHQWKRXJKWFRPGRZQORDGV) — доступна как бесплатная,
так и коммерческая версии.
Python(x, y) (KWWSVS\WKRQ[\JLWKXELR) — этот релиз подходит только для Windows.
Pyzo (KWWSZZZS\]RRUJ) — этот пакет основан на некоторых инструментах пакета
Anaconda, а также других.
Я рекомендую установить пакет Anaconda. Он большой, и все представленное
в этой главе содержится в нем. Примеры остальной части главы подразумевают,
что вы установили необходимые пакеты либо отдельно, либо как часть Anaconda.
1XP3\
NumPy (KWWSZZZQXPS\RUJ) — это одна из основных причин популярности Python
среди ученых (KWWSZZZQXPS\RUJ). Вы слышали, что динамические языки, такие
как Python, зачастую медленнее компилирующих языков наподобие С или даже
ǫȓȈȊȈ3\WKRQȊȕȈțȒȍ
других интерпретируемых языков, например Java. NumPy был написан для предо-
ставления доступа к быстрым многомерным массивам по аналогии с научными
языками, такими как FORTRAN. Вы получаете скорость С и дружелюбную к раз-
работчикам природу Python.
Если вы скачали один из научных дистрибутивов Python, то у вас уже есть
NumPy. В противном случае следуйте инструкциям на странице скачивания NumPy
(KWWSVRUHLOO\+F==L).
Чтобы начать работу с NumPy, вы должны понять устройство основной струк-
туры данных, многомерного массива (от N-dimensional array — «N-мерный
массив») или просто array. В отличие от списков и кортежей в Python, все элементы
должны иметь одинаковый тип. NumPy называет количество измерений массива его
рангом. Одномерный массив похож на ряд значений, двумерный — на таблицу со
строками и столбцами, а трехмерный — на кубик Рубика. Длина измерений может
не быть одинаковой.
ǴȈșșȐȊȣDUUD\Ȋ1XP3\ȐDUUD\Ȋ3\WKRQ²ȕȍȖȌȕȖȐȚȖȎȍǬȈȓȍȍȊȥȚȖȑȋȓȈȊȍ
ȧȉțȌțȘȈȉȖȚȈȚȤȚȖȓȤȒȖșȔȈșșȐȊȈȔȐ1XP3\
ǹȖȏȌȈȍȔȔȈșșȐȊșȗȖȔȖȡȤȦȜțȕȒȞȐȐDUUD\
Вы можете создать массив из обычного списка или кортежа:
ʴʴʴʰŜſƃɩřɫřɭřɯƄƀ
ʴʴʴ
ſƃɩřɫřɭřɯƄƀ
ǹȖȏȌȈȍȔȔȈșșȐȊ
șȗȖȔȖȡȤȦȜțȕȒȞȐȐDUDQJH
Метод ſƀNumPy похож на стандартный метод ſƀ Python. Если вы вы-
зовете метод ſƀ, передав ему один целочисленный аргумент , то он вернет
от ɥ до Şɨ:
ʴʴʴ
ʴʴʴʰŜſɨɥƀ
ʴʴʴ
ſƃɥřɨřɩřɪřɫřɬřɭřɮřɯřɰƄƀ
ʴʴʴŜ
ɨ
ʴʴʴŜ
ſɨɥřƀ
ʴʴʴŜ
ɨɥ
Вы также можете передать как третий параметр размер шага, который будет ис-
пользован вместо единицы:
ʴʴʴʰŜſɮřɨɨřɩƀ
ʴʴʴ
ſƃɮřɰƄƀ
И последний прием: аргумент диктует функции ſƀ, какой тип зна-
чения следует создать:
ʴʴʴʰŜſɨɥřɫřŞɨŜɬřʰŜƀ
ʴʴʴ
ſƃɨɥŜřɯŜɬřɮŜřɬŜɬƄƀ
ǫȓȈȊȈ3\WKRQȊȕȈțȒȍ
ǹȖȏȌȈȍȔȔȈșșȐȊ
șȗȖȔȖȡȤȦȜțȕȒȞȐȑ]HURV RQHV ȐUDQGRP
Метод ſƀ возвращает массив, все значения которого равны ɥ. В эту функцию
вам нужно передать аргумент, содержащий желаемую форму массива. Так создается
одномерный массив:
ʴʴʴʰŜſſɪřƀƀ
ʴʴʴ
ſƃɥŜřɥŜřɥŜƄƀ
ʴʴʴŜ
ɨ
ʴʴʴŜ
ſɪřƀ
ʴʴʴŜ
ɪ
ſƃƃɨŜɰɩɫɨɬɭɰɰŞɥɨřɫŜɫɪɨɪɨɫɥɫŞɥɨřɮŜɰɰɩɩɭɮɮɪŞɥɨř
ɨŜɨɫɪɥɨɰɫɩŞɥɨřɩŜɯɬɪɯɪɫɪɥŞɥɫƄř
ƃɭŜɬɪɮɥɬɮɫɰŞɥɨřɮŜɫɯɥɪɫɬɬɰŞɥɨřɫŜɫɰɫɭɪɩɫɨŞɥɨř
ɫŜɯɮɰɥɭɰɨɬŞɥɨřɰŜɪɫɪɫɨɨɨɯŞɥɨƄř
ƃɰŜɫɮɬɮɬɬɭɩŞɥɨřɩŜɩɨɨɬɩɬɯɪŞɥɨřɩŜɫɰɥɪɨɩɥɰŞɥɨř
ɪŜɫɭɨɰɥɰɭɨŞɥɨřɯŜɰɫɯɫɩɭɮɭŞɥɨƄƄƀ
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǰȏȔȍȕȧȍȔȜȖȘȔțȔȈșșȐȊȈ
șȗȖȔȖȡȤȦȔȍȚȖȌȈUHVKDSH
До этого момента массив не особо отличался от списка или кортежа. Одно из их раз-
личий — возможность изменять его форму с помощью функции ſƀ:
ʴʴʴʰŜſɨɥƀ
ʴʴʴ
ſƃɥřɨřɩřɪřɫřɬřɭřɮřɯřɰƄƀ
ʴʴʴʰŜſɩřɬƀ
ʴʴʴ
ſƃƃɥřɨřɩřɪřɫƄř
ƃɬřɭřɮřɯřɰƄƄƀ
ʴʴʴŜ
ɩ
ʴʴʴŜ
ſɩřɬƀ
ʴʴʴŜ
ɨɥ
ǷȖȓțȟȈȍȔȥȓȍȔȍȕȚșȗȖȔȖȡȤȦȒȖȕșȚȘțȒȞȐȐ>@
Одномерный массив работает как список:
ʴʴʴʰŜſɨɥƀ
ʴʴʴƃɮƄ
7
ʴʴʴƃŞɨƄ
9
ǴȈȚȍȔȈȚȐȒȈȔȈșșȐȊȖȊ
Создание и изменение формы массивов так нас увлекли, что мы почти забыли
сделать с ними нечто более полезное. Для начала мы задействуем переопреде-
ленный в NumPy оператор умножения (*), чтобы умножить все значения массива
за раз:
ʴʴʴƋ
ʴʴʴʰſɫƀ
ʴʴʴ
ſƃɥřɨřɩřɪƄƀ
ʴʴʴƋʰɪ
ʴʴʴ
ſƃɥřɪřɭřɰƄƀ
dzȐȕȍȑȕȈȧȈȓȋȍȉȘȈ
NumPy содержит множество функций линейной алгебры. Например, определим
такую систему линейных уравнений:
ɫʫɬʰɩɥ
ʫɩʰɨɪ
ǫȓȈȊȈ3\WKRQȊȕȈțȒȍ
Так и есть. Чтобы напечатать меньше текста, вы также можете дать NumPy ука-
зание найти скалярное произведение массивов:
ʴʴʴ ʰŜſ řƀ
ʴʴʴ
ſƃɩɥŜřɨɪŜƄƀ
Если решение верно, то значения массива должны быть близки к значе-
ниям массива . Функция ſƀ позволяет проверить, являются ли
массивы хотя бы приблизительно равными (они могут быть не полностью равными
из-за округления чисел с плавающей точкой):
ʴʴʴŜ ſ řƀ
ǩȐȉȓȐȖȚȍȒȈ6FL3\
Библиотека SciPy (KWWSZZZVFLS\RUJ) создана на основе NumPy и имеет даже боль-
ше математических и статистических функций. Релиз SciPy (KWWSVRUHLOO\<Y*)
содержит NumPy, SciPy, Pandas (ее мы рассмотрим позже в этой главе) и другие
библиотеки.
SciPy содержит множество модулей, включая те, которые выполняют следующие
задачи:
оптимизацию;
ведение статистики;
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
интерполяцию;
линейную регрессию;
интеграцию;
обработку изображений;
обработку сигналов.
Если вы уже работали с другими научными инструментами для компьютера, то
обнаружите, что Python, NumPy и SciPy охватывают области, с которыми работает
также коммерческий MATLAB (KWWSVRUHLOO\M2302) или приложение с открытым
исходным кодом R (KWWSZZZUSURMHFWRUJ).
ǩȐȉȓȐȖȚȍȒȈ[Link]
Как и предыдущая библиотека, SciKit (KWWSVVFLNLWVDSSVSRWFRP) — это группа науч-
ных пакетов, построенная на основе SciPy. SciKit-Learn (KWWSVVFLNLWOHDUQRUJ) — это
пакет, который специализируется на машинном обучении: поддерживает моделиро-
вание, классификацию, кластеризацию и разнообразные алгоритмы.
3DQGDV
С недавнего времени распространено употребление словосочетания «наука о дан-
ных». Я слышал определения «статистика, собираемая на Mac» или «статистика, со-
бираемая в Сан-Франциско». Как бы вы ни определили науку о данных, инструмен-
ты, о которых я говорил ранее, — NumPy, SciPy и собственно Pandas, вынесенный
в тему этого подраздела, — компоненты растущего популярного инструментария,
работающего с данными. (Mac и Сан-Франциско опциональны.)
Pandas (KWWSSDQGDVS\GDWDRUJ) — это новый пакет для интерактивного анализа
данных. Он особенно полезен для манипулирования данными реального мира с по-
мощью комбинирования матричной математики NumPy и возможности обработки
таблиц и реляционных баз данных. В книге Python for Data Analysis: Data Wrangling
with Pandas, NumPy and IPython Уэса Маккини1 (издательство O’Reilly) рассматри-
вается выпас данных с помощью NumPy, Python и Pandas.
NumPy ориентирован на традиционные научные вычисления, которые, как пра-
вило, манипулируют многомерными множествами данных одного типа, обычно
числами с плавающей точкой. Pandas больше похож на редактор базы данных, об-
рабатывающий несколько типов данных в группе. В некоторых языках такие группы
называются записями или структурами. Pandas определяет базовую структуру
данных, называемую . Она представляет собой упорядоченную коллек-
цию граф с именами и типами и напоминает таблицу, именованный кортеж или
вложенный словарь в Python. Ее предназначение заключается в упрощении работы
с любыми данными, которые можно встретить не только в науке, но и в бизнесе.
1
Маккини У. Python и анализ данных. — М.: ДМК-Пресс, 2015.
ǫȓȈȊȈ3\WKRQȊȕȈțȒȍ
3\WKRQȐȕȈțȟȕȣȍȖȉȓȈșȚȐ
Мы рассматривали инструменты Python, которые можно использовать практи-
чески в любой области науки. Но как насчет программного обеспечения и до-
кументации, нацеленных на конкретные научные области? Рассмотрим примеры
использования Python для решения определенных задач и несколько узконаправ-
ленных библиотек.
Общие:
вычисления Python в науке и инженерном деле (KWWSELWO\S\FRPSVFL);
интенсивный курс Python для ученых (KWWSELWO\S\IRUVFL).
Физика:
физические вычисления (KWWSELWO\FRPSSK\VS\);
Astropy (KWWSVZZZDVWURS\RUJ);
SunPy (KWWSVVXQS\RUJ) (анализ данных, поступающих с Солнца);
MetPy (KWWSVXQLGDWDJLWKXELR0HW3\) (анализ метеорологических данных);
Py-ART (KWWSVDUPGRHJLWKXELRS\DUW) (погодный радар);
Community Intercomparison Suite (KWWSZZZFLVWRROVQHW) (атмосферные науки);
Freud (KWWSVIUHXGUHDGWKHGRFVLR) (анализ траектории);
Platon (KWWSVSODWRQUHDGWKHGRFVLR) (атмосферы экзопланет);
PSI4 (KWWSSVLFRGHRUJ) (квантовая химия);
OpenQuake Engine (KWWSVJLWKXEFRPJHPRTHQJLQH);
yt (KWWSV\WSURMHFWRUJ) (волюметрический анализ данных).
Биология и медицина:
Biopython (KWWSVELRS\WKRQRUJ);
Python для биологов (KWWSS\WKRQIRUELRORJLVWVFRP);
Введение в прикладную биоинформатику (KWWSUHDGLDERUJ);
ǿȈșȚȤ,, 3\WKRQȕȈȗȘȈȒȚȐȒȍ
ǿȐȚȈȑȚȍȌȈȓȍȍ
Мы достигли конца наблюдаемой вселенной Python, за исключением приложений
из мультивселенной.
ǻȗȘȈȎȕȍȕȐȧ
22.1. Установите Pandas. Получите CSV-файл в примере 16.1. Запустите программу
из примера 16.2. Поэкспериментируйте с командами Pandas.
ǷȘȐȓȖȎȍȕȐȧ
ƗƘƐƓƖƎƍƕƐƍƈ
ǨȗȗȈȘȈȚȕȖȍȐȗȘȖȋȘȈȔȔȕȖȍ
ȖȉȍșȗȍȟȍȕȐȍȌȓȧȕȈȟȐȕȈȦȡȐȝ
ȗȘȖȋȘȈȔȔȐșȚȖȊ
ǨȗȗȈȘȈȚȕȖȍȖȉȍșȗȍȟȍȕȐȍ
DzȖȔȗȤȦȚȍȘȣȗȍȡȍȘȕȣȝȓȦȌȍȑ
Когда пещерные люди Ог и Тог возвращались с охоты, они подходили к своим куч-
кам камней и клали в каждую из них по одному камню за каждого убитого мамонта.
Но эти кучи годились, только чтобы похвастаться тем, что у одного из них камней
больше, чем у другого.
Далекие потомки Ога (Тог был растоптан мамонтом, когда клал очередной ка-
мень) научились считать, писать и пользоваться абаком. Но, чтобы перейти от этих
инструментов к концепции компьютера, потребуется задействовать воображение
и технологические достижения. Первая необходимая технология — электричество.
ǷȘȐȓȖȎȍȕȐȍǨǨȗȗȈȘȈȚȕȖȍȐȗȘȖȋȘȈȔȔȕȖȍȖȉȍșȗȍȟȍȕȐȍ
ȅȓȍȒȚȘȐȟȍșȚȊȖ
Бен Франклин считал, что электричество — это поток некой невидимой жидкости
из места с большим количеством жидкости (положительного) в место с меньшим
количеством (отрицательное). Он был прав, но перепутал термины. Электроны
путешествуют от «отрицательного» места в «положительное», но они были откры-
ты гораздо позже — менять терминологию оказалось слишком поздно. Поэтому
с тех пор нам нужно помнить, что электроны движутся в одну сторону, а ток течет
в другую.
Все мы знакомы с такими природными электрическими феноменами, как стати-
ческое электричество или молнии. После того как люди открыли способ отправить
электроны по проводам для создания электрических цепей, мы еще на один шаг
приблизились к созданию компьютеров.
Раньше я думал, что электрический ток в проводе вызывается проворными
электронами, которые нарезают круги по всей дистанции. На самом деле это не так.
Электроны перемещаются от одного атома к другому. Они ведут себя как шарико-
подшипники в трубке (или шарики тапиоки в соломинке). Добавленный с одного
конца шарик толкает соседа. Так происходит до тех пор, пока шарик с противопо-
ложного конца не вытолкнется. Как правило, электроны перемещаются медленно
(скорость перемещения по проводу составляет примерно три дюйма в час), однако
это практически мгновенное столкновение очень быстро распространяет электро-
магнитную волну: ее скорость составляет от 50 до 99 % скорости света в зависимости
от проводника.
ǰȏȖȉȘȍȚȍȕȐȧ
Нам все еще нужно следующее:
способ запоминать какие-то данные;
способ что-то сделать с теми данными, которые мы запомнили.
Одной из концепций памяти был выключатель — предмет, который либо вклю-
чен, либо выключен, при этом он сохраняет свое состояние до тех пор, пока что-то
не переключит его в другое состояние. Электрический выключатель работает, от-
крывая и закрывая цепь, позволяя электронам течь по ней или блокируя их. Мы по-
стоянно используем выключатели, чтобы управлять светом и другими электриче-
скими устройствами. Нужен был способ управлять самим выключателем с помощью
электричества.
Самые первые компьютеры (и телевизоры) использовали для этих целей ваку-
умные трубки, но те были довольно большими и часто перегорали. Ключевым изо-
бретением, приведшим к появлению современных компьютеров, явился транзистор:
маленький, эффективный и надежный. Финальным аккордом стало значительное
уменьшение размеров транзисторов и объединение их в интегральные схемы.
С течением лет компьютеры становились быстрее и дешевели по мере того, как
их размеры уменьшались. Сигналы перемещаются быстрее, когда компоненты на-
ходятся рядом друг с другом.
ǷȘȐȓȖȎȍȕȐȧ
ǰȌȍȈȓȤȕȣȑȒȖȔȗȤȦȚȍȘ
Реальные компьютеры имеют множество сложных особенностей. Сконцентрируемся
на самых необходимых компонентах.
Интегральная плата содержит центральный процессор, память и провода, со-
единяющие их друг с другом и другими устройствами.
ǷȘȖȞȍșșȖȘ
ЦП (центральный процессор), или чип, выполняет собственно вычисления:
математические задачи вроде сложения;
сравнение значений.
ǷȈȔȧȚȤȐȒȥȠ
ОЗУ (оперативное запоминающее устройство) занимается «запоминанием». Оно ра-
ботает быстро, но энергозависимо (данные теряются, если выключается питание).
ЦП становятся еще быстрее, чем память, поэтому разработчики компьютеров
добавляют кэши: небольшие и более быстрые участки памяти, располагающиеся
между процессором и основной памятью. Пытаясь считать байты из памяти, ваш ЦП
сначала обращается к ближайшему кэшу (он называется L1), затем к следующему
(L2) и, наконец, к основной памяти.
ǽȘȈȕȍȕȐȍ
Поскольку основная память теряет данные, нам также нужно энергонезависимое
хранилище. Такие устройства дешевле, чем память, и хранят гораздо больше данных,
но и работают медленнее.
Традиционный метод хранения — магнитные диски (или жесткие диски — hard
drives, HDD) с перемещающимися головками, которые отвечают за чтение и запись,
как виниловые пластинки и стилус.
Гибридная технология называется SSD (Solid State Drive — твердотельный на-
копитель). Он изготавливается из полупроводников, как и ОЗУ, но при этом энер-
гонезависим, как магнитные диски. Цена и скорость работы выше, чем у HDD, но
ниже, чем у ОЗУ.
ǷȘȐȓȖȎȍȕȐȍǨǨȗȗȈȘȈȚȕȖȍȐȗȘȖȋȘȈȔȔȕȖȍȖȉȍșȗȍȟȍȕȐȍ
ǪȊȖȌȌȈȕȕȣȝ
Как вы помещаете данные в компьютер? Для людей основные варианты — это кла-
виатуры, мыши и сенсорные экраны.
ǪȣȊȖȌȌȈȕȕȣȝ
Как правило, люди видят данные с помощью экранов и принтеров.
ǶȚȕȖșȐȚȍȓȤȕȖȍȊȘȍȔȧȌȖșȚțȗȈ
Время, которое требуется для записи и получения данных из этих компонентов,
может значительно различаться. Это оказывает большое практическое влия-
ние. Например, ПО должно работать в памяти и получать оттуда данные, но также
должно надежно сохранять их в энергонезависимых устройствах, таких как диски.
Проблема заключается в том, что диски в тысячи раз медленнее, а сеть — и того
больше. Это значит, что программисты тратят много времени на выбор наилучшего
компромиссного решения между скоростью и стоимостью.
В статье Computer Latency at a Human Scale (KWWSVRUHLOO\*T') Дэвид Джеп-
песен сравнивает устройства. Я перенес его изыскания и другие исследования
в табл. А.1. Последние столбцы — соотношение, относительное время (ЦП — одна
секунда) и относительное расстояние (ЦП — один дюйм) — помогут лучше понять
эту таблицу.
ǺȈȉȓȐȞȈ$ǶȚȕȖșȐȚȍȓȤȕȖȍȊȘȍȔȧȌȖșȚțȗȈ
ǷȘȖȋȘȈȔȔȕȖȍȖȉȍșȗȍȟȍȕȐȍ
Как же управлять всем этим оборудованием? Для начала нужны инструкции (коман-
ды, которые указывают процессору, что делать) и данные (входные и выходные па-
раметры инструкций). В компьютерах с запоминаемой программой данными можно
считать все, что упрощает процесс проектирования. Но как представить инструкции
и данные? Что, если они сохраняются в одном месте, а выполняются в другом?
Дальние родственники пещерного человека Ога очень хотели бы узнать это.
ǪȕȈȟȈȓȍȉȣȓȉȐȚ
Вернемся к идее выключателя — чего-то, что сопровождает одно из двух значений.
Он может быть либо выключен, либо включен, иметь либо высокое, либо низкое
напряжение, быть положительным или отрицательным — он получает значение,
не забывает его и может предоставить любому, кто запросит это значение. Инте-
гральные схемы дали нам способ интегрировать и соединить миллиарды маленьких
переключателей в маленькие чипы.
Если переключатель может иметь всего два значения, то его можно использовать
для того, чтобы представить бит, или бинарную цифру. Ее значения можно расцени-
вать как ɥ и ɨ, да и нет, true и false или любым другим удобным для нас способом.
Однако биты слишком малы, чтобы представить какое-либо значение, помимо ɥ
и ɨ. Как нам убедить биты представлять более крупные объекты?
Чтобы получить ответ, взгляните на свои пальцы. Мы используем всего десять
цифр (от 0 до 9) в повседневной жизни, а числа больше 9 получаются благодаря
позиционной записи. Если я добавлю 1 к числу 38, то 8 станет 9 и мы получим значе-
ние 39. Если я добавлю еще 1, то 9 превратится в 0, а 1 перенесется влево, увеличивая
3 до 4, что даст нам результат, равный 40. Крайнее правое число — это «колонка
единиц», то, что слева от него, — «колонка десятков» и т. д., по мере продвижения
влево выполняется умножение на 10. С помощью трех десятичных чисел вы можете
представить тысячу (10 * 10 * 10) чисел от ɥɥɥ до 999.
Мы можем использовать позиционную запись и для битов, объединяя их в более
крупные коллекции. Байт имеет 8 бит и может представлять 28 (256) возможных
комбинаций. Вы можете использовать байт для сохранения, например, небольших
чисел от ɥ до ɩɬɬ (в позиционной записи нужно оставить место для нуля).
Байт выглядит как последовательность из 8 бит, каждый из которых имеет либо
значение ɥ (или «выкл.», или false), либо значение ɨ (или «вкл.», или true). Самый
правый бит — наименее значимый, а самый левый — наиболее значимый.
ǴȈȠȐȕȕȣȑȧȏȣȒ
ЦП каждого компьютера разработан с набором инструкций, представленных ма-
сками битов (они еще называются кодами операций), которые он может понимать.
Каждый код операции выполняет определенную функцию; ее входные значения
находятся в одном месте, а выходные — в другом. В процессоре есть специальные
внутренние локации, называемые регистрами, в которых хранятся коды операций
и значения.
ǷȘȐȓȖȎȍȕȐȍǨǨȗȗȈȘȈȚȕȖȍȐȗȘȖȋȘȈȔȔȕȖȍȖȉȍșȗȍȟȍȕȐȍ
ǨșșȍȔȉȓȍȘ
На машинном языке программировать сложно. Вам нужно идеально указывать
каждый бит, что занимает очень много времени. Поэтому люди придумали чуть
более читаемый уровень языков, которые называются ассемблерными языками или
просто ассемблерами. Для каждого варианта процессора существует свой ассемблер.
Такие языки позволяют использовать имена переменных, чтобы определить поток
инструкций и данные.
ǪȣșȖȒȖțȘȖȊȕȍȊȣȍȧȏȣȒȐ
Чтобы освоить ассемблер, требуется приложить немало усилий, поэтому люди
разработали более высокоуровневые языки, которые им было бы проще использо-
вать. Такие языки транслируются в ассемблер программой, которая называется
компилятором, или же запускаются непосредственно с помощью интерпретатора.
ǷȘȐȓȖȎȍȕȐȧ
ǶȗȍȘȈȞȐȖȕȕȣȍșȐșȚȍȔȣ
Каждая инновация построена на других новшествах, появившихся до нее, и обычно
мы не знаем (или нам неважно), как работают более низкие уровни. Инструменты
строят инструменты для создания еще большего количества инструментов, и мы
принимаем это как должное.
Рассмотрим основные операционные системы:
Windows (Microsoft) — коммерческая, много версий;
macOS (Apple) — коммерческая;
Linux — открытый исходный код;
Unix — много коммерческих версий, в основном замененных на Linux.
Операционная система состоит из следующих компонентов:
ядро — планирует выполнение программ и управляет ими, а также вводом/вы-
водом;
драйверы устройств — используются ядром для получения доступа к ОЗУ, диску
и другим устройствам;
библиотеки — файлы исходного кода и бинарные файлы, используемые разра-
ботчиками;
приложения — отдельные программы.
Один компьютер может поддерживать больше одной операционной системы,
но за один раз запускается только одна. Процесс запуска ОС называется начальной
загрузкой (booting1), перезапуск — перезагрузкой (rebooting). Эти термины появи-
лись даже в области маркетинга фильмов — студии «перезагружают» предыдущие
1
Это отсылает к выражению «тянуть себя за шнурки ботинок» (lifting yourself by your own
bootstraps), что выглядит так же невероятно, как и компьютер.
ǷȘȐȓȖȎȍȕȐȍǨǨȗȗȈȘȈȚȕȖȍȐȗȘȖȋȘȈȔȔȕȖȍȖȉȍșȗȍȟȍȕȐȍ
ǪȐȘȚțȈȓȤȕȣȍȔȈȠȐȕȣ
Операционная система — по сути, большая программа, поэтому в конечном счете
кто-то придумал способ запустить чужие операционные системы как виртуальные
машины (гостевые программы) на своих хост-машинах. Вы можете установить на
свой компьютер Microsoft Windows, а затем в то же время запустить Linux на вирту-
альной машине, не покупая второй компьютер или не выполняя мультисистемную
загрузку.
DzȖȕȚȍȑȕȍȘȣ
Более свежая идея — это контейнер. Контейнер — способ запускать множество опе-
рационных систем одновременно до тех пор, пока у них одинаковое ядро. Идея была
популяризована командой разработчиков Docker (KWWSVZZZGRFNHUFRP) — они взя-
ли малоизвестные особенности ядра Linux и добавили к ним полезные возможности
по управлению. Их аналогия по отправке контейнеров (которая революционизиро-
вала отправку и сэкономила нам много денег) была прозрачной и привлекательной.
Выложив код в открытый доступ, команда разработчиков Docker добилась того, что
контейнеры быстро приняла вся компьютерная отрасль.
Google и другие облачные провайдеры добавляли поддержку ядра Linux годами
и использовали контейнеры в своих дата-центрах. Контейнеры используют меньше
ресурсов, чем виртуальные машины, что позволяет упаковывать больше программ
в одну коробку физического компьютера.
ǸȈșȗȘȍȌȍȓȍȕȕȣȍȊȣȟȐșȓȍȕȐȧȐșȍȚȐ
Когда бизнес только начал применять ПК, нужно было найти способ заставить ком-
пьютеры общаться друг с другом, а также с другими устройствами, например прин-
терами. Изначально использовалось проприетарное сетевое ПО, такое как Novell, но
в конечном счете его заменил стек протоколов TCP/IP, поскольку Интернет заметно
развился во второй половине 1990-х. Microsoft позаимствовала стек TCP/IP из бес-
платного варианта Unix, которая называется BSD1.
Одним из эффектов интернет-бума стал спрос на серверы: машины и ПО, кото-
рые позволяют запустить все сервисы для работы с вебом, чатами и электронной
почтой. Старый стиль сисадмина (системного администрирования) состоял в том,
1
В некоторых файлах Microsoft вы можете найти записи об авторских правах, принадле-
жащих Университету Калифорнии.
ǷȘȐȓȖȎȍȕȐȧ
ǬȖȔȈȠȕȐȍȎȐȊȖȚȕȣȍ ǹȒȖȚ
Именуются индивидуально Нумеруются автоматически
Требуется индивидуальный подход Стандартизированы
Восстанавливаются при сбоях Заменяются при сбоях
ǶȉȓȈȒȖ
Люди много лет создавали компьютерные кластеры, используя разные технологии.
Одной из более ранних концепций был Beowulf-кластер: идентичные компьютеры
для массовой обработки данных (от фирмы Dell или аналогов вместо рабочих стан-
ций от Sun или HP), связанные локальной сетью.
Термин облачные вычисления означает использование компьютеров в дата-цен-
трах для выполнения вычислений и хранения данных — однако не только для тех
компаний, которым принадлежат эти ресурсы бэкенда. Сервисы предоставляются
всем, а стоимость зависит от времени работы ЦП, занятого объема дисков и т. д.
Компания Amazon и ее AWS (Amazon Web Services) — самый известный облачный
сервис, но Azure (Microsoft) и Google Cloud также довольно велики.
На самом деле эти облака представляют собой пустые машины, виртуальные
машины и контейнеры — все они считаются скотом, а не домашними животными.
.XEHUQHWHV
Все компании, которым нужно управлять крупными кластерами компьютеров, рас-
положенных в нескольких дата-центрах, — например, Google, Amazon и Facebook —
создали или позаимствовали решения, которые позволяют этим компаниям мас-
штабироваться.
Развертывание. Как вы вводите в строй новое оборудование и программное обе-
спечение? Как вы заменяете его в случае сбоя?
Конфигурация. Как должны работать эти системы? Им нужны такие вещи, как
имена и адреса других компьютеров, пароли и настройки безопасности.
ǷȘȐȓȖȎȍȕȐȍǨǨȗȗȈȘȈȚȕȖȍȐȗȘȖȋȘȈȔȔȕȖȍȖȉȍșȗȍȟȍȕȐȍ
Большинство примеров этой книги были написаны и протестированы для Python 3.7,
последней стабильной версии на момент ее написания. Страница What’s New in
Python (KWWSVGRFVS\WKRQRUJZKDWVQHZ) представляет информацию о том, что было
добавлено в каждой версии. Существует множество исходных кодов Python и боль-
шое количество способов установить новую версию. В данном приложении я опишу
несколько из них.
Стандартный установщик загружает Python с сайта S\WKRQRUJ и добавляет вспо-
могательные программы, такие как pip и virtualenv.
Если ваша работа связана с наукой, то вам лучше подойдет версия Python, объ-
единенная с научными пакетами из Anaconda, — в таком случае вам нужно будет
использовать установщик вместо pip.
Windows не содержит Python, а в macOS, Linux и Unix, как правило, содержатся
старые версии. Пока они не наверстают упущенное, вам нужно будет установить
Python 3 самостоятельно.
ǷȘȖȊȍȘȤȚȍșȊȖȦȊȍȘșȐȦ3\WKRQ
В консоли или окне терминала введите команду python Ş:
ɛpython -V
ɪŜɮŜɩ
ǻșȚȈȕȖȊȒȈșȚȈȕȌȈȘȚȕȖȑȊȍȘșȐȐ3\WKRQ
Перейдите в браузере на официальную страницу скачивания Python ( KWWSV
ZZZS\WKRQRUJGRZQORDGV). Она попробует определить вашу операционную систему
и предоставить подходящие вам варианты. Если она ошибется, то вы можете ис-
пользовать следующие ссылки:
версии Python для Windows (KWWSVZZZS\WKRQRUJGRZQORDGVZLQGRZV);
версии Python для macOS (KWWSVZZZS\WKRQRUJGRZQORDGVPDFRV[);
исходные коды Python (Linux и Unix) (KWWSVZZZS\WKRQRUJGRZQORDGVVRXUFH).
Вы увидите страницу, похожую на ту, что показана на рис. Б.1.
ǸȐșǩǷȘȐȔȍȘșȚȘȈȕȐȞȣȏȈȋȘțȏȒȐ
то нажмите синюю ссылку 3\WKRQ в первом столбце таблицы снизу, под строкой
5HOHDVHYHUVLRQ. Так вы попадете на страницу информации, похожую на ту, что по-
казана на рис. Б.2.
ǸȐșǩǹȚȘȈȕȐȞȈȗȖȌȘȖȉȕȖșȚȍȑȏȈȋȘțȏȒȐ
Вам нужно прокрутить страницу вниз, чтобы увидеть ссылки для скачивания
(рис. Б.3).
PDF26
Нажмите ссылку PDF26ELWELWLQVWDOOHU (KWWSVRUHLOO\O*), чтобы скачать файл
с расширением Ŝ для Mac. Дважды щелкните на нем, чтобы увидеть начальное
диалоговое окно (рис. Б.4).
Нажмите кнопку &RQWLQXH (Продолжить). Вы увидите последовательность других
диалоговых окон.
ǷȘȐȓȖȎȍȕȐȍǩǻșȚȈȕȖȊȒȈ3\WKRQ
ǸȐșǩǵȐȎȕȧȧȟȈșȚȤșȚȘȈȕȐȞȣȗȘȍȌȓȈȋȈȦȡȈȧșȒȈȟȈȚȤ3\WKRQ
ǸȐșǩǷȍȘȊȣȑȥȒȘȈȕțșȚȈȕȖȊȖȟȕȖȋȖȌȐȈȓȖȋȈȌȓȧ0DF
ǷȘȐȓȖȎȍȕȐȧ
ǸȐșǩǬȍȊȧȚȣȑȥȒȘȈȕțșȚȈȕȖȊȖȟȕȖȋȖȌȐȈȓȖȋȈȌȓȧ0DF
:LQGRZV
ОС Windows никогда не включала в себя Python, но с недавних пор упростила его
установку. Обновление Windows 10 от мая 2019 года (KWWSVRUHLOO\*$EI) включает
в себя файлы Ŝ и ɪŜ. Это не интерпретаторы Python, а ссылки
на новую страницу в Microsoft Store, посвященную Python 3.7 (KWWSVRUHLOO\/N\BK).
Вы можете использовать эту ссылку, чтобы скачать и установить Python так же, как
вы это делаете для другого ПО.
Или же вы можете скачать и установить Python с официального сайта:
Windows x86 MSI installer (32-bit) (KWWSELWO\ZLQ[);
Windows x86-64 MSI installer (64-bit) (KWWSELWO\ZLQ[).
Чтобы определить, какая версия Windows установлена у вас (32- или 64-битная),
сделайте следующее:
нажмите кнопку ǷțșȒ;
щелкните правой кнопкой мыши на пункте ǴȖȑȒȖȔȗȤȦȚȍȘ;
выберите пункт меню ǹȊȖȑșȚȊȈ и найдите битовое значение.
Щелкните на соответствующем установщике (файл с расширением Ŝ). После
того как он будет скачан, нажмите его дважды и следуйте инструкциям.
ǷȘȐȓȖȎȍȕȐȍǩǻșȚȈȕȖȊȒȈ3\WKRQ
/LQX[ȐȓȐ8QL[
Пользователи Linux и Unix могут выбрать формат сжатия файлов исходного кода:
сжатие с помощью XZ (KWWSELWO\[]WDUEDOO);
сжатие с помощью Gzipped (KWWSELWO\J]LSWDUEDOO).
Скачайте любой из этих архивов. Разархивируйте его с помощью tar (для
файла с расширением Ŝ) или tar (для файла с расширением Ŝ), а затем за-
пустите полученный сценарий оболочки.
ǻșȚȈȕȖȊȒȈȔȍȕȍȌȎȍȘȈȗȈȒȍȚȖȊSLS
Если вы вышли за пределы стандартной установки Python, то два инструмента
практически бесценны для разработки на Python: это pip и virtualenv.
Пакет pip — это самый популярный способ установить сторонние (нестандарт-
ные) пакеты Python. Несколько раздражало то, что такой полезный инструмент
не являлся частью стандартного Python и его приходилось скачивать и устанав-
ливать самостоятельно. Как говорил мой друг, это жестокий, пугающий ритуал.
Хорошая новость заключается в том, что, начиная с версии 3.4, pip — стандартная
часть Python.
Если у вас установлен Python 3, но под рукой только версия pip для Python 2, то
получить версию для Python 3 под Linux или macOS можно так:
ɛcurl -O [Link]
ɛsudo python3 distribute_setup.py
ɛcurl -O [Link]
ɛsudo python3 [Link]
Это установит ŞɪŜɪ в каталог bin вашей версии Python 3. Далее для установки
сторонних пакетов вы можете использовать ŞɪŜɪ вместо версии для Python 2.
ǻșȚȈȕȖȊȒȈYLUWXDOHQY
Программа virtualenv зачастую применяется вместе с pip и представляет собой
способ установить пакеты Python в определенный каталог (папку), чтобы избежать
пересечений с пакетами Python, уже существующими в системе. Это позволяет ис-
пользовать любые пакеты Python, даже если у вас нет разрешения изменять суще-
ствующие установленные пакеты.
Ниже представлена пара хороших руководств по pip и virtualenv:
A Non-Magical Introduction to Pip and Virtualenv for Python Beginners (KWWSELWO\
MPSLSYOHQY);
The Hitchhiker’s Guide to Packaging: Pip (KWWSELWO\KKJSSLS).
ǷȘȐȓȖȎȍȕȐȧ
ǬȘțȋȐȍșȗȖșȖȉȣȘȈȉȖȚȣșȗȈȒȍȚȈȔȐ
Как вы уже видели, техники упаковки пакетов в Python различаются, и ни одна из
них не может решить сразу все задачи. PyPA (KWWSVZZZS\SDLR) (Python Packaging
Authority) — это группа добровольцев (не являющаяся частью официальной группы
по разработке ядра Python), которая работает над тем, чтобы упростить взаимодей-
ствие с пакетами Python. Группа написала руководство Python Packaging User’s
Guide (KWWSVSDFNDJLQJS\WKRQRUJ), где рассматриваются известные проблемы и их
решения.
Самые популярные инструменты — pip и virtualenv, я использовал их на протя-
жении всей этой книги. Если они не могут вам помочь или же вы хотите попробовать
что-то новое, то вот несколько альтернатив:
pipenv (KWWSVSLSHQYUHDGWKHGRFVLR) объединяет в себе pip и virtualenv, а также
включает и другие возможности. Обратите внимание на критику, которой он
подвергался (KWWSVRUHLOO\14S+), и обсуждение (KWWSVRUHLOO\SV:D);
poetry (KWWSVSRHWU\HXVWDFHLR) — это конкурент, который решает некоторые про-
блемы pipenv.
Но самой главной альтернативой, особенно если речь идет о научных или рабо-
тающих с большими данными приложениях, является . Вы можете получить
ее как часть дистрибутива Anaconda, о котором я поговорю далее, или же отдельно
(см. раздел «Устанавливаем Anaconda» ниже).
ǻșȚȈȕȈȊȓȐȊȈȍȔ$QDFRQGD
Anaconda (KWWSVGRFVDQDFRQGDFRPDQDFRQGD) — это всеобъемлющий установщик с ак-
центом на науку. Последняя версия, Anaconda3, включает в себя Python 3.7 и его
стандартную библиотеку, а также язык R для приложений, посвященных науке
о данных. Среди других плюсов — библиотеки, о которых мы говорили ранее в этой
книге: beautifulsoup4, Flask, ipython, Matplotlib, nose, numpy, Pandas, pillow, pip, scipy,
tables, zmq и множество других. Anaconda содержит кросс-платформенную программу
установки, которая называется , мы рассмотрим ее в следующем пункте.
Чтобы установить Anaconda 3, посетите страницу скачивания (KWWSVZZZDQD
FRQGDFRPGLVWULEXWLRQ) версий Python 3. Нажмите соответствующую ссылку для вашей
платформы (номера версий изменились с момента написания данного текста, но вы
сможете в этом разобраться):
установщик для macOS установит все в каталог , расположенный под
вашим домашним каталогом;
для Windows два раза щелкните на файле с расширением Ŝ после того, как
он скачается;
для Linux выберите 32- или 64-битную версию. После скачивания запустите его
(это большой сценарий оболочки).
ǷȘȐȓȖȎȍȕȐȍǩǻșȚȈȕȖȊȒȈ3\WKRQ
ǻȉȍȌȐȚȍșȤȟȚȖȐȔȧșȒȈȟȐȊȈȍȔȖȋȖȊȈȔȐȜȈȑȓȈȕȈȟȐȕȈȍȚșȧȕȈ$QDFRQGDǭșȓȐȖȕȖ
ȕȈȟȐȕȈȍȚșȧș$QDFRQGDȚȖȥȚȖȊȍȘșȐȧȌȓȧ3\WKRQ
ǹȖȗȘȖȋȘȈȔȔȣȐȞȐȒȓȣșȖȉȣȚȐȑ
В версию Python 3.4 был добавлен асинхронный модуль . Затем в версию
Python 3.5 были добавлены ключевые слова и await. Все это позволяет реа-
лизовать следующие новые концепции:
сопрограммы — это функции, которые приостанавливаются в разных точках;
цикл событий — цикл, в котором планируется запуск сопрограмм, а также они
выполняются.
ǷȘȐȓȖȎȍȕȐȍǪǵȍȟȚȖșȖȊȍȘȠȍȕȕȖȐȕȖȍDV\QF
Запустив данный код, вы увидите: между выводом на экран двух строк нет
задержки. Это произошло потому, что у нас есть две отдельные задачи. Первая —
ɏɨ — приостановилась на 2 секунды после вывода слова , но это не по-
влияло на вторую — ɏɩ.
Ключевое слово await аналогично ключевому слову в генераторах, но
вместо того, чтобы возвращать значение, оно помечает место, где цикл обработки
событий может приостановиться, если нужно.
В документации (KWWSVRUHLOO\&IBKG) содержится гораздо больше информации.
Синхронный и асинхронный код могут сосуществовать в одной программе. Главное —
помнить о необходимости указывать ключевое слово перед при объявлении
функции и ключевое слово await перед вызовом асинхронной функции.
Для дополнительной информации см.:
список (KWWSVRUHLOO\9M\') ссылок на ПО, использующее ;
код (KWWSVRUHLOO\Q)9[) веб-сканера, применяющего .
Альтернативы asyncio. Несмотря на то что модуль входит в стандарт-
ный пакет Python, вы можете использовать ключевые слова и await без него.
Сопрограммы и цикл обработки событий не зависят друг от друга. Дизайн модуля
иногда подвергается критике (KWWSVRUHLOO\Q)9[), и на этом фоне появились
сторонние альтернативы:
(KWWSVFXULRUHDGWKHGRFVLR);
trio (KWWSVWULRUHDGWKHGRFVLR).
Рассмотрим реальный пример, использующий trio и (KWWSVDVNVUHDGWKH
GRFVLR) (асинхронный веб-фреймворк, созданный на основе requests API). В при-
ǷȘȐȓȖȎȍȕȐȍǪǵȍȟȚȖșȖȊȍȘȠȍȕȕȖȐȕȖȍDV\QF
ǷȘȐȔȍȘǪWULRBDVNVBVLWHVS\
Ŝſɑɑƀ
ʰƃ
ɐśŵŵŜ ŵŞŵɐř
ɐśŵŵŜŜ ŵɐř
ɐśŵŵ Ŝ ŵɐř
ɐśŵŵŜŜ ŵŵŞŞ ŵŞɐř
Ƅ
ɏſřɨƀś
ʰŜſƀ
ɩʰŜſƀ
ſɑƇſɩŞɨƀśŜɥɫƈɎƇſŜ ƀƈɎƇƈɑƀ
ɏſƀś
ɨʰŜſƀ
Ŝɏſƀś
ś
Ŝɏſɏřřɨƀ
ɏɏɏɏʰʰɑɏɏɏɏɑś
ſɑ ɎɎɑƀ
Ŝſɏřƀ
DV\QFȗȘȖȚȐȊ«
Как вы уже видели на протяжении этой книги, реализовать конкурентность можно
с помощью множества приемов. Чем async отличается от них, а в чем похож?
Процессы. Это хорошее решение, если вы хотите использовать все ядра ЦП на
вашей машине или даже несколько машин. Однако процессы довольно тяжелые,
на их запуск требуется некоторое время, а для коммуникации между процессами
следует применить сериализацию.
Потоки. Несмотря на то что потоки разрабатывались как «легковесная» альтер-
натива процессам, каждый поток занимает большой объем памяти. Сопрограммы
гораздо легче, чем потоки; вы можете создать сотни тысяч сопрограмм на машине,
которая может поддерживать всего несколько тысяч потоков.
«Зеленые» потоки. Такие «зеленые» потоки, как gevent, работают хорошо и вы-
глядят очень похоже на синхронный код, но требуют выполнять «обезьяний
патч» стандартных функций Python, например библиотек сокетов.
Функции обратного вызова. Такие библиотеки, как , полагаются на функ-
ции обратного вызова: они вызываются, когда происходит определенное событие.
Это знакомо программистам, работающим с GUI и JavaScript.
Очереди. Как правило, являются крупномасштабным решением, когда вашим
данным или процессам требуется больше одной машины.
ǨșȐȕȝȘȖȕȕȣȍȜȘȍȑȔȊȖȘȒȐȐșȍȘȊȍȘȣ
Асинхронность появилась в Python недавно, и разработчикам требуется время для
создания асинхронных версий таких фреймворков, как Flask.
Стандарт ASGI (KWWSVDVJLUHDGWKHGRFVLR) — это асинхронная версия WSGI, более
подробно обсуждается здесь: KWWSVRUHLOO\%Q(;7.
Ниже представлены некоторые веб-серверы, работающие по принципу ASGI:
(KWWSVSJMRQHVJLWODELRK\SHUFRUQ);
(KWWSVVDQLFUHDGWKHGRFVLR);
(KWWSVZZZXYLFRUQRUJ).
А вот некоторые асинхронные веб-фреймворки:
aiohttp (KWWSVDLRKWWSUHDGWKHGRFVLR) — клиент и сервер;
ɏ (KWWSVS\WKRQKRVWHGRUJDSLBKRXU);
(KWWSVDVNVUHDGWKHGRFVLR) — похож на requests;
(KWWSVJLWKXEFRP5REHUWR3UHYDWR%ODFN6KHHS);
(KWWSVJLWKXEFRPERFDGLOORSURMHFWERFDGLOOR);
(KWWSVFKDQQHOVUHDGWKHGRFVLR);
fastapi (KWWSVIDVWDSLWLDQJRORFRP) — использует аннотации типов;
ǷȘȐȓȖȎȍȕȐȍǪǵȍȟȚȖșȖȊȍȘȠȍȕȕȖȐȕȖȍDV\QF
(KWWSVPXIILQUHDGWKHGRFVLR);
quart (KWWSVJLWODEFRPSJMRQHVTXDUW);
(KWWSVS\WKRQUHVSRQGHURUJ);
(KWWSVVDQLFUHDGWKHGRFVLR);
starlette (KWWSVZZZVWDUOHWWHLR);
(KWWSVZZZWRUQDGRZHERUJ);
vibora (KWWSVYLERUDLR).
И наконец, несколько асинхронных интерфейсов к базам данных:
(KWWSVDLRP\VTOUHDGWKHGRFVLR);
(KWWSVDLRUHGLVUHDGWKHGRFVLR);
(KWWSVJLWKXEFRPPDJLFVWDFNDV\QFSJ).
ƗƘƐƓƖƎƍƕƐƍƋ
ǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
3\WKRQșȟȍȔȍȋȖȍȌȧȚ
1.1. Если вы еще не установили Python 3, сделайте это сейчас. Прочтите приложе-
ние Б, чтобы узнать детали.
1.2. Запустите интерактивный интерпретатор Python 3. Детали опять же вы найдете
в приложении Б. Интерпретатор должен вывести несколько строк о себе, а за-
тем строку, начинающуюся с символов ʴʴʴ. Перед вами приглашение для ввода
команд Python.
ʴʴʴɯƋɰ
ɮɩ
1.4. Теперь введите число ɫɮ и нажмите клавишу (QWHU. Появилось ли число ɫɮ в сле-
дующей строке?
ʴʴʴɫɮ
ɫɮ
1.5. Теперь введите ſɫɮƀ и нажмите клавишу (QWHU. Появилось ли снова чис-
ло ɫɮ в следующей строке?
ʴʴʴſɫɮƀ
ɫɮ
ǷȘȐȓȖȎȍȕȐȍǫǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
ǺȐȗȣȌȈȕȕȣȝȏȕȈȟȍȕȐȧ
ȗȍȘȍȔȍȕȕȣȍȐȐȔȍȕȈ
2.1. Присвойте целочисленное значение 99 переменной и выведите ее на
экран.
ʴʴʴ ʰɰɰ
ʴʴʴſ ƀ
99
ʴʴʴ
ʴʴʴſɬƀ
ʳ ɐɐʴ
ʴʴʴſɩŜɥƀ
ʳ ɐɐʴ
ʴʴʴſɬʫɩŜɥƀ
ʳ ɐɐʴ
ǿȐșȓȈ
3.1. Сколько секунд в часе? Используйте интерактивный интерпретатор как кальку-
лятор и умножьте количество секунд в минуте (60) на количество минут в часе
(тоже 60).
ʴʴʴɭɥƋɭɥ
ɪɭɥɥ
ʴʴʴ ɏɏʰɭɥƋɭɥ
ʴʴʴ ɏɏ
ɪɭɥɥ
ǷȘȐȓȖȎȍȕȐȧ
ʴʴʴ ɏɏƋɩɫ
ɯɭɫɥɥ
3.4. Снова посчитайте количество секунд в сутках, но на этот раз сохраните резуль-
тат в переменной ɏɏ.
ǪȣȉȐȘȈȍȔșȗȖȔȖȡȤȦLI
4.1. Выберите число от 1 до 10 и присвойте его переменной . Выберите еще
одно число от 1 до 10 и присвойте его переменной guess. Далее напишите услов-
ные проверки (if, else и elif), чтобы вывести строку ɐ ɐ, если значение
переменной guess меньше 7, ɐ ɐ, если оно больше 7, и ɐ ɐ, если
равно .
Выбрали ли вы для переменной значение 7? Готов поспорить, так сделали мно-
гие, поскольку в числе 7 есть нечто волшебное.
ʰɮ
ʰɬ
ʳ ś
ſɐɐƀ
ʴ ś
ſɐɐƀ
ś
ſɐɐƀ
4.2. Присвойте значения или переменным и green. Напишите не-
сколько утверждений if/else, которые выведут на экран информацию о том,
соответствуют ли заданным условиям следующие растения: вишня, горошек,
арбуз, тыква.
ʴʴʴʰ
ʴʴʴʰ
ʴʴʴś
ŜŜŜś
ŜŜŜſɑɑƀ
ŜŜŜś
ŜŜŜſɑ ɑƀ
ŜŜŜś
ŜŜŜś
ŜŜŜſɑɑƀ
ŜŜŜś
ŜŜŜſɑɑƀ
ŜŜŜ
ǺȍȒșȚȖȊȣȍșȚȘȖȒȐ
5.1. Напишите с заглавной буквы слово, которое начинается с буквы m:
ʴʴʴʰɑɑɑř
ŜŜŜ ř
ŜŜŜɐŞŠɑɑɑ
5.2. Выведите на экран все вопросы из списка, а также правильные ответы в таком
виде:
Q: вопрос
A: ответ
ʴʴʴʰƃ
ŜŜŜɑɐŜţɑř
ŜŜŜɑ ɐţɑř
ŜŜŜɑɐŠŠŠɐţɑ
ŜŜŜƄ
ʴʴʴʰƃ
ǷȘȐȓȖȎȍȕȐȧ
ŜŜŜɑŜɑř
ŜŜŜɑř ɐŜɑř
ŜŜŜɑɐŠɐŜɑ
ŜŜŜƄ
ɏʰſſɥřɨƀřſɨřɩƀřſɩřɥƀƀ
řɏś
ſɑśɑřƃƄƀ
ſɑśɑřƃƄƀ
ſƀ
Результат:
ɛpython [Link]
śɐŜţ
śř ɐŜ
ś ɐţ
śɐŠɐŜ
śɐŠŠŠɐţ
śŜ
ʴʴʴʰɐɐɐ
ŜŜŜ ʩř
ŜŜŜ ʩř
ǷȘȐȓȖȎȍȕȐȍǫǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
ŜŜŜ ʩ
ŜŜŜɐʩŜ
ŜŜŜɐɐɐ
ʴʴʴʰſɐɐřɐɐřɐɐřɐ ɐƀ
ʴʴʴſʩƀ
ř
ř
ɐ Ŝ
ŜƇ ƈ
ƇƈƇƈŜ
Ƈƈř ƇƈŜ
ƇƈŜ
Ƈ ƈřř
Ƈ ƈʩƇƈŜ
Ŝ
ř
Ƈƈ
Ƈɏƈ
ʴʴʴʰɐɐɐ
ŜŜŜƇƈƇƈř
ŜŜŜ
ŜŜŜŜƇ ƈ
ŜŜŜƇƈƇƈŜ
ŜŜŜƇƈř ƇƈŜ
ŜŜŜ
ŜŜŜ ƇƈŜ
ŜŜŜƇ ƈřř
ŜŜŜƇ ƈʩƇƈŜ
ŜŜŜ
ŜŜŜŜ
ŜŜŜ
ŜŜŜ ř
ŜŜŜƇƈ
ŜŜŜƇɏƈ
ŜŜŜɐɐɐ
ǷȘȐȓȖȎȍȕȐȧ
5.5. Присвойте значения переменным ɐɐ, ɐɐ, ɐ ɐ, ɐɐ (глагол
в прошедшем времени), ɐɐ, ɐɐ, ɐ ɐ, ɐɐ и ɐɏɐ.
С помощью функции Ŝſƀвыведите на экран значение переменной
letter, в которую подставлены эти значения.
ʴʴʴſ
ŜŜŜŜſʰɐɐř
ŜŜŜʰɐɐř
ŜŜŜ ʰɐɐř
ŜŜŜʰɐɐř
ŜŜŜʰɐɐř
ŜŜŜʰɐ ɐř
ŜŜŜʰɐɛɨŜɰɰɐř
ŜŜŜ ʰɯɯř
ŜŜŜʰɐ ɐř
ŜŜŜɏʰɐ ɐƀ
ŜŜŜƀ
ř
Ŝ
Ŝ
ř Ŝ
ɛɨŜɰɰŜ
řř
ɯɯʩŜ
Ŝ
ř
5.6. После проведения публичных опросов с целью выбора имени появились: ан-
глийская подводная лодка Boaty McBoatface, австралийская беговая лошадь
Horsey McHorseface и шведский поезд Trainy McTrainface. Используйте фор-
матирование с символом ʩ для того, чтобы вывести на экран победившие имена
для утки, тыквы и шпица (пример Д.1).
ǷȘȐȔȍȘǬPFQDPHVS\
ʰƃɑ ɑřɑɑřɑɑƄ
ś
ɏʰŜ ſƀ
ſɑʩ ʩ ɑʩſ ɏř ɏƀƀ
ś
ǷȘȐȔȍȘǬPFQDPHVS\
ʰƃɑ ɑřɑɑřɑɑƄ
ś
ɏʰŜ ſƀ
ſɑƇƈ Ƈƈ ɑŜſ ɏř ɏƀƀ
ǷȘȐȔȍȘǬPFQDPHVS\
ʰƃɑ ɑřɑɑřɑɑƄ
ś
ɏʰŜ ſƀ
ſɑƇ ɏƈ Ƈ ɏƈ ɑƀ
ǹȖȏȌȈȍȔȞȐȒȓȣșȗȖȔȖȡȤȦȒȓȦȟȍȊȣȝ
șȓȖȊZKLOHȐIRU
6.1. Используйте цикл for, чтобы вывести на экран значения списка ƃɪř ɩř ɨř ɥƄ.
ʴʴʴƃɪřɩřɨřɥƄś
ŜŜŜſƀ
ŜŜŜ
ɪ
ɩ
ɨ
ɥ
ɏʰɮ
ʰɨ
ś
ʳɏś
ſɐɐƀ
ʰʰɏś
ſɐŠɐƀ
ʴɏś
ſɐɐƀ
ʫʰɨ
ǷȘȐȓȖȎȍȕȐȧ
Š
Обратите внимание: строка elif ʴ ɏś могла содержать обычный оператор
ś в связи с тем, что если значение не меньше и не равно значению ɏ,
то оно должно быть больше. По крайней мере в этой Вселенной.
ʴʴʴɏʰɬ
ʴʴʴſɨɥƀś
ŜŜŜʳɏś
ŜŜŜſɑɑƀ
ŜŜŜʰʰɏś
ŜŜŜſɑŠɑƀ
ŜŜŜ
ŜŜŜś
ŜŜŜſɑɑƀ
ŜŜŜ
ŜŜŜ
Š
DzȖȘȚȍȎȐȐșȗȐșȒȐ
7.1. Создайте список ɏ, содержащий год, в который вы родились, и каждый
последующий год вплоть до вашего пятого дня рождения. Например, если вы
родились в 1980 году, то список будет выглядеть так: ɏ ʰ ƃɨɰɯɥř ɨɰɯɨř
ɨɰɯɩř ɨɰɯɪř ɨɰɯɫř ɨɰɯɬƄ.
7.2. В какой год из списка ɏ был ваш третий день рождения? Учтите,
в первый год вам было 0 лет.
7.3. В какой год из списка ɏ вам было больше всего лет?
Вам нужно получить последний год, поэтому используйте смещение Şɨ. Вы также може-
те использовать смещение ɬ, поскольку знаете, что в этом списке всего шесть элементов.
Однако смещение Şɨ позволяет получить последний элемент из списка любой длины.
Для тех, кто родился в 1980 году:
ʴʴʴɏƃŞɨƄ
ɨɰɯɬ
ʴʴʴʰƃɑɑřɑ ɑřɑɑƄ
ʴʴʴ
ƃɐɐřɐ ɐřɐɐƄ
7.5. Напишите с большой буквы тот элемент списка things, который означает чело-
века, а затем выведите список. Изменился ли элемент списка?
Если вы хотите изменить его в списке, вам нужно присвоить его снова:
ʴʴʴƃɨƄʰƃɨƄŜ ſƀ
ʴʴʴ
ƃɐɐřɐɐřɐɐƄ
7.6. Переведите сырный элемент списка things в верхний регистр целиком и вы-
ведите список.
ʴʴʴƃɥƄʰƃɥƄŜſƀ
ʴʴʴ
ƃɐɐřɐɐřɐɐƄ
ǷȘȐȓȖȎȍȕȐȧ
7.8. Создайте список с элементами ɑ ɑ , ɑ ɑ и ɑ ɑ ; назовите его
surprise.
7.9. Напишите последний элемент списка surprise со строчной буквы, затем вы-
ведите эту строку в обратном порядке и с прописной буквы.
ʴʴʴƃŞɨƄʰƃŞɨƄŜſƀ
ʴʴʴƃŞɨƄʰƃŞɨƄƃśśŞɨƄ
ʴʴʴƃŞɨƄŜ ſƀ
ɐɐ
7.10. Используйте списковое включение, чтобы создать список с именем even, в ко-
тором будут содержаться четные числа в промежутке ſɨɥƀ.
ʴʴʴʰƃſɨɥƀʩɩʰʰɥƄ
ʴʴʴ
ƃɥřɩřɫřɭřɯƄ
7.11. Попробуйте создать генератор рифм для прыжков через скакалку. Нужно вы-
вести на экран последовательность двухстрочных рифм. Начните программу
с этого фрагмента:
ɨʰƃɑɑřɑɑřɑɑƄ
ʰƃ
ſɑɑřɑɑƀř
ſɑɑřɑɑƀř
ſɑɑřɑɑƀř
ǷȘȐȓȖȎȍȕȐȍǫǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
ſɑɑřɑ ɑƀř
ſɑɑřɑ ɑƀř
ſɑɑřɑɑƀř
ſɑɑřɑɐɑƀř
Ƅ
ɩʰɑɑ
ɨʰƃɑɑřɑɑřɑɑƄ
ʰƃ
ſɑɑřɑɑƀř
ſɑɑřɑɑƀř
ſɑɑřɑɑƀř
ſɑɑřɑ ɑƀř
ſɑɑřɑ ɑƀř
ſɑɑřɑɑƀř
ſɑɑřɑɐɑƀř
Ƅ
ɩʰɑɑ
ɨɏ ʰɑɑŜſƃŜ ſƀʫɑŠɑɨƄƀ
ř ś
ſɑƇɨɏ ƈƇŜ ſƀƈŠɑƀ
ſɑƇɩƈƇ ƈŜɑƀ
Результат:
Š Š Š Š
Ŝ
Š Š Š Š
Ŝ
Š Š Š Š
Ŝ
Š Š Š Š
Ŝ
Š Š Š Š
Ŝ
Š Š Š Š
Ŝ
Š Š Š Š
ɐŜ
ǷȘȐȓȖȎȍȕȐȧ
ǹȓȖȊȈȘȐȐȔȕȖȎȍșȚȊȈ
8.1. Создайте англо-французский словарь с названием ɩ и выведите его на экран.
Вот ваши первые слова: ŵ , ŵ и ŵ.
ʴʴʴɩƃɐɐƄ
ɐɐ
ʴʴʴɩʰƇƈ
ʴʴʴř ɩŜſƀś
ɩƃ Ƅʰ
ʴʴʴɩ
Ƈɐɐśɐɐřɐ ɐśɐɐřɐ ɐśɐ ɐƈ
ʴʴʴɩƃɐ ɐƄ
ɐɐ
ʴʴʴſɩŜſƀƀ
Ƈɐ ɐřɐɐřɐɐƈ
Это довольно трудный пример, так что если вы заглянули сюда, то ничего особо страш-
ного не случилось:
ʴʴʴʰƇ
ŜŜŜɐɐśƇ
ŜŜŜɐ ɐśƃ
ŜŜŜɐ ɐřɐ ɐřɐ ɐ
ŜŜŜƄř
ǷȘȐȓȖȎȍȕȐȍǫǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
ŜŜŜɐ ɐśƇƈř
ŜŜŜɐɐśƇƈ
ŜŜŜƈř
ŜŜŜɐɐśƇƈř
ŜŜŜɐɐśƇƈ
ŜŜŜƈ
ʴʴʴ
ʴʴʴſŜſƀƀ
ɏſƃɐɐřɐɐřɐɐƄƀ
Python 3 содержит функционал для работы с ключами словарей. Чтобы вывести их как
список, используйте следующую строку:
ʴʴʴſſŜſƀƀƀ
ƃɐɐřɐɐřɐɐƄ
ʴʴʴſƃɐɐƄŜſƀƀ
ɏſƃɐ ɐřɐ ɐřɐɐƄƀ
ʴʴʴſƃɐɐƄƃɐ ɐƄƀ
ƃɐ ɐřɐ ɐřɐ ɐƄ
ʴʴʴʰƇśƋſɨɥƀƈ
ʴʴʴ
Ƈɥśɥřɨśɨřɩśɫřɪśɰřɫśɨɭřɬśɩɬřɭśɪɭřɮśɫɰřɯśɭɫřɰśɯɨƈ
ʴʴʴʰƇſɨɥƀʩɩʰʰɨƈ
ʴʴʴ
Ƈɨřɪřɬřɮřɰƈ
ǷȘȐȓȖȎȍȕȐȧ
ʴʴʴſɐ ʩɐʩſɨɥƀƀś
ŜŜŜſƀ
ŜŜŜ
ɥ
ɨ
ɩ
ɪ
ɫ
ɬ
ɭ
ɮ
ɯ
ɰ
ʴʴʴʰſɐɐřɐɐřɐɐƀ
ʴʴʴʰſɐɐř
ŜŜŜɐɐř
ŜŜŜɐ ţɐƀ
ʴʴʴ ſſřƀƀ
Ƈɐɐśɐɐř
ɐɐśɐɐř
ɐɐśɐ ţɐƈ
8.14. Используйте функцию ſƀ, чтобы создать словарь с именем , в котором
объединены списки titles ʰ ƃɐ of ɐř ɐ ɐř ɐ a
ɐƄ и plots ʰ ƃɐ nun turns into a ɐř ɐ yarn ɐř ɐ
your ɐƄ.
ʴʴʴʰƃɐ ɐř
ŜŜŜɐ ɐř
ŜŜŜɐɐƄ
ʴʴʴʰƃɐɐř
ŜŜŜɐɐř
ŜŜŜɐ ɐƄ
ʴʴʴʰ ſſřƀƀ
ʴʴʴ
Ƈɐ ɐśɐɐř
ɐ ɐśɐɐř
ɐɐśɐ ɐƈ
ʴʴʴ
ǷȘȐȓȖȎȍȕȐȍǫǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
ǼțȕȒȞȐȐ
9.1. Определите функцию , которая возвращает следующий список: ƃɐ ',
ɐɐ, ɐ ɐƄ.
ʴʴʴſƀś
ŜŜŜƃɐ ɐřɐɐřɐ ɐƄ
ŜŜŜ
ʴʴʴſƀ
ƃɐ ɐřɐɐřɐ ɐƄ
ʴʴʴɏſƀś
ŜŜŜſɨřɨɥřɩƀś
ŜŜŜ
ŜŜŜ
ʴʴʴ ʰɨ
ʴʴʴɏſƀś
ŜŜŜ ʰʰɪś
ŜŜŜſɑɑřƀ
ŜŜŜ
ŜŜŜ ʫʰɨ
ŜŜŜ
9.3. Определите декоратор test, который выводит строку ɐɐ при вызове функ-
ции и строку ɐɐ, когда функция завершает свою работу.
ʴʴʴſ ƀś
ŜŜŜɏ ſƋřƋƋƀś
ŜŜŜſɐɐƀ
ŜŜŜʰ ſƋřƋƋƀ
ŜŜŜſɐɐƀ
ŜŜŜ
ŜŜŜɏ
ŜŜŜ
ʴʴʴ
ʴʴʴɒ
ŜŜŜſƀś
ŜŜŜſɑ řɑƀ
ŜŜŜ
ʴʴʴſƀ
start
ř
ǷȘȐȓȖȎȍȕȐȧ
ǶȑȖȑȖȑȖȉȢȍȒȚȣȐȒȓȈșșȣ
10.1. Создайте класс , не имеющий содержимого, и выведите его на экран.
Затем создайте объект этого класса и также выведите его. Совпада-
ют ли выведенные значения?
ʴʴʴ ś
ŜŜŜ
ŜŜŜ
ʴʴʴſƀ
ʳ ɐɏɏɏɏŜɐʴ
ʴʴʴʰſƀ
ʴʴʴſƀ
ʳɏɏɏɏŜ ɥɨɥɥɭɪɥʴ
10.2. Создайте новый класс с именем ɩ и присвойте переменной letters зна-
чение ɐ ɐ. Выведите на экран значение letters.
ʴʴʴ ɩś
ŜŜŜʰɐ ɐ
ŜŜŜ
ʴʴʴſɩŜƀ
10.3. Создайте еще один класс, который, конечно же, называется ɪ. В этот раз
присвойте значение ɐɐ переменной объекта letters. Выведите на экран
значение атрибута letters. Понадобилось ли вам создавать объект класса,
чтобы сделать это?
ǷȘȐȓȖȎȍȕȐȍǫǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
ʴʴʴ ɪś
ŜŜŜɏɏɏɏſƀś
ŜŜŜŜʰɐɐ
ŜŜŜ
10.4. Создайте класс , имеющий атрибуты объекта , и .
Создайте объект этого класса со значениями ɐ ɐ, ɐ ɐ и ɨ.
ʴʴʴ ś
ŜŜŜɏɏɏɏſřřřƀś
ŜŜŜŜʰ
ŜŜŜŜʰ
ŜŜŜŜʰ
ŜŜŜ
ʴʴʴʰſɐ ɐřɐ ɐřɨƀ
Начнем со словаря:
ʴʴʴɏ ʰƇɐɐśɐ ɐřɐɐśɐ ɐřɐɐśɨƈ
10.6. Для класса определите метод с именем ſƀ, который выводит на
экран значения атрибутов объекта (, и ). Создайте объект
из этого нового определения и используйте метод ſƀ, чтобы вы-
вести на экран его атрибуты.
ʴʴʴ ś
ŜŜŜɏɏɏɏſřřřƀś
ŜŜŜŜʰ
ŜŜŜŜʰ
ŜŜŜŜʰ
ŜŜŜſƀś
ŜŜŜſɐʰʩřʰʩřʰʩɐʩ
ŜŜŜſŜřŜřŜƀƀ
ŜŜŜ
ʴʴʴʰſƋƋɏ ƀ
ʴʴʴŜſƀ
ʰ řʰ řʰɨ
ʴʴʴſƀ
ʳɏɏɏɏŜ ɥɨɥɥɭɬɪɨɥʴ
ʴʴʴ ś
ŜŜŜɏɏɏɏſřřřƀś
ŜŜŜŜʰ
ŜŜŜŜʰ
ŜŜŜŜʰ
ŜŜŜɏɏɏɏſƀś
ŜŜŜſɐʰʩřʰʩřʰʩɐʩ
ŜŜŜſŜřŜřŜƀƀ
ŜŜŜ
ʴʴʴʰſƋƋɏ ƀ
ʴʴʴſƀ
ʰ řʰ řʰɨ
Метод ɏɏɏɏſƀ — это один из волшебных методов Python. Функция print вызывает
метод объекта ɏɏɏɏſƀ, чтобы получить его строковое представление. Если у объ-
екта нет метода ɏɏɏɏſƀ, то он получает метод по умолчанию от его родительского
класса , который возвращает строку наподобие ʳɏɏɏɏŜ
ɥɨɥɥɭɬɪɨɥʴ.
10.8. Модифицируйте класс , сделав атрибуты , и приват-
ными. Определите свойство получателя для каждого атрибута, возвращающее
его значение.
ʴʴʴ ś
ŜŜŜɏɏɏɏſřřřƀś
ŜŜŜŜɏɏʰ
ǷȘȐȓȖȎȍȕȐȍǫǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
ŜŜŜŜɏɏʰ
ŜŜŜŜɏɏʰ
ŜŜŜɒ
ŜŜŜſƀś
ŜŜŜŜɏɏ
ŜŜŜɒ
ŜŜŜſƀś
ŜŜŜŜɏɏ
ŜŜŜɒ
ŜŜŜſƀś
ŜŜŜŜɏɏ
ŜŜŜ
ʴʴʴʰſɐ ɐřɐ ɐřɨƀ
ʴʴʴŜ
ɐ ɐ
ʴʴʴŜ
ɐ ɐ
ʴʴʴŜ
ɨ
10.9. Определите три класса: , и . Для каждого из них опре-
делите всего один метод — ſƀ. Этот метод должен возвращать значения
ɐɐ (для ), ɐ ɐ (для ) или ɐ ɐ (для ).
Создайте по одному объекту каждого класса и выведите на экран то, что ест
указанное животное.
ʴʴ ś
ŜŜŜſƀś
ŜŜŜɐɐ
ŜŜŜ
ʴʴʴ ś
ŜŜŜſƀś
ŜŜŜɐ ɐ
ŜŜŜ
ʴʴʴ ś
ŜŜŜſƀś
ŜŜŜɐ ɐ
ŜŜŜ
ʴʴʴʰſƀ
ʴʴʴʰſƀ
ʴʴʴʰ ſƀ
ʴʴʴſŜſƀƀ
berries
ʴʴʴſŜſƀƀ
ʴʴʴſŜſƀƀ
10.10. Определите три класса: , и . Каждый из них имеет только
один метод — ſƀ. Он возвращает значения ɐɐ (для ),
ɐ ɐ (для ) или ɐɐ (для ). Далее определите класс ,
ǷȘȐȓȖȎȍȕȐȧ
ʴʴʴ ś
ŜŜŜſƀś
ŜŜŜɐɐ
ŜŜŜ
ʴʴʴ ś
ŜŜŜſƀś
ŜŜŜɐ ɐ
ŜŜŜ
ʴʴʴ ś
ŜŜŜſƀś
ŜŜŜɐɐ
ŜŜŜ
ʴʴʴ ś
ŜŜŜɏɏɏɏſƀś
ŜŜŜŜʰſƀ
ŜŜŜŜ ʰſƀ
ŜŜŜŜʰſƀ
ŜŜŜſƀś
ŜŜŜɐɐɐ ś
ŜŜŜřʩŜ
ŜŜŜ řʩŜ
ŜŜŜřʩŜɐɐɐʩſ
ŜŜŜŜŜſƀř
ŜŜŜŜ Ŝſƀř
ŜŜŜŜŜſƀƀ
ŜŜŜ
ʴʴʴʰſƀ
ʴʴʴſŜſƀƀ
ś
řŜ
ř Ŝ
řŜ
ǴȖȌțȓȐȗȈȒȍȚȣȐȗȘȖȋȘȈȔȔȣ
11.1. Создайте файл с именем Ŝ. В нем объявите функцию ſƀ, которая вы-
водит на экран строку ɐ ɰŞɬ ɐ. Далее используйте интерактивный ин-
терпретатор, чтобы импортировать модуль и вызвать его функцию ſƀ.
ʴʴʴ
ʴʴʴŜſƀ
ɰŞɬ
ʴʴʴ
ʴʴʴſƀ
ɰŞɬ
ʴʴʴ
ʴʴʴſƀ
ɰŞɬ
11.5. Создайте словарь с именем plain, содержащий пары «ключ — значение» ɐɐś
ɨř ɐɐś ɩ и ɐ ɐśɪ, а затем выведите его на экран.
ʴʴʴʰƇɐɐśɨřɐɐśɩřɐ ɐśɪƈ
ʴʴʴ
Ƈɐɐśɨřɐ ɐśɪřɐɐśɩƈ
ǶȉȘȈȉȈȚȣȊȈȍȔȌȈȕȕȣȍ
12.1. Создайте строку Unicode с именем и присвойте ей значение ɐɎɥɥɥɨɫɰɐ.
Выведите на экран значение и ее имя Unicode.
ʴʴʴ
ʴʴʴʰɐɎɥɥɥɨɰɯɫɐ
ʴʴʴ
ɐชɐ
ʴʴʴ Ŝſƀ
ɐ ɐ
ʴʴʴɏʰŜ ſɐŞɯɐƀ
ʴʴʴɏ
ɐɎɥɎɰɎɰɩɎɰɐ
ʴʴʴɏʰɏŜ ſɐŞɯɐƀ
ʴʴʴɏ
ɐชɐ
ʴʴʴɏʰʰ
12.4. При работе с текстом вам могут пригодиться регулярные выражения. Мы вос-
пользуемся ими несколькими способами в следующем примере текста. Перед
вами стихотворение Ode on the Mammoth Cheese, написанное Джеймсом
Макинтайром в 1866 году во славу головки сыра весом 7000 фунтов, которая
была изготовлена в Онтарио и отправлена в международное путешествие. Если
не хотите самостоятельно перепечатывать это стихотворение, используйте
свой любимый поисковик и скопируйте текст в программу. Или скопируйте
стихотворение из проекта «Гутенберг» (KWWSELWO\PFLQW\UHSRHWU\). Назовите
следующую строку .
ʴʴʴʰɐɐɐ
ŜŜŜř ř
ŜŜŜř
ŜŜŜ ř
ŜŜŜŜ
ŜŜŜ
ǷȘȐȓȖȎȍȕȐȍǫǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
ŜŜŜɐ
ŜŜŜ ř
ŜŜŜ
ŜŜŜ Ŝ
ŜŜŜ
ŜŜŜř
ŜŜŜř
ŜŜŜ ř
ŜŜŜř Ŝ
ŜŜŜ
ŜŜŜ
ŜŜŜŜ
ŜŜŜ
ŜŜŜɐŜ
ŜŜŜ
ŜŜŜř
ŜŜŜ
ŜŜŜ ř
ŜŜŜ řŠ Ŝ
ŜŜŜ
ŜŜŜɐř
ŜŜŜɐ ř
ŜŜŜ
ŜŜŜ Ŝ
ŜŜŜɐɐɐ
Мы определим переменную pat для шаблона и затем будем искать такой шаблон в стро-
ке :
ʴʴʴ
ʴʴʴʰɐɎ ɎƋɐ
ʴʴʴŜſřƀ
ƃɐ ɐřɐ ɐřɐ ɐřɐ ɐřɐ ɐřɐ ɐřɐ ɐřɐ ɐƄ
Элемент Ɏ означает, что нужно начать с границы между словом и не словом. Используйте
такую конструкцию, чтобы указать либо на начало, либо на конец слова. Литерал —
это первая буква всех слов, которые мы ищем. Элемент Ɏ означает любой символ слова,
которое включает в себя буквы, цифры и подчеркивания (ɏ). Элемент * означает ноль
или больше таких символов. Целиком это выражение находит слова, которые начина-
ются с ȥ, включая ɐ ɐ. Если вы не использовали простую строку (у таких строк r стоит
прямо перед открывающей кавычкой), Python интерпретирует Ɏ как возврат на шаг,
и поиск по таинственной причине ничего не найдет:
ʴʴʴʰɐɎ ɎƋɐ
ʴʴʴŜſřƀ
ƃƄ
ǷȘȐȓȖȎȍȕȐȧ
ʴʴʴʰɐɎ ɎƇɪƈɎɐ
ʴʴʴŜſřƀ
ƃɐ ɐřɐ ɐƄ
Вам нужен последний символ Ɏ, чтобы указать на конец слова. В противном случае вы
получите первые четыре буквы всех слов, которые начинаются с ȥ и имеют как минимум
четыре буквы:
ʴʴʴʰɐɎ ɎƇɪƈɐ
ʴʴʴŜſřƀ
ƃɐ ɐřɐ ɐřɐ ɐřɐ ɐřɐ ɐřɐ ɐřɐ ɐřɐ ɐƄ
Это упражнение с подвохом. Мы получаем правильный результат для слов, которые за-
канчиваются на r:
ʴʴʴʰɐɎɎƋɎɐ
ʴʴʴŜſřƀ
ƃɐɐřɐɐřɐɐřɐ ɐřɐɐřɐɐřɐ ɐřɐɐřɐɐƄ
Однако результаты будут не так хороши, если мы поищем слова, которые заканчивают-
ся на l:
ʴʴʴʰɐɎɎƋɎɐ
ʴʴʴŜſřƀ
ƃɐɐřɐɐřɐ ɐřɐɐƄ
Что здесь делает буквосочетание ll? Паттерн Ɏ совпадает только c буквами, цифра-
ми и подчеркиваниями, но не с апострофами ASCII. В результате вы увидите букво-
сочетание ll. Мы можем обработать этот крайний случай, добавив апостроф в список
символов, с которыми должен совпасть набор символов. Наша первая попытка не ра-
ботает:
ʴʴʴʰɐɎƃɎɐƄƋɎɐ
ɑʳʴɑřɨ
ʰɐɎƃɎɐƄƋɎɐ
Это упражнение с подвохом. Мы получаем правильный результат для слов, которые за-
канчиваются на r:
ʴʴʴʰɐɎɎƋɎɐ
ʴʴʴŜſřƀ
ƃɐɐřɐɐřɐɐřɐ ɐřɐɐřɐɐřɐ ɐřɐɐřɐɐƄ
Однако результаты будут не так хороши, если мы поищем слова, которые заканчивают-
ся на l:
ʴʴʴʰɐɎɎƋɎɐ
ʴʴʴŜſřƀ
ƃɐɐřɐɐřɐ ɐřɐɐƄ
Что здесь делает буквосочетание ll? Паттерн Ɏ совпадает только c буквами, цифрами
и подчеркиваниями, но не с апострофами ASCII. В результате вы увидите буквосочета-
ние ll. Мы можем обработать этот крайний случай, добавив апостроф в список симво-
лов, с которыми должен совпасть набор символов. Наша первая попытка не работает:
ʴʴʴʰɐɎƃɎɐƄƋɎɐ
ɑʳʴɑřɨ
ʰɐɎƃɎɐƄƋɎɐ
Начиная с границы слова, любое количество символов слова, три гласные и далее любые
символы, не являющиеся гласными, до конца слова:
ʴʴʴʰɐɎƃɋƄƋƃƄƇɪƈƃɋƄƋɎɐ
ʴʴʴŜſřƀ
ƃɐɐřɐɐřɐɎ ɐřɐɐřɐɐřɐɐƄ
На сей раз мы не нашли слово beau, поэтому нужно внести в шаблон еще одно исправле-
ние: совпадение с любым числом (даже нулем) не гласных после трех гласных. Наш пре-
дыдущий шаблон всегда совпадал с одним не гласным символом:
ʴʴʴʰɐɎɎƋƃƄƇɪƈƃɋɎƄƋɎƋɎɐ
ʴʴʴŜſřƀ
ƃɐɐřɐɐřɐɐřɐɐřɐɐřɐɐƄ
Что это показывает? Среди всего прочего то, что регулярные выражения могут приго-
диться для многого, но их может быть очень трудно написать правильно.
12.9. Используйте метод для того, чтобы преобразовать эту шестнадца-
теричную строку, созданную путем объединения двух строк для размещения
на странице, в переменную типа bytes с именем gif.
ɐɫɮɫɰɫɭɪɯɪɰɭɨɥɨɥɥɥɨɥɥɯɥɥɥɥɥɥɥɥɥɥɥɩɨɰɐʫ
ɐɥɫɥɨɥɥɥɥɥɥɥɥɩ ɥɥɥɥɥɥɥɥɥɨɥɥɥɨɥɥɥɥɥɩɥɨɫɫɥɥɪɐ
ʴʴʴ
ʴʴʴɏʰɐɫɮɫɰɫɭɪɯɪɰɭɨɥɨɥɥɥɨɥɥɯɥɥɥɥɥɥɥɥɥɥɥɩɨɰɐʫɎ
ŜŜŜɐɥɫɥɨɥɥɥɥɥɥɥɥɩ ɥɥɥɥɥɥɥɥɥɨɥɥɥɨɥɥɥɥɥɩɥɨɫɫɥɥɪɐ
ʴʴʴʰ Ŝſɏƀ
ʴʴʴſƀ
ɫɩ
ʴʴʴƃśɭƄʰʰɐ ɯɰɐ
ʴʴʴ
ʴʴʴřʰ Ŝ ſɐʳ ɐřƃɭśɨɥƄƀ
ʴʴʴř
ſɨřɨƀ
DzȈȓȍȕȌȈȘȐȐȟȈșȣ
13.1. Запишите текущие дату и время как строку в текстовый файл Ŝ.
ʴʴʴ
ʴʴʴʰŜſƀ
ʴʴʴɏʰŜſƀ
ʴʴʴſɐŜɐřɐɐƀś
ŜŜŜſɏřʰƀ
ʴʴʴ
ʴʴʴſɐŜɐřɐɐƀś
ŜŜŜɏʰŜſƀ
ŜŜŜ
ʴʴʴɏ
ɐɩɥɨɰŞɥɮŞɩɪɎɐ
ʴʴʴʰɐʩŞʩŞʩɎɐ
ʴʴʴŜſɏřƀ
Ŝſɩɥɨɰřɮřɩɪřɥřɥƀ
Если вы записали тот символ новой строки в файл, то вам нужно, чтобы он совпал со
строкой формата.
ʴʴʴɏŜſƀ
ɬ
ʴʴʴɏŜſƀ
6
Для ſƀ значение для понедельника равно ɥ, а для воскресенья — 6. Для функции
ſƀ значение для понедельника равно ɨ, а для воскресенья — 7. Поэтому ис-
комый день — суббота.
13.6. Когда вам будет (или уже было) 10 000 дней от роду?
ʴʴʴ
ʴʴʴɏʰɏʫſʰɨɥɥɥɥƀ
ʴʴʴɏ
Ŝſɩɥɥɰřɨɩřɪɥƀ
Если это был ваш день рождения, то вы, возможно, пропустили еще один повод повесе-
литься.
ǼȈȑȓȣȐȒȈȚȈȓȖȋȐ
14.1. Выведите на экран список файлов текущего каталога.
Если ваш текущий каталог называется RKP\ и содержит три файла с именами по назва-
ниям животных, то код может выглядеть так:
ʴʴʴ
ʴʴʴŜſɐŜɐƀ
ƃɐɐřɐɐřɐɐƄ
Если родительский каталог содержит два файла и текущий каталог RKP\, то код может
выглядеть так:
ʴʴʴ
ʴʴʴŜſɐŜŜɐƀ
ƃɐɐřɐɐřɐɐƄ
14.3. Присвойте строку is a test of the переменной ɨ
и запишите эту переменную в файл с именем Ŝ.
ʴʴʴɨʰɐ ɐ
ʴʴʴſɨƀ
ɫɪ
ǷȘȐȓȖȎȍȕȐȍǫǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
Вот как это можно сделать с помощью функций open, write и :
ʴʴʴʰſɐŜɐřɐɐƀ
ʴʴʴŜſɨƀ
ɫɪ
ʴʴʴŜ ſƀ
Или можете использовать with и избежать вызова (Python сделает это за вас):
ʴʴʴſɐŜɐřɐɐƀś
ŜŜŜŜſɨƀ
ŜŜŜ
ɫɪ
14.4. Откройте файл Ŝ и считайте его содержимое в строку ɩ. Будут ли
одинаковыми строки ɨ и ɩ?
ʴʴʴſɐŜɐřɐɐƀś
ŜŜŜɩʰŜſƀ
ŜŜŜ
ʴʴʴſɩƀ
ɫɪ
ʴʴʴɨʰʰɩ
ǬȈȕȕȣȍȊȖȊȘȍȔȍȕȐȗȘȖȞȍșșȣ
ȐȒȖȕȒțȘȍȕȚȕȖșȚȤ
15.1. Используйте модуль , чтобы создать три отдельных процес-
са. Заставьте каждый из них подождать случайное количество секунд между
нулем и единицей, вывести текущее время, а затем завершить работу.
ſ ƀś
ſ ƀ
ſɐɐř řɐ řɐřŜ ſƀƀ
ɏɏɏɏʰʰɐɏɏɏɏɐś
ſɪƀś
ʰŜſƀ
ʰ Ŝ ſʰřʰſ řƀƀ
Ŝſƀ
ɛpython multi_times.py
ɥŜɨɥɮɩɥɪɭɨɨɨɪɥɬɰɩɩɰ řɩɥɨɰŞɥɮŞɩɫɥɥśɨɰśɩɪŜɰɬɨɬɰɫ
ɥŜɬɯɩɬɨɫɫɥɥɩɪɮɥɥɭɬ řɩɥɨɰŞɥɮŞɩɫɥɥśɨɰśɩɫŜɫɩɬɥɫɮ
ɥŜɭɭɫɮɭɰɥɬɭɰɥɩɰɫɮɮ řɩɥɨɰŞɥɮŞɩɫɥɥśɨɰśɩɫŜɬɥɰɰɰɬ
ǷȘȐȓȖȎȍȕȐȧ
ǬȈȕȕȣȍȊȒȖȘȖȉȒȍțșȚȖȑȟȐȊȣȍȝȘȈȕȐȓȐȡȈ
16.1. Сохраните следующие несколько строк в файл Ŝ . Обратите внимание
на то, что, если поля разделены запятыми, вам нужно заключить в кавычки
поле, содержащее запятую:
ř
ř
řɑřĺɑ
ʴʴʴʰɐɐɐř
ŜŜŜ ř
ŜŜŜřɑřĺɑ
ŜŜŜɐɐɐ
ʴʴʴſɐŜ ɐřɐɐƀś
ŜŜŜŜſƀ
ŜŜŜ
ɮɪ
16.2. Используйте модуль и его метод , чтобы считать содержимое фай-
ла Ŝ в переменную . Выведите на экран значения переменной .
Обработал ли метод кавычки и запятые в заголовке второй книги?
ʴʴʴſɐŜ ɐřɐɐƀś
ŜŜŜʰ Ŝ ſƀ
ŜŜŜś
ŜŜŜſƀ
ŜŜŜ
Ƈɐɐśɐ ɐřɐɐśɐ ɐƈ
Ƈɐɐśɐřĺɐřɐɐśɐɐƈ
ʴʴʴʰɐɐɐřř
ŜŜŜř řɨɰɭɥ
ŜŜŜř²řɩɥɥɥ
ŜŜŜŠř řɩɥɥɬ
ŜŜŜ řřɩɥɥɮ
ŜŜŜ ř řɨɰɰɩ
ŜŜŜɐɐɐ
ʴʴʴſɐɩŜ ɐřɐɐƀś
ŜŜŜŜſƀ
ŜŜŜ
ɩɥɨ
ǷȘȐȓȖȎȍȕȐȍǫǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
16.4. Используйте модуль ɪ, чтобы создать базу данных SQLite Ŝ
и таблицу , содержащую следующие поля: title (текст), author (текст)
и year (целое значение).
ʴʴʴɪ
ʴʴʴʰɪŜ ſɐŜɐƀ
ʴʴʴ ʰŜ ſƀ
ʴʴʴ Ŝ ſɐɐɐ ſřřƀɐɐɐƀ
ʳɪŜ ɥɨɥɥɭɪɰɥʴ
ʴʴʴŜ ſƀ
ʴʴʴ
ʴʴʴɪ
ʴʴʴɏʰɐſţřţřţƀɐ
ʴʴʴſɐŜ ɐřɐɐƀś
ŜŜŜʰ Ŝ ſƀ
ŜŜŜś
ŜŜŜ Ŝ ſɏřſƃɐɐƄřƃɐɐƄřƃɐɐƄƀƀ
ŜŜŜ
ʳɪŜ ɥɨɥɥɮɩɨɥʴ
ʳɪŜ ɥɨɥɥɮɩɨɥʴ
ʳɪŜ ɥɨɥɥɮɩɨɥʴ
ʳɪŜ ɥɨɥɥɮɩɨɥʴ
ʳɪŜ ɥɨɥɥɮɩɨɥʴ
ʴʴʴŜ ſƀ
16.6. Считайте и выведите на экран столбец title таблицы в алфавитном по-
рядке.
ʴʴʴʰɐ ɐ
ʴʴʴŜ ſƀś
ŜŜŜſƀ
ŜŜŜ
ſɐɐřƀ
ſɐ ɐřƀ
ſɐ ɐřƀ
ſɐɐřƀ
ſɐŠɐřƀ
Если вы хотите вывести на экран значение title, не пользуясь конструкциями для ра-
боты с кортежем (круглыми скобками и запятой), то попробуйте следующее:
ʴʴʴŜ ſƀś
ŜŜŜſƃɥƄƀ
ŜŜŜ
ǷȘȐȓȖȎȍȕȐȧ
Š
Если хотите проигнорировать начальное слово ɐɐ в заголовках, то вам нужно напи-
сать еще одну строку SQL:
ʴʴʴʰɐɐɐ
ŜŜŜ ſɑʩɑƀ
ŜŜŜſřɬƀ
ŜŜŜɐɐɐ
ʴʴʴŜ ſƀś
ŜŜŜſƃɥƄƀ
ŜŜŜ
Š
16.7. Считайте и выведите на экран все столбцы таблицы в порядке публикации.
Чтобы вывести на экран все столбцы каждой строки, просто разделите их запятой
и пробелом:
ʴʴʴŜ ſɐ Ƌɐƀś
ŜŜŜſƋřʰɐřɐƀ
ŜŜŜ
ř řɨɰɭɥ
ř řɨɰɰɩ
ř²řɩɥɥɥ
Šř řɩɥɥɬ
řřɩɥɥɮ
16.8. Используйте модуль , чтобы подключиться к базе данных ɪ
Ŝ, которую вы создали в упражнении 16.4. Как и в упражнении 16.6,
считайте и выведите на экран столбец title таблицы в алфавитном по-
рядке.
ʴʴʴ
ʴʴʴ ʰ Ŝ ɏſɐśŵŵŵŜɐƀ
ʴʴʴʰɐ ɐ
ǷȘȐȓȖȎȍȕȐȍǫǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
16.9. Установите сервер Redis и библиотеку Python (с помощью команды pip
install ) на свой компьютер. Создайте хеш redis с именем test, содержа-
щий поля ſɨƀ и ſɐ ɐƀ. Выведите все поля хеша test.
ʴʴʴ
ʴʴʴ ʰŜſƀ
ʴʴʴ Ŝſɐɐƀ
ɨ
ʴʴʴ ŜſɐɐřƇɐ ɐśɨřɐɐśɐ ɐƈƀ
ʴʴʴ Ŝſɐɐƀ
Ƈɐɐśɐ ɐřɐ ɐśɐɨɐƈ
ǬȈȕȕȣȍȊȗȘȖșȚȘȈȕșȚȊȍșȍȚȐ
17.1. Используйте объект класса , чтобы реализовать сервис, сообщающий
текущее время. Когда клиент отправляет на сервер строку ɐɐ, верните
текущие дату и время как строку ISO.
ʰſɐ ɐřɭɮɯɰƀ
ɏʰɫɥɰɭ
ſɐɐřŜſƀƀ
ſɐ Ŝɐƀ
ǷȘȐȓȖȎȍȕȐȧ
ʰſɐ ɐřɭɮɯɰƀ
ɏʰɫɥɰɭ
ſɐ ɐřŜſƀƀ
ʰ Ŝ ſ Ŝ ɏ ř Ŝɏ ƀ
ś
ſɬƀ
Ŝſɐɐřƀ
řɏʰ Ŝ ſɏƀ
ſɐɐřƀ
Ŝ ſƀ
Я поместил вызов ſɬƀ в верхней части цикла клиента, чтобы сделать обмен данны-
ми менее быстрым. Запустите сервер в одном окне:
ɛpython udp_time_server.py
ɩɥɨɫŞɥɭŞɥɩɩɥśɩɯśɫɮŜɫɨɬɨɮɭ
Ŝ
Через 5 секунд вы начнете видеть сообщения в обоих окнах. Так выглядят первые
три строки от сервера:
ɐɩɥɨɫŞɥɭŞɥɪɥɨśɩɯśɬɭŜɫɭɩɬɭɬɐ
ɐɩɥɨɫŞɥɭŞɥɪɥɨśɩɰśɥɨŜɫɭɪɰɥɭɐ
ɐɩɥɨɫŞɥɭŞɥɪɥɨśɩɰśɥɭŜɫɭɬɯɥɩɐ
ʰɐɨɩɮŜɥŜɥŜɨɐ
ʰɭɮɯɰ
ʰŜſƀ
ʰ Ŝ ſŜƀ
Ŝſɑ śŵŵʩśʩɑʩſřƀƀ
ſɐɐřŜ ſƀƀ
ś
ɤȢȚȜȘȔșȠȥȟșȘȧȲȭșȗȢțȔȣȤȢȥȔȢȦȞȟȜșȡȦȔ
ʰŜ ſƀ
ʰʰɐɐś
ʰŜ ſƀ
ʰſƀ
ŜſſřɐŞɯɐƀƀ
ſɐɐřƀ
ʰɐɨɩɮŜɥŜɥŜɨɐ
ʰɭɮɯɰ
ʰŜſƀ
ʰ Ŝ ſŜƀ
Ŝ ſɑ śŵŵʩśʩɑʩſřƀƀ
ſɐɐřŜ ſƀƀ
ś
ſɬƀ
ʰɐɐ
Ŝſƀ
ʰ Ŝ ſƀ
ſɑ ʩɑʩƀ
Для простых сокетов вам нужно сначала запустить сервер. С помощью ZeroMQ вы мо-
жете запустить первым как клиент, так и сервер:
ɛpython zmq_time_server.py
ɩɥɨɫŞɥɭŞɥɪɥɨśɪɰśɪɭŜɰɪɪɬɪɩ
ɛpython zmq_time_client.py
ɩɥɨɫŞɥɭŞɥɪɥɨśɪɰśɫɩŜɬɪɯɩɫɬ
С сервера:
Ŝ
ſƀś
ʰſŜ ſƀƀ
ſɐɐřƀ
ʰſſɑ ɑřɭɮɯɰƀƀ
Ŝɏ ſřɑɑƀ
Ŝɏſƀ
С клиента:
Ŝ
Запустим сервер:
ɛpython xmlrpc_time_server.py
Запустим клиент:
ɛpython xmlrpc_time_client.py
17.4. Возможно, вы видели эпизод телесериала I Love Lucy, в котором Люси и Этель
работают на шоколадной фабрике. Парочка стала отставать, когда линия конвейе-
ра, направлявшая к ним на обработку конфеты, еще более ускорилась. Напишите
симуляцию, которая отправляет разные типы конфет в список Redis, и клиент
Lucy, делающий блокирующие выталкивания из списка. Ей нужно 0,5 секунды,
чтобы обработать одну конфету. Выведите на экран время и тип каждой конфеты,
которую получит Lucy, а также количество необработанных конфет:
ǷȘȐȓȖȎȍȕȐȍǫǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
ʰŜſƀ
ʰƃɐɐřɐ ɐřɐ ɐřɐɐƄ
ʰɐ ɐ
ś
ʰŜſƀ
ſ ƀ
ʰŜ ſƀ
Ŝſ ř ƀ
ʰŜſƀ
ʰɨɥ
ʰɐ ɐ
ś
ſɥŜɬƀ
ʰ Ŝſ řƀ
ʰ Ŝſ ƀ
ś
ʰƃɨƄ
ſɐ ɐř řɐɐřŜ ſƀř
ɐřɐřřɐɐƀ
Запустите их в любом порядке. Поскольку Люси требуется 0,5 секунды для обработки
каждой конфеты и они появляются в среднем каждые 0,5 секунды, это становится по-
хоже на гонку. Чем раньше вы запустите конвейер, тем более сложной сделаете жизнь
Люси:
ɛpython redis_choc_supply.py &
ɛpython redis_lucy.py
ɐɐɩɥɨɫŞɥɭŞɥɪɥɪśɨɬśɥɯŜɮɩɨɨɭɰřɫ
ɐ ɐɩɥɨɫŞɥɭŞɥɪɥɪśɨɬśɥɰŜɩɩɩɯɨɭřɪ
ɐɐɩɥɨɫŞɥɭŞɥɪɥɪśɨɬśɥɰŜɮɩɪɭɰɨřɬ
ɐɐɩɥɨɫŞɥɭŞɥɪɥɪśɨɬśɨɥŜɩɩɬɥɥɯřɫ
ɐ ɐɩɥɨɫŞɥɭŞɥɪɥɪśɨɬśɨɥŜɮɩɮɨɥɮřɫ
ɐ ɐɩɥɨɫŞɥɭŞɥɪɥɪśɨɬśɨɨŜɩɩɯɩɩɭřɬ
ɐ ɐɩɥɨɫŞɥɭŞɥɪɥɪśɨɬśɨɨŜɮɩɰɮɪɬřɫ
ɐɐɩɥɨɫŞɥɭŞɥɪɥɪśɨɬśɨɩŜɩɪɥɯɰɫřɭ
ɐ ɐɩɥɨɫŞɥɭŞɥɪɥɪśɨɬśɨɩŜɮɪɩɮɮɮřɮ
ɐ ɐɩɥɨɫŞɥɭŞɥɪɥɪśɨɬśɨɪŜɩɪɫɮɯɬřɭ
ɐ ɐɩɥɨɫŞɥɭŞɥɪɥɪśɨɬśɨɪŜɮɪɭɨɥɪřɮ
ɐ ɐɩɥɨɫŞɥɭŞɥɪɥɪśɨɬśɨɫŜɩɪɯɨɬɩřɰ
ɐ ɐɩɥɨɫŞɥɭŞɥɪɥɪśɨɬśɨɫŜɮɪɰɬɭɨřɯ
Бедная Люси.
ǷȘȐȓȖȎȍȕȐȧ
ʰɐɨɩɮŜɥŜɥŜɨɐ
ʰɭɮɯɰ
ʰŜſƀ
ʰ Ŝ ſŜƀ
Ŝſɐ śŵŵʩśʩɐʩſřƀƀ
ſɐŜɐřɐɐƀś
ʰŜſƀ
Ŝſƀś
ʰŜſŜ ƀ
ʰŜ ſɐŞɯɐƀ
Ŝſſɐɐřɐɐřɐɐřɐɐřɐɐřɐɐřɐɐřɐɐřɐɐřɐɐƀƀś
ŜɏſƃɐɐřƄƀ
ſƀʰʰɬś
ŜɏſƃɐɐřƄƀ
Клиент ɏŜ подписывается на темы vowels и five и выводит на экран тему и слово:
ʰɐɨɩɮŜɥŜɥŜɨɐ
ʰɭɮɯɰ
ʰŜſƀ
ʰ Ŝ ſŜƀ
Ŝ ſɐ śŵŵʩśʩɐʩſřƀƀ
Ŝ ſŜ řɐɐƀ
Ŝ ſŜ řɐɐƀ
ś
řʰŜ ɏſƀ
ſ řƀ
Если вы запустите эти программы, то они не будут работать, хотя код выглядит хорошо.
Вам нужно прочитать руководство ZeroMQ (KWWS]JXLGH]HURPTRUJSDJHDOO), чтобы
узнать о проблеме медленного присоединившегося: даже если вы запустите клиент рань-
ше сервера, тот начнет отправлять данные сразу после запуска, а клиенту потребуется
некоторое время, чтобы подключиться к серверу. Если вы публикуете сообщения посто-
янным потоком и не задумываетесь о том, когда к вам подключаются подписчики, то это
не проблема. Но в таком случае поток данных настолько короткий, что заканчивается
еще до того, как подписчик успеет моргнуть.
ǷȘȐȓȖȎȍȕȐȍǫǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
ʰɐɨɩɮŜɥŜɥŜɨɐ
ʰɭɮɯɰ
ʰŜſƀ
ʰ Ŝ ſŜƀ
Ŝſɐ śŵŵʩśʩɐʩſřƀƀ
ſɨƀ
ſɐŜɐřɐɐƀś
ʰŜſƀ
Ŝſƀś
ʰŜſŜ ƀ
ʰŜ ſɐŞɯɐƀ
Ŝſſɐɐřɐɐřɐɐřɐɐřɐɐřɐɐřɐɐřɐɐřɐɐřɐɐƀƀś
ſɐɐřƀ
ŜɏſƃɐɐřƄƀ
ſƀʰʰɬś
ſɐɐřƀ
ŜɏſƃɐɐřƄƀ
ɛpython poem_pub_sleep.py
Теперь у подписчика есть время на то, чтобы получить сообщения по выбранным темам.
Так выглядят первые строки выходной информации:
ɐɐɐɐ
ɐɐɐɐ
ɐɐɐɐ
ɐɐɐɐ
ɐɐɐɐ
ɐɐɐɐ
ɐɐɐɐ
ɐɐɐɐ
ɐɐɐɐ
ɐɐɐɐ
ɐɐɐɐ
ɐɐɐɐ
ǸȈșȗțȚȣȊȈȍȔǪșȍȔȐȘȕțȦȗȈțȚȐȕț
18.1. Если вы еще не установили Flask, то сделайте это сейчас. Это также позволит
установить , ɩ и, возможно, другие пакеты.
18.2. Создайте скелет сайта с помощью веб-сервера Flask. Убедитесь, что сервер
начинает свою работу по адресу на стандартном порте 5000. Если
ваш компьютер уже использует этот порт для чего-то еще, то воспользуйтесь
другим портом.
ʰ ſɏɏɏɏƀ
Ŝſʰɬɥɥɥřʰƀ
Поехали:
ɛpython [Link]
ƋśŵŵɨɩɮŜɥŜɥŜɨśɬɥɥɥŵ
Ƌ
18.3. Добавьте функцию ſƀ для обработки запросов к главной странице. Пусть
она возвращает строку ɐ Š.
ʰ ſɏɏɏɏƀ
ɒŜſɐŵɐƀ
ſƀś
ɑ ɐŠɑ
Ŝſʰƀ
Запустим сервер:
ɛpython [Link]
ƋśŵŵɨɩɮŜɥŜɥŜɨśɬɥɥɥŵ
Ƌ
Наконец, получим доступ к главной странице через браузер, HTTP-программы команд-
ной строки, такие как , или wget, или даже telnet:
ɛcurl [Link]
ɐŠ
18.4. Создайте шаблон для ɩ, который называется Ŝ и содержит сле-
дующий контент:
ʳʴ
ʳʴ
ǷȘȐȓȖȎȍȕȐȍǫǶȚȊȍȚȣȒțȗȘȈȎȕȍȕȐȧȔ
ʳʴ ɐŠʳŵʴ
ʳʴ
ɐ ƇƇƈƈř ƇƇƈƈ
ƇƇ ƈƈŜ
ʳŵʴ
ʳŵʴ
Создайте каталог и файл Ŝ, содержащий показанное. Если ваш сервер
Flask все еще работает после запуска предыдущих примеров, то обнаружит новый кон-
тент и перезапустится.
ʰ ſɏɏɏɏƀ
ɒŜſɐŵɐƀ
ſƀś
ʰŜŜſɐɐƀ
ʰŜŜſɐɐƀ
ʰŜŜſɐ ɐƀ
ɏſɐŜɐř
ʰřʰř ʰ ƀ
Ŝſʰƀ
ǩȣȚȤȗȐȚȖȕȡȐȒȖȔ
Питонщикам сегодня ничего не задавали.
ǷȐǨȘȚ
20.1. Установите . Нарисуйте диаграмму рассеивания для следующих
пар ſř ƀ: ( ſɥř ɥƀ, ſɪřɬƀ, ſɭř ɩƀ, ſɰř ɯƀ, ſɨɫř ɨɥƀ ƀ.
20.2. Нарисуйте линейчатый график на основе тех же данных.
20.3. Нарисуйте график на основе тех же данных.
ǷȘȐȓȖȎȍȕȐȧ
ʰſɥřɪřɭřɰřɨɫƀ
ʰſɥřɬřɩřɯřɨɥƀ
řʰŜſʰɨř ʰɪƀ
ƃɥƄŜ ſřƀ
ƃɨƄŜſřƀ
ƃɩƄŜſřřɐŞɐƀ
Ŝſƀ
ǯȈȘȈȉȖȚȖȑ
21.1. Установите Geopandas и запустите пример 21.1. Попробуйте поизменять цвета
и размеры меток.
3\WKRQȊȕȈțȒȍ
22.1. Установите Pandas. Получите CSV-файл в примере 16.1. Запустите программу
из примера 16.2. Поэкспериментируйте с командами Pandas.
ƗƘƐƓƖƎƍƕƐƍƌ
ǪșȗȖȔȖȋȈȚȍȓȤȕȣȍȚȈȉȓȐȞȣ
ǷȘȐȖȘȐȚȍȚȖȗȍȘȈȚȖȘȖȊ
Таблица Д.1 — ремикс официальной документации о приоритетах для Python 3,
операторы с самым высоким приоритетом находятся наверху.
ǺȈȉȓȐȞȈǬǷȘȐȖȘȐȚȍȚȖȗȍȘȈȚȖȘȖȊ
ǶȗȍȘȈȚȖȘ ǶȗȐșȈȕȐȍȐȗȘȐȔȍȘȣ
[v, …], {v1, …}, {k1:v1, …}, (…) Создание или включение списка/множества/словаря/
генератора, выражение в скобках
seq[n], seq[n:m], func(args…), [Link] Индекс, разбиение, вызов функции, ссылка на атрибут
** Экспонента
+n, –n, ~x Знаки плюс и минус, битовое НЕ
*, /, //, % Умножение, деление с плавающей точкой,
целочисленное деление, напоминание
+, - Сложение, вычитание
<<, >> Битовый сдвиг вправо или влево
& Битовое И
| Битовое ИЛИ
in, not in, is, is not, <, <=, >, >=, !=, == Проверка на членство и равенство
not x Булево (логическое) НЕ
and Булево И
or Булево ИЛИ
if… else Условное выражение
lambda… Лямбда-выражение
ǷȘȐȓȖȎȍȕȐȧ
ǹȚȘȖȒȖȊȣȍȔȍȚȖȌȣ
Python предлагает строковые методы (можно применять с любым объектом str)
и модуль string, содержащий полезные определения. Задействуем проверочные
переменные:
ʴʴʴʰɑ řŠɑ
ʴʴʴʰɑ ɐŠɑ
ǰȏȔȍȕȍȕȐȍȘȍȋȐșȚȘȈ
ʴʴʴŜ ſƀ
ɐřŠɐ
ʴʴʴŜſƀ
ɐřŠɐ
ʴʴʴŜ ſƀ
ɐř Šɐ
ʴʴʴŜſƀ
ɐřŠɐ
ʴʴʴŜſƀ
ɐ ř Šɐ
ǷȖȐșȒ
ʴʴʴŜ ſɐɐƀ
ɩ
ʴʴʴŜſɐɐƀ
9
ʴʴʴŜſɐɐƀ
9
ʴʴʴŜſɐɐƀ
ɨɭ
ʴʴʴŜſɐɐƀ
ɨɭ
ʴʴʴŜſɐ ɐƀ
ǰȏȔȍȕȍȕȐȍ
ʴʴʴɐɐŜſƀ
ɐ řŠɐ
ʴʴʴɐɐŜſƀ
ɐ řŠɐ
ʴʴʴɐɐŜſſřƀƀ
ɑ řŠ ɐŠɑ
ʴʴʴŜſɐ ɐƀ
ɐřŠɐ
ǷȘȐȓȖȎȍȕȐȍǬǪșȗȖȔȖȋȈȚȍȓȤȕȣȍȚȈȉȓȐȞȣ
ǼȖȘȔȈȚȐȘȖȊȈȕȐȍ
ʴʴʴŜ ſɪɥƀ
ɐ řŠɐ
ʴʴʴŜſƀ
ɐ řŠɐ
ʴʴʴŜſɪɥƀ
ɐ řŠɐ
ʴʴʴŜſɪɥƀ
ɐ řŠɐ
ǺȐȗșȚȘȖȒȐ
ʴʴʴŜſƀ
ʴʴʴŜſƀ
ʴʴʴŜſƀ
ʴʴʴŜſƀ
ʴʴʴŜſƀ
ʴʴʴŜ ſƀ
ʴʴʴŜ ſƀ
ǨȚȘȐȉțȚȣȔȖȌțȓȧVWULQJ
Существуют атрибуты класса, которые используются как определение констант
(табл. Д.2).
ǷȘȐȓȖȎȍȕȐȧ
ǺȈȉȓȐȞȈǬǨȚȘȐȉțȚȣȌȓȧȖȗȘȍȌȍȓȍȕȐȧȒȖȕșȚȈȕȚ
ǨȚȘȐȉțȚ ǷȘȐȔȍȘ
ascii_letters 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
ascii_lowercase 'abcdefghijklmnopqrstuvwxyz'
ascii_uppercase 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
digits '0123456789'
hexdigits '0123456789abcdefABCDEF'
octdigits '01234567'
punctuation '!”#$%&\'()*+,–./:;<=>?@[\\]^_\{|}~'`
printable цифры + ascii_символы + пунктуация + пробел
whitespace ' \t\n\r\x0b\x0c'
ȻɢɥɥɅɸɛɚɧɨɜɢɱ
ɉɪɨɫɬɨɣ3\WKRQɋɨɜɪɟɦɟɧɧɵɣɫɬɢɥɶɩɪɨɝɪɚɦɦɢɪɨɜɚɧɢɹ
ɟɢɡɞɚɧɢɟ
ɉɟɪɟɜɟɥɫɚɧɝɥɢɣɫɤɨɝɨȿɁɚɡɧɨɛɚ
Ɂɚɜɟɞɭɸɳɚɹɪɟɞɚɤɰɢɟɣ ɘɋɟɪɝɢɟɧɤɨ
ȼɟɞɭɳɢɣɪɟɞɚɤɬɨɪ ɇȽɪɢɧɱɢɤ
Ʌɢɬɟɪɚɬɭɪɧɵɟɪɟɞɚɤɬɨɪɵ ɇɄɭɞɪɟɣɤɨɇɏɥɟɛɢɧɚ
ɏɭɞɨɠɟɫɬɜɟɧɧɵɣɪɟɞɚɤɬɨɪ ȼɆɨɫɬɢɩɚɧ
Ʉɨɪɪɟɤɬɨɪɵ ȿɉɚɜɥɨɜɢɱȿɊɚɮɚɥɸɤȻɭɡɨɜɫɤɚɹ
ȼɟɪɫɬɤɚ ȽȻɥɢɧɨɜ
ɂɡɝɨɬɨɜɥɟɧɨɜɊɨɫɫɢɢɂɡɝɨɬɨɜɢɬɟɥɶɈɈɈ©ɉɪɨɝɪɟɫɫɤɧɢɝɚª
ɆɟɫɬɨɧɚɯɨɠɞɟɧɢɹɢɮɚɤɬɢɱɟɫɤɢɣɚɞɪɟɫɊɨɫɫɢɹɝɋɚɧɤɬɉɟɬɟɪɛɭɪɝ
ȻɋɚɦɩɫɨɧɢɟɜɫɤɢɣɩɪɞȺɩɨɦɌɟɥ
Ⱦɚɬɚɢɡɝɨɬɨɜɥɟɧɢɹɇɚɢɦɟɧɨɜɚɧɢɟɤɧɢɠɧɚɹɩɪɨɞɭɤɰɢɹɋɪɨɤɝɨɞɧɨɫɬɢɧɟɨɝɪɚɧɢɱɟɧ
ɇɚɥɨɝɨɜɚɹɥɶɝɨɬɚ²ɨɛɳɟɪɨɫɫɢɣɫɤɢɣɤɥɚɫɫɢɮɢɤɚɬɨɪɩɪɨɞɭɤɰɢɢɈɄ²
Ʉɧɢɝɢɩɟɱɚɬɧɵɟɩɪɨɮɟɫɫɢɨɧɚɥɶɧɵɟɬɟɯɧɢɱɟɫɤɢɟɢɧɚɭɱɧɵɟ
ɂɦɩɨɪɬɟɪɜȻɟɥɚɪɭɫɶɈɈɈ©ɉɂɌȿɊɆªɊȻɝɆɢɧɫɤɭɥɌɢɦɢɪɹɡɟɜɚɞɤɬɟɥɮɚɤɫ
ɉɨɞɩɢɫɚɧɨɜɩɟɱɚɬɶɎɨɪɦɚɬîȻɭɦɚɝɚɨɮɫɟɬɧɚɹɍɫɥɩɥɌɢɪɚɠɁɚɤɚɡ