В этой лекции мы познакомимся с возможностями, которые предоставляет Jupyter Notebook для разработки программ: редактирование и выполнение исходного кода, добавление к нему сопроводительной информации.
Чтобы запустить Jupyter Notebook, в меню Программы ОС Windows нужно найти папку Anaconda и нажать на соответствующем элементе.
После этого будет открыто два новых окна. Первым появится небольшое черное окно, в котором будет запущен сервер Jupyter Notebook, а через некоторое время откроется браузер, в котором будет представлен интерфейс для создания и выполнения программ в среде Jupyter Notebook.
Работа в среде Jupyter Notebook в основном выполняется в специальных файлах, называемых ноутбуками и имеющих расширение .ipynb. В этих файлах хранится исходный код на языке Python, результаты его выполнения, а также любая дополнительная информация: текст, ссылки, математические формулы, изображения и другое.
Cервер - это компонент Jupyter Notebook, чья задача заключается в выполнении команд, поступающих от пользователя через интерфейс в браузере. Окно сервера нельзя закрывать, если вы еще не закончили работу в Jupyter Notebook и не сохранили все свои изменения - они могут быть безвозвратно утеряны. В остальном, обращать внимание на то, что происходит в окне сервера, нам не понадобится.
Для каждого ноутбук-файла, с которым работает пользователь, сервер запускает ядро (kernel) - компонент, предоставляющий необходимый или полезный функционал для языка программирования Python. К этому функционалу в первую очередь относятся интерпретатор и набор специализированных расширений языка. Ядро для языка программирования Python называется IPython.
Существуют ядра, добавляющие в среду разработки Jupyter Notebook поддержку других языков программирования, отличных от Python. Это означает, что в Jupyter Notebook можно писать программы на самых разных языках, однако Python используется наиболее часто.
Для удобного взаимодействия с сервером существует достаточно простой и интуитивно понятный интерфейс, который открывается в браузере при запуске Jupyter Notebook.
Для начала давайте создадим новую папку Notebooks, в которой мы будем хранить ноутбук-файлы, содержащие наши программы. Для этого нужно нажать на кнопку в правом верхнем углу и выбрать в списке Folder.
Поскольку новая папка по умолчанию получает имя Untitled Folder, нам потребуется переименовать ее. Для этого нужно кликнуть на нее и в появившемся в левом верхнем углу блоке выбрать Rename. Другие две кнопки позволяют переместить или удалить папку.
Теперь в новой папке создадим наш первый ноутбук-файл: переходим в папку Notebooks, снова нажимаем и в появившемся списке на этот раз выбираем Python 3. После этого в браузере откроется новая вкладка, в которой мы в дальнейшем будем редактировать ноутбук-файл. Пока однако вернемся на вкладку Home, и посмотрим, как она выглядит теперь.
Только что созданный ноутбук-файл находится в состоянии Running, о чем сообщает зеленый цвет значка в виде книги слева от имени ноутбук-файла, а также строка Running в правой части окна. Это означает, что для него запущено ядро, а следовательно исходный код в нем можно выполнить и посмотреть результат. Список всех запущенных в данный момент ноутбук-файлов можно посмотреть на вкладке Running в этом же окне (выделена зеленым цветом).
Если нажать на флажок слева от значка в виде книги, то в левом верхнем углу появятся кнопки <img src="./images/03/running-notebook-management.png" alt="Duplicate-Shutdown-View-Edit-Delete"style="display:inline;margin:auto"/>
Кнопка Duplicate создает копию ноутбук-файла, View открывает интерфейс для его редактирования и выполнения содержащегося в нем исходного кода (см. далее), а Shutdown останавливает ядро, связанное с этим ноутбук-файлом. Заметим, что после остановки ядра значок книги меняет цвет на серый, а блок кнопок, представленный выше, принимает такой вид При этом вы не сможете выполнить исходный код, находящийся в ноутбук-файле, ведь без работающего ядра нет доступа к интерпретатору Python.
Теперь рассмотрим интерфейс, с помощью которого мы будем редактировать наш ноутбук-файл и выполнять содержащийся в нем исходный код. Для этого нам нужно запустить его, либо кликнув по его имени, либо воспользовавшись кнопкой View, о которой мы рассказывали в предыдущем разделе. В результате будет открыта новая вкладка, в которой будет представлено содержимое нашего ноутбук-файла.
Как и при создании папки, новый ноутбук-файл по умолчанию получает имя Untitled. Давайте изменим его на Test. Для этого нужно либо кликнуть мышкой по имени файла (выделено красным), либо воспользоваться командой Rename в меню File. Там же можно найти и другие команды, традиционно помещаемые в меню File в ОС Windows: для открытия/закрытия файла, его печати и преобразования в другой формат.
Содержимое ноутбук-файла представляет собой набор ячеек, в которых содержится обычный текст или исходный код на языке Python. Существует два режима работы с ноутбук-файлом:
Добавлять новые ячейки можно с помощью команд меню Insert, которые называются Insert Cell Above и Insert Cell Below или с помощью кнопки на панели инструментов.
В меню Edit содержатся команды для различных операций над ячейками:
В меню View содержатся команды, влияющие на внешний вид интерфейса для редактирования ноутбук-файла, например, скрывающие или показывающие панель инструментов.
В меню Cell содержатся команды для выполнения исходного кода в одной или сразу нескольких ячейках. Более подробно мы познакомимся с ними чуть позже.
В меню Kernel содержатся команды для управления ядром, связанным с данным ноутбук-файлом: его остановки, перезапуска и т.д. Наиболее полезна для нас команда Interrupt (кнопка на панели инструментов), которая заставляет ядро прекратить выполнение текущей программы - это может понадобиться, если ваша программа "зависла" и не может закончить работу. Прервав ее выполнение, вы сможете исправить ошибку и запустить ее повторно.
В заключение заметим, что большинство команд в среде разработки Jupyter Notebook можно выполнять используя быстрые комбинации клавиш. Например, если ноутбук-файл находится в командном режиме, то для добавления новой ячейки достаточно просто нажать на клавиатуре клавишу B. Полный список таких комбинаций можно посмотреть в разделе Keyboard Shortcuts меню Help или нажав кнопку (обратите внимание, что комбинации представлены раздельно для командного режима и режима правки).
Существует два основных типа ячеек в ноутбук-файле:
Тип ячейки можно выбрать на панели инструментов в списке или в разделе Cell Type меню Cell. По умолчанию все новые ячейки имеют тип Code.
Эти ячейки визуально отличаются от остальных наличием слева надписи In [ ]. Внутри квадратных скобок может быть:
Давайте напишем нашу первую программу на языке Python, которая будет складывать числа 1 и 2. Для этого нужно просто ввести в ячейку с типом Code выражение 1 + 2
.
Следующим этапом должно стать выполнение нашей программы и получение результата ее работы. Для этого ячейку, в которую введен исходный код, нужно выполнить. Это можно сделать с помощью одной из команд Run меню Cell или нажав кнопку на панели инструментов. При этом происходит следующее:
В результате ваша ячейка примет такой вид:
1 + 2
3
Напомним, что программа должна соответствовать определенным правилам (лексическим и синтаксическим), чтобы быть выполненной интерпретатором. Если при вводе программы разработчик допускает некоторую ошибку, то при ее выполнении будет сгенерировано исключение. В Jupyter Notebook при этом выводится полная информация о нем, которая поможет устранить ошибку:
1 +
File "<ipython-input-2-953e01372b97>", line 1 1 + ^ SyntaxError: invalid syntax
В примере выше мы "забыли" добавить второе слагаемое в выражение, поэтому при попытке выполнить эту программу было сгенерировано исключение SyntaxError
. По его названию можно понять, что ошибка связана с некорректным синтаксисом программы. Кроме того, внимательно изучив информацию об ошибке, можно увидеть ее текстовое описание ("invalid syntax"), а также номер строки и позицию внутри нее, где она произошла. Более подробно с исключениями мы познакомимся в дальнейшем.
Упомянем еще о том, что в языке программирования Python можно размещать в исходном коде комментарии - произвольный текст, не обрабатываемый интерпретатором и как правило содержащий пояснения по работе программы. Комментарии нужны потому, что программа часто создается одними людьми, а сопровождается и модифицируется другими, которым потребуется разбираться в чужом исходном коде, и дополнительная информация о сложных или неочевидных моментах в нем придется очень кстати. Существует негласное правило о том, что комментарии в исходном коде должны быть на английском языке, однако в примерах в данном курсе мы в основном используем русский, чтобы проще было усваивать материал.
В языке Python однострочные комментарии создаются с помощью символа # - если этот символ встречается в строке исходного кода, то все, что следует после него и до конца строки считается комментарием. Если требуется создать комментарий, содержащий несколько строк, то перед первой строкой и в конце последней нужно поставить три одинарных кавычки '''.
'''
WARNING: This program is property of course developers
and protected by copyright law!
This is an example of multi-line comment and developers
sense of humour.
'''
# soon we will calculate sum of 1 and 2
1 + 2 # almost done..
# done
3
Markdown - это упрощенный язык разметки, с помощью которого в обычный текст можно вставлять информацию о том, как он должен быть отформатирован. Например, если какую-то часть текста заключить в символы " * ", то она будет выведена курсивом: *некоторый текст* будет преобразован в некоторый текст.
Чтобы применить форматирование, которое вы добавили в текст в ячейке Markdown, ее нужно выполнить тем же способом, что и ячейку Code. Естественно, что никакой интерепретатор при этом не вызывается (так как в ячейке Markdown не должен быть исходный код), вместо этого ячейка просто отображается с учетом вашего форматирования.
Поскольку среда разработки Jupyter Notebook ориентирована во многом на решение математических задач, было логично добавить в нее возможность легко вводить формулы в традиционной математической нотации. Это возможно благодаря наличию поддержки языка компьютерной верстки LaTeX, информацию о котором достаточно легко найти в интернете. Мы лишь приведем пример того, как выглядит формула плотности вероятности нормального распределения, записанная в нотации LaTeX до и после выполнения содержащей ее ячейки Markdown: