В этом руководстве рассказывается о том, как создать и как запустить скрипт на Python.
- Программирование или скриптинг?
- Как создать скрипт Python
- Как превратить код Python для Jupyter Notebook в скрипт Python?
- Создадим скрипт Python
- Шаг №1 — откройте текстовый редактор.
- Шаг №2 — скопируйте и вставьте код!
- Шаг №3 — Сохраните файл как файл .py!
- Шаг № 4 — Снова откройте текстовый файл
- Шаг № 5 — Добавьте Shebang!
- Дополнительно: шаг № 6 — сделать скрипты на Python исполняемыми
- Шаг №7 — запустите скрипт на Python!
- Шаг № 8 — почему я ничего не вижу?
- Шаг № 9 — Вы создали скрипт на Python
- Заключение
Обработку данных на основе Python можно разбить на маленькие этапы. Например:
- Импорт numpy и pandas.
- Загрузка необработанных данных из .csv файла в DataFrame.
- Загрузка необработанных данных из словаря Python в другой DataFrame.
- Объединение двух фреймов данных.
- Сортировка значений.
- Заполнение пустых значений.
- И так далее…
Можно выполнить эти задачи вручную. Или поместить эти команды в скрипт Python. Это и есть скриптинг.
Скрипт Python похож на сценарий фильма. В нем вы точно записываете, должен делать компьютер.
Вы можете использовать любой код, написанный ранее в Jupyter. Например, вот мой Jupyter Notebook.
Для этого нужно скопировать все строки из Jupyter Notebook и поместить их в текстовый редактор. После чего сохранить в файл с расширением .py.
Если вы находитесь на удаленном сервере, откройте свой любимый текстовый редактор. Для этого введите команду:
Вы можете использовать любой текстовый редактор (vim, nano и т. д.).
Но если вы хотите что-то более продвинутое, я настоятельно рекомендую Sublime Text 3.
Скопируйте и вставьте весь код из Jupyter Notebook в текстовый редактор:
Нажмите кнопку 10-Quit в правом нижнем углу (или Esc+0 на клавиатуре).
После чего mcedit спросит, хотите ли вы сохранить файл? Нажмите: Yes! Затем задайте имя новому текстовому файлу. Скрипты Python имеют собственное расширение: .py.
Нажмите ОК
. Теперь текстовый файл теперь стал скриптом Python.
Вернемся к редактированию файла, набрав команду:
Теперь код выглядит более похожим на Python с различной подсветкой:
Это потому, что вы добавили расширение .py
. В результате этого редактор mcedit распознал текстовый файл как скрипт Python.
Shebang — это строка кода, которую нужно поместить в самом начале скрипта. Его задача – сообщить ОС, что у вас есть исполняемый файл Python3.
Строка shebang для скриптов Python3 выглядит следующим образом:
#! / usr / bin / env python3
Добавленный Shebang
Если честно, ваш скрипт будет работать и без него. Несмотря на это, я предпочитаю добавлять Shebang по нескольким причинам:
- В среде разработки, в которой доступно сразу несколько версий Python, Shebang прояснит, какой интерпретатор должен выполнить скрипт.
- Когда один из ваших коллег откроет скрипт, он сразу увидит, на каком языке он написан.
После добавления Shebang, снова сохраните файл и попробуйте запустить скрипт, введя команду:
В некоторых случаях (в зависимости от конфигурации используемого сервера) вы получите ошибку прав доступа:
demoscript.py: Permission denied
В Python подобная ошибка прав доступа не возникает. Если вы не столкнулись с этой проблемой, просто перейдите к шагу № 7.
Если у вас возникла ошибка прав доступа, в командной строке введите этот код:
sudo chmod 777 demoscript.py
Затем введите свой пароль.
Запустите скрипт, введя команду:
Это означает, что ваш скрипт на Python запущен… Но вы не видите никакого результата на экране.
В большинстве случаев, когда вы конвертируете проект Jupyter Notebook в скрипт Python, вы не увидите на экране ничего. Это потому, что последняя строка вашего кода была такой:
Вернитесь к своему скрипту и измените последнюю строку на эту:
Нажмите 10-Quit и Save.
Перезапустите скрипт, введя для этого команду:
Победа!
Вы создали скрипт на Python, и он работает. Но вы все равно захотите использовать Jupyter Notebook. Так как он является идеальным инструментом для тестирования и настройки процессов. Поэтому:
- Я создаю прототип проекта на Python в Jupyter Notebook. Затем создаю код и выясняю, какие шаги необходимы.
- Затем удаляю ненужные фрагменты кода и импортированные пакеты, сортирую задачи Python в порядке их выполнения.
- Добавляю комментарии к коду.
- Перемещаю все в текстовый редактор (Sublime Text или mcedit) и создаю скрипт Python, который можно автоматизировать.
Написание и запуск скриптов Python это не магия. Если вы знаете, как писать код на Python, то сможете освоить и скрипты
Желание изучить питон было давно. Я много где слышал что он хорошо подходит для прототипов, скриптов и небольших приложений. Он отличается высокой скоростью разработки и низким порогом вхождения. Динамичность — непривычно, но решаемо.
И вот, написал первый скрипт. Он оптимизирует перемещение на «сегодня» просроченных задач в тудуисте. Перенос в приложении выполняется в 3 действия: выделить задачи с зажатым шифтом, пройти через пункты меню и нажать заветную кнопку: «перенести на сегодня». Это не всегда получается с одной попытки. Время для автоматизации!
Установка Python 3
Не нашел причин, чтобы начать знакомство не с 3 версией питона. И, так как в Mac OS X El Capitan, установлена версия 2.7, то рассмотрим простой способ установки Python 3.
Понадобится менеджер пакетов Homebrew. У кого нет — советую. Для его установки введем в терминале:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Теперь установим третий питон:
Проверить работоспособность можно набрав в консоли python3
.
Получение пакета для работы с тудуистом
Следующий этап — установка библиотеки для работы с АПИ тудуиста. Воспользуемся менеджером пакетов pip3, который поставляется вместе с Python 3:
pip3 install todoist-python
Напоминаю о командной оболочке Zsh, о которой я писал ранее. Подключив плагины brew
и pip
можно добавить автодополнение для команд и пакетов.
Среда разработки
Автодополнение, рефакторинг, отладка — все это помогает на любых стадиях изучения языка. Поэтому я воспользовался IDE от JetBrains — PyCharm CE. Это бесплатная версия, в которой есть все необходимое.
Стиль кода и именования
Планирутся отдельная статья. А пока — о стиле именования.
Имена функций, методов и переменных экземпляров классов должны состоять из маленьких букв, а слова разделяться символами подчеркивания:
Стиль mixedCase допускается в тех местах, где уже преобладает такой стиль, для сохранения обратной совместимости:
Для атрибутов и непубличных методов используется один символ подчёркивания перед именем:
Итерация и получение значений из коллекций
Библиотека todoist возвращает на запрос о просроченных задачах словарь или список. Возник вопрос: как работать с коллекциями?
Итерация оказалась похожа на foreach
из C#:
for overdue_item in overdue_items:
item = api.items.get_by_id(overdue_item['id'])
print item
Для получения значения словаря есть 2 способа . Первый — обращение по ключу:
Но, если значения нет, возникнет ошибка — KeyError: 'id'
. Поэтому при неуверенности, используйте get
:
id = overdue_item.get('id')
Если значение отсутствует, метод вернет значение по умолчанию — None
.
Преобразование и работа с датой
Рассмотрим как парсить дату, находить дельту, добавлять значения и приводить к определенному строковому формату.
Разберем построчно код из моего скрипта:
item_due_date = datetime.strptime(item['due_date_utc'], '%a %d %b %Y %H:%M:%S %z')
delta = datetime.now(timezone.utc).date() - item_due_date.date()
item_today_date = item_due_date + timedelta(days=delta.days)
item.update(due_date_utc=item_today_date.strftime('%Y-%m-%dT%H:%M:%S'))
- По ключу
due_date_utc
получаем дату в формате"Fri 26 Sep 2014 08:25:05 +0000"
. Выражением%a %d %b %Y %H:%M:%S %z
переводим в понятный питону формат. Документация по значениям переменных из выражения. - Находим разницу между текущей датой и датой полученного объекта.
- Актуализируем дату объекта, добавляя к нему полученную разницу дней.
- Переведем дату в строку используя
%Y-%m-%dT%H:%M:%S
и отправим изменения в тудуист.
Типы выполнения модуля с кодом
Часто, читая код на гитхабе, встречал конструкцию:
if __name__ == "__main__":
...
Выясним ее предназначение.
Когда исполняется файл с кодом, выполняются все команды на нулевом уровне: задаются специальные переменные, импортируются модули, определяются функции и классы. Одна из специальных переменных — __name__
. Она хранит имя модуля, который вызвал скрипт.
Например, модуль вызвали из файла foo.py
:
Переменная __name__
примет значение foo
. Если вызвать скрипт напрямую из терминала:
__name__
инициализируется значением __main__
. И тогда выполнится весть код из условия if __name__ == "__main__":
. Получается, модуль может работать и библиотекой и независимым приложением.
Добавление атрибутов командной строки
Мой скрипт может принимать значение токена АПИ тудуиста. Для этого скрипт вызывается с параметром -t
:
python TodoistOverdue.py -t 0123456789abcdef0123456789abcdef01234567
Рассмотрим построчно, как задавать описание скрипта и определять аргументы:
parser = argparse.ArgumentParser(description="Moving overdue tasks for today in todoist")
parser.add_argument("-t", "--token", help="Todoist API token")
args = parser.parse_args()
- Инициализируем класс
ArgumentParser
, помогающий работать с командной строкой, и зададим описание скрипта. - Добавим аргумент, задаваемый ключом
’-t’
или’--token’
. В параметреhelp
указываем описание, показываемое при вызове скрипта с ключом-h
. - Переводим строки аргументов в объекты и присваиваем их как атрибуты к переменной.
Теперь, при запуске скрипта с ключом -t
, в переменной args.token
будет храниться значение введенного токена. Про остальные параметры и методы можно узнать в документации python.
Чтение и запись в файл конфигурации
Полученный токен хранится в конфигурационном файле. Рассмотрим код для доступа, чтения и записи значения:
Чтение и запись в файл конфигурации
Полученный токен хранится в конфигурационном файле. Рассмотрим код для доступа, чтения и записи значения:
config = configparser.ConfigParser()
config.read(expanduser('~') + "/.todoist")
token = args.token
if token is None:
token = config['Global']['TokenAPI']
else:
config['Global'] = {'TokenAPI': token}
with open(expanduser('~') + "/.todoist", 'w') as configfile:
config.write(configfile)
- Инициализируем
ConfigParser
и читаем файл из домашней директории пользователя.expanduser('~')
позволяет получить путь к домашней директории в любой операционной системе. - Читаем конфиг как словарь:
config['Global']['TokenAPI']
. Сначала обращаемся к секции со значением, следом — к ключу. - В блоке
else
записываем значение токена, если оно было указано при запуске. После конфигурационный файл записывается на диск.
Мне понравилось, как просто записать изменения в файл. В C# для этого надо открывать потоки, указывать дополнительную информацию, здесь это просто 2 строчки. Возьми это и запиши сюда, все.
Документация для ConfigParser. Информацию о вводе и выводе в Python 3.
Заключение
Знакомство с языком Python оставило приятное впечатление. Как минимум его стоит изучить на базовом уровне, чтобы автоматизировать происходящие вокруг вас процессы. Он также хорош для быстрого написания прототипа идеи, засевшей у вас в голове.
Полный скрипт TodoistOverdue.py
из статьи лежит в gist.
Полезные ссылки
— Как запускать скрипты в Mac Os X без указания полного пути. Stackoverflow.
— Изучить питон за несколько минут (learnxinyminutes.com). Русская и английская версия.
— Документация для Python 3.5.х.
Код, написанный на языке Python, может храниться в редакторе кода, IDE или файле. И он не будет работать, если не знать, как его правильно запускать.
В этом материале рассмотрим 7 способов запуска кода, написанного на Python. Они будут работать вне зависимости от операционной системы, среды Python или местоположения кода.
Python-код можно запустить одним из следующих способов:
- С помощью командной строки операционной системы (shell или терминал);
- С помощью конкретной версии Python или Anaconda;
- Использовать Crontab;
- Запустить код с помощью другого Python-скрипта;
- С помощью файлового менеджера;
- Использовать интерактивный режим Python;
- Использовать IDE или редактор кода.
Запуск Python-кода интерактивно
Для запуска интерактивной сессии нужно просто открыть терминал или командную строку и ввести python
(или python3
в зависимости от версии). После нажатия Enter запустится интерактивный режим.
Вот как запустить интерактивный режим в разных ОС.
Интерактивный режим в Linux
Откройте терминал. Он должен выглядеть приблизительно вот так :
После нажатия Enter будет запущен интерактивный режим Python.
Интерактивный режим в macOS
На устройствах с macOS все работает похожим образом. Изображение ниже демонстрирует интерактивный режим в этой ОС.
Интерактивный режим в Windows
В Windows нужно открыть командную строку и ввести python
. После нажатия Enter появится приблизительно следующее:
Запуск Python-скриптов в интерактивном режиме
В таком режиме можно писать код и исполнять его, чтобы получить желаемый результат или отчет об ошибке. Возьмем в качестве примера следующий цикл.
Этот код должен выводить целые числа от 0 до 5. В данном случае вывод — все, что появилось после print(i)
.
Для выхода из интерактивного режима нужно написать следующее:
И нажать Enter. Вы вернетесь в терминал, из которого и начинали.
Есть и другие способы остановки работы с интерактивным режимом Python. В Linux нужно нажать Ctrl + D, а в Windows — Ctrl + Z + Enter.
Стоит отметить, что при использовании этого режима Python-скрипты не сохраняются в локальный файл.
Как выполняются Python-скрипты?
Отличный способ представить, что происходит при выполнении Python-скрипта, — использовать диаграмму ниже. Этот блок представляет собой скрипт (или функцию) Python, а каждый внутренний блок — строка кода.
Первая строка (кода):
Вторая = строка кода
Третья строка > кода:
Четвертая (строка == кода)
Пятая строка кода
При запуске скрипта интерпретатор Python проходит сверху вниз, выполняя каждую из них. Именно таким образом происходит выполнение кода.
Но и это еще не все.
Блок-схема выполнения кода интерпретатором
- Шаг 1: скрипт или .py-файл компилируется, и из него генерируются бинарные данные. Готовый файл имеет расширение .pyc или .pyo.
- Шаг 2: генерируется бинарный файл. Он читается интерпретатором для выполнения инструкций.
Это набор инструкций, которые приводят к финальному результату.
Иногда полезно изучать байткод. Если вы планируете стать опытным Python-программистом, то важно уметь понимать его для написания качественного кода.
Это также пригодится для принятия решений в процессе. Можно обратить внимание на отдельные факторы и понять, почему определенные функции/структуры данных работают быстрее остальных.
Как запускать Python-скрипты?
Для запуска Python-скрипта с помощью командной строки сначала нужно сохранить код в локальный файл.
Возьмем в качестве примера файл, который был сохранен как python_script.py. Сохранить его можно вот так:
- Создать Python-скрипт из командной строки и сохранить его,
- Создать Python-скрипт с помощью текстового редактора или IDE и сохранить его. Просто создайте файл, добавьте код и сохраните как «python_script.py»
Сохранить скрипт в текстовом редакторе достаточно легко. Процесс ничем не отличается от сохранения простого текстового файла.
Но если использовать командную строку, то здесь нужны дополнительные шаги. Во-первых, в самом терминале нужно перейти в директорию, где должен быть сохранен файл. Оказавшись в нужной папке, следует выполнить следующую команду (на linux):
sudo nano python_script.py
После нажатия Enter откроется интерфейс командной строки, который выглядит приблизительно следующим образом:
Теперь можно писать код и с легкостью сохранять его прямо в командной строке.
Как запускать скрипт в командной строке?
Скрипты можно запустить и с помощью команды Python прямо в интерфейсе терминала. Для этого нужно убедиться, что вы указали путь до него или находитесь в той же папке. Для выполнения скрипта (python_script.py) откройте командную строку и напишите python3 python_script.py
.
Замените python3
на python
, если хотите использовать версию Python2.x.
Вот что будет храниться в самом файле python_script.py:
for i in range(0,5):
print(i)
Вывод в командной строке будет следующим:
~$ python python_script.py
0
1
2
3
4
Предположим, что нужно сохранить вывод этого года (0, 1, 2, 3, 4). Для этого можно использовать оператор pipe
.
Это делается вот так:
python python_script.py > newfile.txt
После этого будет создан файл «newfile.txt» с сохраненным выводом.
Как выполнять код интерактивно
Есть больше 4 способов запустить Python-скрипт интерактивно. Рассмотрим их все подробно.
Использование import для запуска скриптов
Импорт модулей для загрузки скриптов и библиотек используется постоянно. Можно даже написать собственный скрипт (например code1.py) и импортировать его в другой файл без необходимости повторять то же самое.
Вот как нужно импортировать code1.py в новом скрипте.
Но таким образом импортируется все содержимое файла code1.py. Это не проблема до тех пор, пока не появляется необходимость, в том, чтобы код был оптимизирован и быстро работал.
Предположим, что внутри файла есть маленькая функция, например chart_code1()
, которая рисует красивый график. И нужна только она. Вместо того чтобы взывать весь скрипт целиком, можно вызвать ее.
Вот как это обычно делается.
>>> from code1 import chart_code1
Теперь появляется возможность использовать chart_code1
в новом файле так, будто бы эта функция была написана здесь.
Использование importlib для запуска кода
import_module()
из importlib позволяет импортировать и исполнять другие Python-скрипты.
Это работает очень просто. Для скрипта code1.py нужно сделать следующее:
import importlib
import.import_module('code1')
И нет необходимости добавлять .py в import_module()
.
Разберем случай, когда есть сложная структура папок, и нужно использовать importlib. Предположим, что структура следующая:
level1 | +– __init__.py – level2 | +– __init__.py – level3.py
В таком случае, написав, например, importlib.import_module("level3")
, вы получите ошибку. Это называется относительным импортом и работает за счет явного использования относительного пути.
Так, для запуска скрипта level3.py можно написать так:
importlib.import_module('.level3', 'level1.level')
# или так
importlib.import_module('level1.level2.level3')
Запуск кода с помощью runpy
Модуль runpy
ищет и исполняет Python-скрипт без импорта. Он также легко используется, ведь достаточно просто вызывать имя модуля в run_module()
.
Вот как, например, выполнить code1.py с помощью runpy.
>>> import runpy
>>> runpy.run_module(mod_name="code1")
Запуск кода динамически
Рассмотрим функцию exec()
, которая также используется для динамического выполнения скриптов. В Python2 эта функция была инструкцией.
Вот как она помогает выполнять код динамически на примере строки.
>>> print_the_string = 'print("Выполнен динамический код")'
>>> exec(print_the_string)
Однако этот способ уже устарел. Он медленный и непредсказуемый, а Python предлагает массу других вариантов.
Запуск скриптов Python из текстового редактора
Для запуска кода с помощью текстового редактора можно использовать команду по умолчанию (run) или горячие клавиши (Function + F5 или просто F5 в зависимости от ОС).
Вот пример того, как код выполняется в IDLE.
Но стоит обратить внимание на то, что в данном случае нет контроля над виртуальной средой, как это бывает при исполнении с помощью интерфейса командной строки.
Поэтому IDE и продвинутые редакторы текста куда лучше базовых редакторов.
Запуск кода из IDE
IDE можно использовать не только для запуска Python-кода, но также для выбора среды и отладки.
Интерфейс этих программ может отличаться, но список возможностей должен совпадать: сохранение, запуск и редактирование кода.
Запуск кода из файлового менеджера
Что если бы был способ запустить Python-скрипт двойным кликом по файлу с ним. Это можно сделать, создав исполняемый файл. Например, в случае с Windows для этого достаточно создать файл с расширением .exe и запустить его двойным кликом.
Как запустить Python-скрипт из другого кода
Хотя об этом явно не говорилось, можно прийти к выводу, что в случае с Python есть возможность:
- Запустить скрипт в командной строке, и этот скрипт будет вызывать другой код;
- Использовать модуль для загрузки другого скрипта.
Основные моменты
- Python-код можно писать в интерактивном и не-интерактивном режимах. При выходе из интерактивного режима вы теряете данные. Поэтому лучше использовать
sudo nano your_python_filename.py
. - Код можно запускать с помощью IDE, редактора кода или командной строки.
- Есть разные способы импорта кода и использования его из другого скрипта. Выбирайте вдумчиво, рассматривая все преимущества и недостатки.
- Python читает написанный код, транслирует его в байткод, который затем используется как инструкция — все это происходит при запуске скрипта. Поэтому важно учиться использовать байткод для оптимизации Python-кода.
Введение | |
Hello World! — первый скрипт на Python | |
Как запускать скрипты | |
Отступы (indentation) | |
Арифметика | |
if __name__ == ‘__main__’ | |
!#: Shebang | |
Scopes: области видимости | |
Полезные ссылки | |
Похожие статьи |
Введение
Python, произностися как Пайтон, в русском языке распространено название Питон
— высокоуровневый язык программирования общего назначения, ориентированный на
повышение производительности разработчика и читаемости кода.
Синтаксис ядра Python минималистичен. В то же время стандартная библиотека
включает большой объём полезных функций.
Python поддерживает структурное, объектно-ориентированное, функциональное,
императивное и аспектно-ориентированное программирование.
Основные архитектурные черты — динамическая типизация, автоматическое управление
памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных
вычислений, высокоуровневые структуры данных.
Поддерживается разбиение программ на модули, которые, в свою очередь, могут объединяться в пакеты.
Эталонной реализацией Python является интерпретатор CPython, поддерживающий
большинство активно используемых платформ.
Он распространяется под свободной лицензией Python Software Foundation License,
позволяющей использовать его без ограничений в любых приложениях, включая проприетарные.
Есть реализация интерпретатора для JVM с возможностью компиляции, CLR, LLVM,
другие независимые реализации. Проект PyPy использует JIT-компиляцию, которая
значительно увеличивает скорость выполнения Python-программ.
Python — активно развивающийся язык программирования, новые версии с
добавлением/изменением языковых свойств выходят примерно раз в два
с половиной года.
Язык не подвергался официальной стандартизации, роль
стандарта де-факто выполняет CPython, разрабатываемый под контролем автора языка.
В настоящий момент (апрель 2021)
Python занимает третье место в рейтинге TIOBE с показателем 11,03%.
Аналитики отмечают, что это самый высокий балл Python за все время его присутствия в
рейтинге.
Посмотреть текущий рейтинг можно
здесь
Hello World!
Инструкция по запуску первой программы в Python
Убедитесь, что Python установлен и команда
python -V
Показывает версию Python, например
Python 3.9.1
Если вы работаете в
Linux,
UNIX
или
Bash в Windows
перейдите в свою домашнюю директорию
В Linux
cd ~
В Windows
cd /mnt/c/Users/username
Создайте директорию python
mkdir python
Перейдите в неё, создайте файл hello_world.py
и откройте его любым тестовым редактором
cd python
touch hello_world.py
vi hello_world.py
Вставьте туда следующий код
print("Hello World!")
Выполните
python hello_world.py
В терминале должно появиться сообщение
Hello World!
Больше деталей о запуске скриптов вы можете найти в следующем параграфе —
«Запуск Python скрипта»
и затем в
if __name__ == «__main__»:
Запуск скрипта
Чтобы запустить .py скрипт введите
python имя_файла.py
Результат такого запуска зависит от того, что указано после
if __name__ == «__main__»:
если это условие вообще есть
print(«Hello!»)
python sample.py
Hello!
Теперь то же самое но в функции
def say_hello():
print(«Hello!»)
python sample.py
Ничего не произошло потому что функцию никто не вызвал
Можно добавить вызов функции следующим образом
def say_hello():
print(«Hello!»)
say_hello()
python sample.py
Hello!
В этом случае функция будет вызываться всегда — как при запуске скрипта из терминала так и при импорте в другой модуль
настроить это поведение можно с помощью переменной __name__ а точнее — с помощью условия
if __name__ == «__main__»:
Отступы (indentation)
Python не является языком поддерживающим свободный формат. Блоки кода не
разделяются с помощью { }
Вместо этого блоки разделяются отступами по так называемому правилу оффсайда (Off-side rule)
Демонстрация
Рассмотрим файл for_loop.py
for i in range(1,4):print(i)
python for_loop.py
1
2
3
Всё работает прекрасно. Обратите внимание, что выведены были только i от 1 до 3. 4 python не вывел.
Если написать код не в одну строку, а следующим образом
for i in range(1,4):
print(i)
то работать код не будет. Получится ошибка
File «/home/andrei/python/for_loop.py», line 2
print(i)
^
IndentationError: expected an indented block
Поэтому нужно поставить перед print пробел
for i in range(1,3):
print(i)
python for_loop.py
1
2
3
Вместо одного пробела можно поставить табуляцию, но лучше поставить два или четыре пробела подряд.
PEP8
— документ, в котором собраны рекомендации по написанию Python кода говорит:
Use 4 spaces per indentation level
САМОЕ ВАЖНОЕ: Нельзя смешивать в одном файле отступы в виде табуляций и в виде
пробелов. Выберите один стиль и придерживайтесь его.
Про то как правильно переносить слишком длинные строки можете прочитать
здесь
Арифметика
/ — деление. Результат — число с плавающей точкой
>>> 5 / 2
2.5
// — целочисленное деление. Результат — округлённое до целого числа частное.
>>> 5 // 2
2
% — остаток от деления. Результат — остаток от //
>>> 5 % 2
1
Печать спецсимволов HTML
for i in range(100001,125000):
print "<tr><td>&#",i,";</td><td>&#",i,";</td></tr>"
Ссылки
Psyco
Shedskin
PyPy
Cython
Jython
IronPython
IDLE
Синтаксис
Set в фигурных скобках. Элемент добавляется с помощью .add()
if __name__ == ‘__main__’
Чтобы разобраться в смысле этой строки создадим два файла.
first_module.py
и
second_module.py
В первом напишем
print(f"Имя первого модуля: {__name__}")
# Если не любите f-string напишите:
print("Имя первого модуля: {}".format(__name__))
Запустим его
python3 first_module.py
Имя первого модуля: __main__
Во втором запишем
import first_module
Запустим его
python3 second_module.py
Имя первого модуля: __first_module__
Вывод: когда модуль запущен непосредственно, его __name__ это __main__
Когда модуль импортирован в другой модуль, его __name__ это __название_py_файла__
Теперь когда все ясно, можно добавить в наш код условие if __name__ == «__main__»
def say_hello():
print(«Hello!»)
def display_name():
print(f«Имя первого модуля: {__name__}»)
if __name__ == «__main__»:
say_hello()
Hello!
Или
def say_hello():
print(«Hello!»)
def display_name():
print(f«Имя первого модуля: {__name__}»)
if __name__ == «__main__»:
display_name()
Имя первого модуля: __main__
Суть в том, что теперь мы определяем что будет выполняться при вызове этого скрипта а что нет.
Пакеты Python в Linux
Узнать сколько всего python3 пакетов в репозитории
Ubuntu
apt-cache search python3 | wc -l
3472
Изучить их названия можно с помощью less
apt-cache search python3 | less
alembic — lightweight database migration tool for SQLAlchemy
brltty — Access software for a blind person using a braille display
debian-goodies — Small toolbox-style utilities for Debian systems
devscripts — scripts to make the life of a Debian Package maintainer easier
libcrack2-dev — pro-active password checker library — development files
…
Проверить, существует ли файл
hosts
#!/usr/bin/python3
import os.path
if os.path.exists("/etc/hosts"):
print("hosts file exists")
else:
print("no hosts file")
или
#!/usr/bin/python3
try:
f = open('/etc/hosts')
print("hosts file exists")
except FileNotFoundError:
print("no hosts file")
python3 check_hosts.py
hosts file exists
Shebang
Указывает на нужный интерпретатор. Примеры:
#!/usr/bin/env python
#!/home/andrei/.pyenv/shims/python
После написаний шебанга нужно сделать скрипт выполняемым файлом
chmod + x имя_скрипта.py
И теперь его можно запускать прямо из терминала
./имя_скрипта.py
Или
.имя_скрипта.py
Scopes
Local — внутри функции
Enclosing — внутри фукнции, которая вызвала функцию
Global — во всем модуле
Built-in — встроено в Python
LEGB
Ссылки на Local уничтожаются после выполнения функции
Рассмотрим функцию fetch_words()
из статьи про
docstring
url, story, story_words, line, line_words, word — это локальные переменные
def fetch_words(url):
«»»Fetch a list of words from a URL.
Args:
url: The URL of a UTF-8 text document.
Returns:
A list of strings containing the words from
the document
«»»
# PEP 257
# story = urlopen(«http://sixty-north.com/c/t.txt»)
story = urlopen(url)
story_words = []
for line in story:
line_words = line.decode(«utf8»).split()
for word in line_words:
story_words.append(word)
story.close()
return story_words
def print_items(story_words):
«»»Print items one per line.
Args:
An iterable series of printable items.
«»»
for word in story_words:
print(word)
def main(url):
words = fetch_words(url)
print_items(words)
if __name__ == «__main__»:
main(sys.argv[1])
Разберем поведение глобальных переменных
count = 0
def show_count():
print(count)
def set_count(c):
count = c
show_count() # 0
set_count(5)
show_count() # 0
0
0
Изменить поведение функции можно с помощью global
count = 0
def show_count():
print(count)
def set_count(c):
global count
count = c
show_count() # 0
set_count(5) # Now affects global variable
show_count() # 5
0
5
Полезные ссылки
Основы Python | |
Python | |
Установка Python | |
ООП в Python | |
Функции | |
docstring | |
#!: Shebang | |
Объекты | |
Сложности при работе с Python |
Все курсы > Программирование на Питоне > Занятие 13
Сегодня мы сделаем шаг назад и посмотрим в целом, что такое программа на Питоне.
Способ 1. Писать код в облаке в Google Colab.
Способ 2. Написать программу в отдельном файле (скрипте) с расширением .py и передать этот код специальному интерпретатору для исполнения.
Способ 3. Установить Jupyter Notebook (локальный аналог Google Colab).
С первым способом мы уже познакомились в рамках вводного курса. Сегодня мы займемся написанием программы в отдельном файле, а в следующий раз — изучим Jupyter Notebook.
Кроме того, мы рассмотрим возможности по созданию собственных модулей и пакетов в Питоне.
Установка Питона на Windows
Прежде чем мы начнем писать программу, нам нужно установить библиотеки (libraries) и интерпретатор (interpreter) для обработки кода.
Шаг 1. Проверить, установлен ли Питон на вашем компьютере
Для этого вначале нажмите клавишу Windows и клавишу R на клавиатуре.
В появившемся окне «Выполнить» введите
cmd и нажмите Enter.
Появится так называемая «командная строка» (Command Line Promt) — отдельная программа, позволяющая взаимодействовать с Windows не графически (как мы привыкли делать), а через текстовые команды.
Теперь введите
python —version. Если Питон установлен, то программа сообщит текущую версию. В противном случае появится вот такая запись.
Если Питон не установлен, переходите к шагу 2. В случае если вы его уже установили, переходите сразу к шагу 3.
Шаг 2. Скачать Питон с официального сайта
Перейдем на сайт www.python.org/dowloads/⧉ и скачаем, среди прочего, базовый функционал Питона, а также интерпретатор для Windows, который позволит нам исполнять написанный нами код.
После скачивания и запуска файла откроется мастер установки.
Нижняя галочка добавит Питон в переменную окружения PATH. Благодаря этому мы сможем исполнять код на Питоне напрямую из командной строки. Мы разберем как это делается уже на следующем шаге.
Снова проверим установку Питона на компьютере, повторив действия Шага 1. В командной строке должна появиться установленная на данный момент версия Питона.
Шаг 3. Запустить Питон из командной строки
Теперь давайте введем в командной строке команду
py. Должны появиться символы
>>>.
Это значит, что командная строка перешла в интерактивный режим, и мы можем писать код на Питоне.
Напишем классическую фразу:
При корректном исполнении кода фраза будет выведена на экран.
Однако, как вы помните, наша задача — исполнить не отдельную команду, а скрипт, то есть целую программу на Питоне, а для этого нам нужно эту программу создать.
Поэтому выйдем из интерактивного режима с помощью команды
quit() или
exit(), закроем окно командной строки и перейдем к созданию программы на Питоне.
Создание программы на Питоне
Технически для создания программы нам понадобится редактор кода. В нем мы будем создавать файлы с расширением .py и передавать их интерпретатору.
Шаг 1. Скачать редактор кода
Редактор кода — это текстовый редактор, который, среди прочего, правильно подсвечивает код на том языке, на котором вы программируете.
В принципе, если вы работаете на Windows, то можете воспользоваться и «Блокнотом» (Notepad), который уже установлен в этой операционной системе (MS Word использовать не стоит). Достаточно написать в нем код, сохранить файл и изменить расширение с .txt на .py.
Если вы не видите расширения файлов, в «Проводнике» нажмите на вкладку «Вид» и поставьте галочку напротив «Расширения имен файлов».
При этом гораздо удобнее писать код в специально предназначенных для этого редакторах. Приведу ссылки на несколько популярных программ.
- Notepad++⧉
- Sublime⧉
- Atom⧉
На сегодняшнем занятии мы будем использовать Atom.
Редактор Atom
После установки и запуска редактора Atom закройте ненужные вкладки и нажмите File → New File.
Затем, чтобы сообщить редактору, что мы хотим писать код на Питоне, сохраним этот файл с расширением .py. Для этого нажмем File → Save As и сохраним файл, например, под именем script.py на Рабочий стол.
Благодаря расширению .py Atom будет знать, что в файле script.py мы собираемся писать код на Питоне.
Шаг 2. Написать программу на Питоне
Первой программой будет алгоритм линейного поиска (linear search algorithm). Этот алгоритм проверяет наличие числа в массиве путем простого перебора всех значений от первого до последнего.
Напишем такую программу в редакторе Atom и сохраним файл script.py.
# возьмем массив, arr = [3, 7, 0, 2, 5] # в котором нам нужно найти число 2 x = 2 # в цикле пройдемся по индексу массива for i in range(len(arr)): # если искомое число находится на этом индексе if (arr[i] == x): # выведем индекс print(i) |
Если у вас не получилось создать файл в редакторе Atom, вы можете его скачать.
В результате исполнения этого кода компьютер должен выдать цифру три, потому что искомое число два находится именно под этим индексом. Посмотрим, так ли это.
Шаг 3. Запустить программу из командной строки
Запустим этот код с помощью командной строки.
- Откроем командную строку через клавиши Window + R →
cmd. Перейдем на Рабочий стол (напомню, файл script.py мы сохранили именно туда) с помощью команды
cd Desktop.
Команда cd (change directory) позволяет перейти в другую папку, а Desktop — это Рабочий стол, то есть название той папки, куда мы хотим перейти. В результате командная строка должна выглядеть вот так:
- Теперь просто введите script.py. Так мы вызовем интерпретатор и исполним код.
Все, наша первая программа на Питоне готова.
Установка библиотек
Как уже было сказано, по умолчанию, с сайта www.python.org устанавливается лишь базовый функционал. Если мы хотим использовать, например, библиотеку Numpy или библиотеку Matplotlib нам нужно установить их отдельно. В этом нам поможет программа pip.
Программа pip
pip — это программа, которая помогает устанавливать (обновлять и удалять) дополнительные библиотеки на вашем компьютере. По сути эта программа связывается с репозиторием (хранилищем) пакетов/библиотек Python Package Index или PyPI (pypi.org⧉) и скачивает запрашиваемые файлы.
Все действия осуществляются из командной строки.
Если вы устанавливали Питон в соответствии с приведенной выше инструкцией, то pip уже присутствует на вашем компьютере. Проверить это можно с помощью команды
pip —version.
Кроме того, мы можем посмотреть на список всех установленных на компьютере библиотек через команду
pip list.
Установка библиотеки Numpy через pip install
Установим библиотеку Numpy. Для этого введем в командной строке
pip install numpy.
Проверить установку отдельного пакета можно с помощью команды
pip show numpy.
Использование установленной библиотеки
Теперь мы можем использовать установленную библиотеку Numpy внутри командной строки. Вначале перейдем в интерактивный режим с помощью команды py. После этого построчно (каждый раз нажимая Enter) введем следующие команды:
import numpy as np arr=np.array([1, 2, 3]) type(arr) |
Как мы видим, в результате исполнения этого кода Питон успешно создал массив Numpy.
Обновление и удаление библиотек
Создатели библиотек периодически вносят в них обновления, и эти обновления полезно скачивать на свой компьютер. Воспользуйтесь следующей командой:
pip install —upgrade numpy.
Для удаления пакета введите команду
pip uninstall numpy.
В процессе удаления будет нужно нажать Y + Enter для подтверждения операции. Другие библиотеки устанавливаются, обновляются и удаляются точно так же.
Модуль в Питоне
Помимо использования Питона в интерактивном режиме и запуска кода из файла мы можем создавать собственные модули.
Модуль в Питоне — это программа на Питоне (файл с расширением .py), которую мы можем использовать в других программах с помощью команды import.
Создание собственного модуля может быть полезно, если вы написали код, который затем будете много раз использовать в других программах.
Создание собственного модуля
Наш первый модуль на Питоне будет состоять из двух алгоритмов поиска: линейного и бинарного.
Алгоритм линейного поиска
Алгоритм линейного поиска у нас уже готов. Достаточно «обернуть» его в функцию.
# объявим функцию linear() def linear(arr, x): for i in range(len(arr)): if arr[i] == x: return i |
Теперь перейдем к бинарному поиску.
Алгоритм бинарного поиска
Вначале поговорим о том, что такое бинарный поиск. Представьте, что у вас есть телефонная книга, и вам нужно найти номер телефона определенного человека.
Если фамилия этого человека начинается с буквы А, то мы довольно быстро найдем его номер, используя уже известный нам алгоритм линейного поиска. А если он Яковлев? Линейному поиску придется перебрать все буквы от А до Я.
Бинарный же поиск действует иначе. Вначале мы открываем книгу посередине, скажем, на букве П.
После этого мы посмотрим, находится ли буква Я в первой или во второй половине книги. Так как Я очевидно находится во второй половине справочника, мы разобьем пополам вторую половину. И снова посмотрим справа искомая буква или слева.
Так мы будем действовать до тех пор, пока не найдем нужную нам букву.
Важно, что в случае бинарного поиска элементы всегда упорядочены.
Напишем код такого алгоритма на Питоне, только поиск будем выполнять не по буквам, а по числам.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# создадим класс BinarySearch class BinarySearch: # метод __init__() пропишем, но оставим пустым def __init__(self): pass # метод .srt() будет сортировать список чисел def srt(self, arr): # для этого мы используем функцию sorted() arr = sorted(arr) return arr # сам бинарный поиск будет выполняться через метод .check() def check(self, arr, x): # вначале зададим индексы первого и последнего значений # отсортированного списка low, high = 0, len(arr)—1 # цикл while будет длиться до тех пор, пока индекс последнего значения # больше или равен первому while low <= high: # найдем индекс среднего значения списка mid = low + (high — low) // 2 # если число с этим индексом равно искомому, if arr[mid] == x: # вернем этот индекс return mid # если меньше искомого (число «справа» от середины) elif arr[mid] < x: # новым нижним индексом будет «середина + 1» low = mid + 1 # если больше искомого (число «слева» от середины) else: # новым верхним индексом будет «середина — 1» high = mid — 1 # если число так и не найдено, вернем -1 mid = —1 return mid |
Хотя это уводит нас в сторону от темы сегодняшнего занятия, поясню код нахождения индекса среднего значения списка.
mid = low + (high — low) // 2 |
На первый взгляд индекс среднего значения можно найти вот так
Однако первый вариант расчета индекса среднего значения позволяет избежать переполнения памяти (overflow) при использовании слишком больших значений.
Также замечу, что мы используем оператор целочисленного деления
//, потому что в Питоне результатом обычного деления является число с плавающей точкой (float). Индекс же таким числом быть не может.
Полностью код для обоих алгоритмов будет выглядеть следующим образом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
def linear(arr, x): for i in range(len(arr)): if arr[i] == x: return i class BinarySearch: def __init__(self): pass def srt(self, arr): arr = sorted(arr) return arr def check(self, arr, x): low, high = 0, len(arr)—1 while low <= high: mid = low + (high — low) // 2 if arr[mid] == x: return mid elif arr[mid] < x: low = mid + 1 else: high = mid — 1 mid = —1 return mid |
Документирование кода с помощью docstrings
До сих пор мы писали комментарии, которые помогали нам разобраться в том, как работает та или иная часть кода. При этом, такие комментарии при исполнении кода полностью пропадают.
Одновременно в Питоне существуют так называемые строки документации (docstrings). Они используются для описания работы функции, метода, класса или модуля. Доступ к ним можно получить через атрибут __doc__ или функцию help().
В чем основные особенности создания docstrings?
- Docstrings заключаются в тройные одинарные или двойные кавычки
- Их следует располагать сразу после объявления функции, метода, класса или модуля
Добавим соответствующие docstrings в только что созданный нами модуль и параллельно разберем основные принципы написания документации. Начнем с модуля в целом.
Строки документации для модуля в Питоне
Документация модуля описывает модуль и перечисляет все доступные функции и классы. Например, для модуля mymodule документация могла бы выглядеть следующим образом.
«»» Модуль для поиска элементов в массиве чисел. ============================================ Classes ——- BinarySearch Functions ——— linear «»» |
Строки документации для функции описывают саму функцию, параметры и возвращаемое значение. Напишем документацию к функции linear().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
def linear(arr, x): «»»Выполняет линейный поиск по массиву чисел. Parameters ———- arr : {list, ndarray} Массив чисел, по которому выполняется поиск. x : int Искомое число. Returns ——- i : int Индекс искомого числа, если оно присутствует в массиве. «»» for i in range(len(arr)): if arr[i] == x: return i |
Строк документации для класса описывают сам класс, а также перечисляют доступные атрибуты и методы. Каждый метод внутри класса сопровождается отдельной документацией.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
class BinarySearch: «»»Бинарный поиск по массиву чисел. «»» def __init__(self): pass def srt(self, arr): «»»Сортирует массив чисел в возрастающем порядке. Parameters ———- arr : {list, ndarray} Массив для сортировки. Returns ——- arr : {list, ndarray} Массив, отсортированный в возрастающем порядке. «»» arr = sorted(arr) return arr def check(self, arr, x): «»»Проверяет наличие числа в массиве c помощью алгоритма бинарного поиска. Parameters ———- arr : {list, numpy array} Массив чисел, по которому выполняется поиск. x : int Искомое число. Returns ——- mid : int Индекс числа в отсортированном по возрастанию массиве чисел. Возвращает -1, если число не найдено. «»» low, high = 0, len(arr)—1 while low <= high: mid = low + (high — low) // 2 if arr[mid] == x: return mid elif arr[mid] < x: low = mid + 1 else: high = mid — 1 mid = —1 return mid |
Полностью снабженный документацией модуль выглядит следующим образом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
«»» Модуль для поиска элементов в массиве чисел. ============================================ Classes ——- BinarySearch Functions ——— linear «»» def linear(arr, x): «»»Выполняет линейный поиск по массиву чисел. Parameters ———- arr : {list, ndarray} Массив чисел, по которому выполняется поиск. x : int Искомое число. Returns ——- i : int Индекс искомого числа, если оно присутствует в массиве. «»» for i in range(len(arr)): if arr[i] == x: return i class BinarySearch: «»»Бинарный поиск по массиву чисел. «»» def __init__(self): pass def srt(self, arr): «»»Сортирует массив чисел в возрастающем порядке. Parameters ———- arr : {list, ndarray} Массив для сортировки. Returns ——- arr : {list, ndarray} Массив, отсортированный в возрастающем порядке. «»» arr = sorted(arr) return arr def check(self, arr, x): «»»Проверяет наличие числа в массиве c помощью алгоритма бинарного поиска. Parameters ———- arr : {list, numpy array} Массив чисел, по которому выполняется поиск. x : int Искомое число. Returns ——- mid : int Индекс числа в отсортированном по возрастанию массиве чисел. Возвращает -1, если число не найдено. «»» low, high = 0, len(arr)—1 while low <= high: mid = low + (high — low) // 2 if arr[mid] == x: return mid elif arr[mid] < x: low = mid + 1 else: high = mid — 1 mid = —1 return mid |
Замечу, что в данном случае мы использовали стиль документирования Numpy (NumPy documentation style). Он используется во многих известных пакетах: NumPy, SciPy, Pandas или, например, Scikit-Learn. При этом существуют и другие стили документирования.
Сохраним этот файл под именем mymodule.py. Все, наш модуль готов. Если у вас не получилось создать этот файл, вы можете скачать его по ссылке ниже.
Создание документации с помощью Pyment
Дополнительно замечу, что шаблон или «каркас» документации можно создать с помощью специального пакета Pyment. Для этого:
- Скачайте пакет Pyment через
pip install pyment - Убедитесь, что командная строка указывает на ту папку, в которой находится ваш модуль mymodule.py (например, на Рабочий стол)
- Введите команду
pyment -w -o numpydoc mymodule.py. В данном случае вы буквально просите pyment создать документацию в стиле Numpy в файле под названием mymodule.py - Откройте файл в редакторе кода и начинайте заполнять шаблон.
Загрузка и импорт модуля в Google Colab
Откроем ноутбук к этому занятию⧉
Давайте подгрузим файл mymodule.py в сессионное хранилище Google Colab.
Теперь мы можем работать с этим модулем так, как мы работали с функциями модуля random или классами библиотеки sklearn.
Вначале импортируем функцию linear() из модуля mymodule.
from mymodule import linear |
Создадим список, по которому будет выполняться поиск, а также искомое число.
arr = [3, 7, 0, 2, 5] target = 2 |
Вызовем функцию linear() и передадим ей список и целевое значение в качестве аргументов.
Теперь возьмем список большего размера и другое целевое значение.
arr = [9, 3, 343, 5, 8, 1, 20111, 32, 11, 6, 4] target = 9 |
Импортируем модуль mymodule под псевдонимом mm.
Воспользуемся бинарным поиском. Для этого вначале создадим объект класса BinarySearch и поместим его в переменную src.
Прежде чем выполнить поиск нам необходимо отсортировать список чисел. Вызовем метод .srt() класса BinarySearch.
# передадим методу .srt() список arr для сортировки sorted_arr = srch.srt(arr) # посмотрим на результат sorted_arr |
[1, 3, 4, 5, 6, 8, 9, 11, 32, 343, 20111] |
Теперь воспользуемся методом .check(), чтобы проверить, присутствует ли в списке число девять.
# напомню, что индекс числа 9 мы будем отсчитывать с нуля src.check(sorted_arr, target) |
В отсортированном списке это число присутствует под индексом шесть.
Просмотр документации модуля
Вначале выведем документацию модуля в целом.
Модуль для поиска элементов в массиве чисел. ============================================ Classes ——- BinarySearch Functions ——— linear |
Посмотрим на функию linear().
Выполняет линейный поиск по массиву чисел. Parameters ———- arr : {list, ndarray} Массив чисел, по которому выполняется поиск. x : int Искомое число. Returns ——- i : int Индекс искомого числа, если оно присутствует в массиве. |
И класс BinarySearch.
print(mm.BinarySearch.__doc__) |
Бинарный поиск по массиву чисел. |
Мы также можем посмотреть документацию отдельного метода внутри класса.
print(mm.BinarySearch.srt.__doc__) |
Сортирует массив чисел в возрастающем порядке. Parameters ————— arr : {list, ndarray} Массив для сортировки. Returns ———— arr : {list, ndarray} Массив, отсортированный в возрастающем порядке. |
Напомню, что документацию можно также посмотреть с помощью функции help().
Импорт собственного модуля в командной строке
Модуль в Питоне не обязательно подгружать в Google Colab, его также можно импортировать локально в командной строке.
Когда в интерактивном режиме мы пытаемся импортировать модуль с помощью команды import, Питон начинает искать этот модуль в конкретных папках. Посмотреть, что это за папки можно с помощью встроенного в базовый функционал модуля sys. В интерактивном режиме (команда
py) последовательно введите следующие команды.
Обратите внимание, что первой в списке
[»] указана текущая папка.
Если ваш модуль не находится в одной из этих папок, импортировать его не получится. Здесь есть два варианта: либо переместить файл в одну из указанных папок, либо добавить новую папку в переменную path.
Способ 1. Переместить файл в папку из списка
Текущая папка будет иметь адрес, похожий на
C:Usersuser (замените user на имя вашей учетной записи). Введите этот адрес в Проводнике.
Переместите туда наш модуль mymodule.py. Теперь войдем в интерактивный режим (команда
py) и импортируем модуль с помощью команды
import. После этого создадим массив, целевую переменную и вызовем функцию linear().
import mymodule arr = [3, 7, 0, 2, 5] target = 2 mymodule.linear(arr, target) |
Как вы видите, мы смогли успешно импортировать наш модуль и использовать необходимую функцию.
Способ 2. Добавить новый путь (папку) в переменную path
Добавим Рабочий стол в список sys.path. Для этого прекрасно подойдет метод .append(), который мы использовали для обычных питоновских списков.
Например, добавим Desktop (Рабочий стол).
Не забудьте заменить user на имя пользователя на вашем компьютере, а также обратите внимание на двойные обратные косые черты
в абсолютном пути к папке Desktop.
Мы готовы импортировать наш модуль с Рабочего стола. Вернем файл mymodule.py на Рабочий стол, войдем в интерактивный режим (команда
py и последовательно введем код ниже.
import mymodule arr = [3, 7, 0, 2, 5] target = 2 mymodule.linear(arr, target) |
Нам снова удалось импортировать необходимую нам функцию linear().
Интерпретация и компиляция
Небольшое отступление от темы занятия. В самом начале мы сказали, что вместе с базовым функционалом Питона мы импортируем еще и интерпретатор. Давайте, разберемся, что это такое.
Как вы помните, компьютер понимает только нули и единицы, но никак не код на Питоне. Перевести понятный человеку язык программирования на машинный можно двумя способами: через компилятор (compiler) и через интерпретатор (interpreter).
Проведем следующую аналогию. Предположим, что у нас есть текст, скажем, на французском языке, и нам нужно понять, что в нем написано.
Компилятор
Первый вариант, отдать текст в бюро переводов. Там выполнят перевод всего документа и вернут текст на русском языке. Если в исходный текст внесут изменения, нам придется вновь заказывать его перевод. Можно сказать, что бюро переводов — это компилятор.
Компилятор берет файл с понятным человеку исходным кодом, переводит его в нули и единицы и сохраняет получившийся машинный код в исполняемом (executable) файле (на Windows — это файл с расширением .exe).
После этого мы можем запустить файл .exe и увидеть результат работы программы.
Интерпретатор
Интерпетатор действует иначе. Возвращаясь к аналогии с текстом на французском языке, вместо того чтобы отправлять документ в бюро переводов, мы просим человека, говорящего на этом языке на ходу, с листа передавать нам содержание текста.
Другими словами, интерпретатор — это программа, которая позволяет обрабатывать код и сразу выдавать результат.
Как следствие, языки делятся на компилируемые и интерпретируемые. Питон относится к интерпретируемым языкам, а, например, С — к компилируемым.
Впрочем, программа на Питоне может быть скомпилирована, например, с помощью пакета PyInstaller.
Кроме того, возможно вы обратили внимание, что когда мы вызывали модуль mymodule в командной строке, то Питон автоматически создал папку под названием __pycache__.pyc. В ней содержится скомпилированный байт-код программы (промежуточный код между Питоном и машинным языком), который ускоряет последующий запуск нашего модуля.
Пакет в Питоне
Поговорим про пакеты. Предположим, что вы создали довольно много полезных функций и классов и хранить их в одном модуле не слишком удобно. Самое время задуматься над созданием собственного пакета (package).
Примечание. Некоторые пакеты (например, Numpy или Pandas) принято называть библиотеками. При этом с технической точки зрения пакет и библиотека — это одно и то же.
Создание собственного пакета
В качестве упражнения создадим несложный пакет на Питоне и поместим его в тестовый репозиторий TestPyPI. Это своего рода «песочница», в которой можно научиться создавать пакеты перед их загрузкой в «большой» репозиторий PyPI.
Обратите внимание, PyPI и TestPyPI — это разные сайты, для которых требуются разные учетные записи.
Добавлю, что по большей части этот раздел создан на основе примера, приведенного в документации Питона⧉.
Шаг 1. Создание учетной записи
В первую очередь зарегистрируйтесь на сайте https://test.pypi.org/⧉.
Шаг 2. Создание файлов
Теперь создайте пакет example_package (по сути, набор папок и файлов) со следующей структурой.
base/ └── src/ └── example_package/ ├── __init__.py └── example_module.py |
В пакет мы поместим модуль example_module.py. В модуле объявим функцию для возведения числа в квадрат square().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
«»» Модуль для выполнения арифметических операций. ============================================ Functions ——— square «»» def square(number): «»»Возводит число в квадрат. Parameters ———- number : int Возводимое во вторую степень число. Returns ——- int Квадрат числа. «»» return number ** 2 |
Также создадим пустой файл __init__.py. Он необходим для того, чтобы папка распознавалась именно как питоновский пакет.
Все последующие инструкции в командной строке будут выполняться из папки base/.
Например, если папка base/ находится на Рабочем столе, то перейти в нее можно с помощью команды
cd Desktopbase.
Дополнительные файлы
Теперь давайте немного усложним структуру и добавим новые файлы.
base/ ├── LICENSE.txt ├── pyproject.toml ├── README.md ├── setup.py └── src/ └── example_package/ ├── __init__.py └── example_module.py |
- В файл pyproject.toml поместим следующий код:
[build-system] requires = [«setuptools>=42»] build-backend = «setuptools.build_meta» |
build-system.requires указывает на пакеты, необходимые для создания дистрибутива (то есть готового к распротранению пакета),
build-system.build-backend прописывает, какой объект будет использован для его создания.
- В setuptools.py содержится информация о пакете. Там же прописывается, какие файлы следует использовать при создании дистрибутива.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import setuptools with open(«README.md», «r», encoding=«utf-8») as fh: long_description = fh.read() setuptools.setup( name=«example-package-DmitryMakarov», version=«0.0.1», author=«Dmitry Makarov», author_email=«dm.v.makarov@gmail.com», description=«Simple arithmetic package», long_description=long_description, long_description_content_type=«text/markdown», url=«https://github.com», project_urls={ «Bug Tracker»: «https://github.com», }, classifiers=[ «Programming Language :: Python :: 3», «License :: OSI Approved :: MIT License», «Operating System :: OS Independent», ], package_dir={«»: «src»}, packages=setuptools.find_packages(where=«src»), python_requires=«>=3.6», ) |
Вначале мы импортируем пакет setuptools. После этого открываем файл README.md и помещаем его содержимое в переменную longdescription.
Затем вызываем функцию setuptools.setup() и передаем ей целый ряд параметров. При создании собственного пакета замените значения следующих параметров:
- Название пакета (name). Оно должно быть уникальным. Для того чтобы обеспечить уникальность названия, проще всего добавить к нему свой логин на сайте https://test.pypi.org/ в формате «название-пакета-логин».
- Также вы можете заменить поля author и author_email.
Менять остальные поля, в принципе, не обязательно.
- Файл README.md
В файле README.md содержатся описание пакета, примеры и технические детали проекта. Расширение .md указывает на то, что этот файл сохранен в формате markdown и поддерживает форматирование текста.
В документации на сайте www.markdownguide.org⧉ вы найдете рекомендации по использованию языка markdown.
В нашем файле мы напишем следующий текст.
# Тестовый пакет Файл README.md может содержать описание, примеры и технические детали пакета. Формат .md (markdown) поддерживает форматирование текста. Например, **полужирный шрифт** или *курсив*. Более полный перечень можно найти по [ссылке](https://guides.github.com/features/mastering-markdown/) |
- Файл LICENSE.txt
Остается создать файл с лицензией LICENSE.txt. Мы будем использовать лицензию открытого и свободного программного обеспечения MIT (Массачусетского технологического института).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
MIT License Copyright (c) 2022 Dmitry Makarov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the «Software»), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
Шаг 3. Создание дистрибутива
Скачаем инструменты, необходимые для создания дистрибутива.
Теперь из папки base/ введите команду
py -m build. После ее выполнения должно появиться уведомление об успешном создании дистрибутива пакета.
Сам дистрибутив появится в папке base/.
Шаг 4. Подгрузка дистрибутива
Скачаем инструмент для подгрузки twine.
И выполним подгрузку посредством следующей команды
py -m twine upload —repository testpypi dist/* |
Пароль при вводе отображаться не будет (ни в явном, ни в скрытом виде). Просто введите нужные символы и нажмите Enter.
Должен появиться вот такой результат.
Как вы видите, подгруженный пакет доступен по адресу: https://test.pypi.org/project/example-package-DmitryMakarov/0.0.1/⧉. Мы создали свой первый пакет.
Установка и использование пакета
Если вы захотите воспользоваться этим пакетом, то в командной строке введите команду, которая представлена на первой странице пакета.
pip install -i https://test.pypi.org/simple/ example-package-DmitryMakarov==0.0.1 |
Результат исполнения этой команды вы видите ниже.
Теперь мы можем пользоваться нашим пакетом. В интерактивном режиме (команду py) импортируем модуль example_module из пакета example_package и вызовем функцию square(), передав ей, например, число два.
from example_package import example_module example_module.square(2) |
В целом создание «взрослого» пакета на PyPI следует похожей схеме.
Подведем итог
Сегодня мы расширили наше представление о том, как запускать код на Питоне. Если раньше мы использовали только Google Colab, то теперь можем создавать собственные программы, модули и пакеты.
Вопросы для закрепления
Вопрос. Чем программа (скрипт) отличается от модуля?
Посмотреть правильный ответ
Ответ: технически и то, и другое — файл с расширением .py, при этом скрипт не предполагает его использования в других программах, а модуль предназначен именно для этого.
Вопрос. Зачем добавлять Питон в переменнаую окружения PATH в ОС Windows?
Посмотреть правильный ответ
Ответ: мы добавляем Питон в переменную PATH ОС Windows, чтобы в командной строке мы могли исполнять Питон в интерактивном режиме.
Вопрос. Что такое переменная path модуля sys в Питоне?
Посмотреть правильный ответ
Ответ: в переменной path модуля sys указаны те папки компьютера, в которых интерпретатор Питона будет искать файл для его импорта. Эта переменная отличается от переменной PATH в операционной системе.
Ответы на вопросы
Вопрос. Что такое
if __name__ == ‘__main__’:?
Ответ. Перед тем как исполнить код (например, в командной строке), интерпретатор Питона объявляет несколько переменных. Одна из них называется
__name__. Этой переменной присваивается значение __main__. Создадим файл script.py со следующим кодом и запустим его в командной строке.
Теперь создадим еще один файл и назовем его module.py. Если вызвать его напрямую, то разумеется переменная
__name__ также будет иметь значение __main__.
При этом если импортировать файл module.py внутри script.py, то значение переменной
__name__ файла module.py изменится на его название (то есть слово module). Создадим файл module.py со следующим кодом.
Заменим код в файле script.py и исполним его.
import module print(__name__) |
Вероятно, чтобы лучше понять как работает приведенный в ответе код, имеет смысл самостоятельно прописать и исполнить каждый из примеров.
Как мы получили такой результат? Сначала был импортирован код из файла module.py, внутри которого переменной
__name__ было присвоено значение module. Именно это значение мы видим на первой строке вывода. Затем было выведено значение переменной
__name__ файла script.py (то есть __main__).
Теперь давайте изменим код файла module.py.
if __name__ == ‘__main__’: print(‘This runs as the main file’) else: print(‘This runs as an imported file’) |
(1) Запустим его как основной файл напрямую из командной строки.
(2) Теперь импортируем его в script.py (код файла module.py оставим без изменений).
Как вы видите, в импортированном файле module.py переменная
__name__ не содержит значения __main__, поэтому исполнилось выражение после else. В script.py переменная
__name__ по-прежнему имеет значение __main__.
Зачем может быть нужно такое условие? Если вы пишете код, который в первую очередь предназначен для импорта (то есть модуль), будет разумно не вызывать содержащиеся в нем функции автоматически. В этом случае вызов функций можно заключить в обсуждаемое условие.
Изменим файл module.py.
def foo(): print(‘This is an imported function’) if __name__ == ‘__main__’: foo() |
Теперь внутри script.py вначале просто импортируем файл module.py.
При вызове модуля ничего не произошло. Так и должно быть. Для того чтобы вызвать функцию foo() нам нужно обратиться к ней напрямую. Изменим файл script.py и исполним его.
import module module.foo() |
На следующем занятии, как мы и планировали, мы посмотрим, как можно исполнять код на Питоне в программе Jupyter Notebook.