Слайд 1Москва, 2018
Информационные
технологии
Основы
программирования
на Python 3
Каф. ИКТ РХТУ им.
Д.И. Менделеева
Ст. преп. Васецкий А.М.
Слайд 3Лекция 1. Основы работы
Введение
Интерпретатор Python и среды разработки
Основные понятия
Анализаторы кода
Структура
кода
Модули
Доступ к документации
Слайд 4Список источников. Книги
Изучаем Python. Программирование игр, визуализация данных, веб-приложения. —
СПб.: Питер, 2017. — 496 с.: ил. — (Серия «Библиотека
программиста»).
Рейтц К., Шлюссер Т. Автостопом по Python. — СПб.: Питер, 2017. — 336 с.: ил. — (Серия «Бестселлеры O’Reilly»).
Лутц М. Изучаем Python, 4-е издание. – Пер. с англ. – СПб.: Символ-Плюс, 2011. – 1280 с., ил.
Прохоренок Н. А., Дронов В. А., «Python 3. Самое необходимое» — СПб.: БХВ-Петербург. – 2016, 464 с
Прохоренок Н.А. Дронов В. А., «Python 3 и PyQt. Разработка приложений» — СПб.: БХВ-Петербург. – 2016, 832 с.
Любанович Б: Простой Python. Современный стиль программирования. – СПб.: Питер, – 2016, 480 с.
Васецкий А. М., Красильников И.В., Информационные технологии. Введение в язык программирования Python : учеб. пособие. – М. : РХТУ им. Д. И. Менделеева, 2019. – 140 с.
Слайд 5Сайты
https://docs.python.org/3/ – Оригинальная документация
http://pythonicway.com
http://pythonz.net
https://tproger.ru/tag/python/
https://pythonworld.ru
http://pythontutor.ru
https://pythoner.name
– перевод документации
https://wiki.python.org/moin/PythonEditors - список редакторов Python
Слайд 6Индекс языков программирования
https://tiobe.com/tiobe-index/
Слайд 71. Введение
Python – язык высокого уровня
Синтаксис языка Python минималистический и
гибкий.
На нём можно составлять простые и эффективные программы.
Стандартная библиотека
для этого языка содержит множество полезных функций, что значительно облегчает процесс создания программ.
Язык Python поддерживает несколько парадигм программирования, включая структурное, объектно-ориентированное и функциональное программирование.
Слайд 8Применение Python
разработка сценариев для работы с Web и Intеnеt-приложений;
сетевое программирование;
средства
поддержка технологий HTML и XML;
приложения для работы с электронной почтой
и поддержки Intеmеt,
Протоколов приложения для обслуживания всевозможных баз данных;
программы для научных расчетов;
приложения с графическим интерфейсом;
создание игр и компьютерной графики,
Слайд 9Особенности Python
Python относится к интерпретируемым языкам программирования, т.е. код выполняется
с помощью специальной программы-интерпретатора.
Интерпретатор выполняет программный код построчно (с предварительным
анализом).
Иногда исходный программный код компилируется в промежуточный код, и этот промежуточный код выполняется непосредственно интерпретатором
Ошибки выявляются на этапе выполнения и скорость работы меньше, чем компилируемых языках.
Преимуществом является большая скорость разработки, т.к. меньше времени тратится на компиляцию
Слайд 10Реализации Python
Python – это спецификация для языка, которая может быть
реализована множеством разных способов
CPython (http://www.python.org) – базовая реализация Python, написанная
на языке С.
Stackless Python (https://bitbucket.org/stackless-dev/stackless/wiki/Home ) – это обычный вариант CPython
Эта версия языка имеет патч, отвязывающий интерпретатор Python от стека вызовов, что позволяет изменять порядок выполнения кода
Слайд 11Реализации Python (продолжение)
PyPy (http://pypy.org/ ) – это интерпретатор Python, реализованный
в ограниченном подмножестве статически типизированных языков Python (которое называется RPython),
что позволяет выполнить оптимизацию.
В данный момент PyPy быстрее CPython более чем в пять раз.
Слайд 12Jython
Jython (http://www.jython.org/ ) – реализация интерпретатора Python, компилирующая код Python
в байт-код Java, который затем выполняется JVM (Java Virtual Machine).
Дополнительно он может импортировать и использовать любой класс Java в качестве модуля Python
Jython в данный момент поддерживает версии Python вплоть до Python 2.7 (http://bit.ly/jython-supports-27 )
Слайд 13Python под .NET
IronPython (http://ironpython.net/ ) – это реализация Python для
фреймворка .NET. Она может использовать библиотеки, написанные как на Python,
так и с помощью .NET, а также предоставлять доступ к коду Python другим языкам фреймворка .NET.
IronPython поддерживает версию Python 2.7
PythonNet – (http://pythonnet.github.io/ ) – пакет, который предоставляет почти бесшовную интеграцию оригинально установленного Python и общеязыковой среды выполнения .NET.
Такой подход противоположен подходу, которым пользуется IronPython. Т.е. PythonNet и IronPython дополняют друг друга.
Слайд 14Прочие реализации
Skulpt (http://www.skulpt.org/ ) – реализация Python на JavaScript.
Skulpt
поддерживает большую часть функциональности версий Python 2.7 и Python 3.3.
MicroPython
(https://micropython.org/ ) –реализация Python 3, оптимизированная для микроконтроллеров. Поддерживает 32-битные процессоры ARM, имеющие набор инструкций Thumb v2.
Слайд 15Python в разных операционных системах
Поддержка Python уже установлена на большинстве
компьютеров Linux
Python в системах Windows и MacOS требует установки.
Требуется скачать
соответствующий пакет с http://python.org/download/ и установить его.
Для научных расчётов наиболее удобен дистрибутив «Anaconda» https://www.anaconda.com/download/
Примечание: Anaconda не любит, когда имя пользователя написано русскими буквами, поэтому придётся создать нового пользователя, в имени которого все буквы английские, и дальнейшую работу вести от имени этого пользователя.
Слайд 16Набор кода
Сам код набирается в любом текстовом редакторе, либо в
среде программирования.
Notepad++ (пример)
Слайд 17Проект "Jupyter"
Jupyter Notebook – командная оболочка для интерактивных вычислений. Может
использоваться не только с Python, но и с другими языками
программирования: Julia, R, Haskell и Ruby.
Часто используется для работы с данными, статистическим моделированием и машинным обучением.
Кроме того, это удобный инструмент для создания красивых аналитических отчетов, поскольку он позволяет хранить вместе код, изображения, комментарии, формулы и графики
Подробнее см.
http://devpractice.ru/python-lesson-6-work-in-jupyter-notebook/
https://tproger.ru/translations/jupyter-notebook-python-3/
https://habrahabr.ru/company/wunderfund/blog/316826/
http://jupyter.org/
Слайд 192. Интегрированные среды разработки
IDE: Интегрированная среда разработки (англ. Integrated Development
Environment)
PyCharm
PyDev
WingWare
Komodo IDE
Eric
Spyder
IDLE
P.S. …есть и другие
https://wiki.python.org/moin/IntegratedDevelopmentEnvironments
Komodo IDE
Слайд 20Среда программирования PyCharm
https://www.jetbrains.com/pycharm/
Создатель: JetBrains
Исходный код: Закрытый
ОС: Windows, Linux, MacOS
Возможности
интегрированного модульного тестирования, проверки кода, интегрированного контроля версий, инструменты переработки
(рефакторинга) кода, набор инструментов для навигации проекта, выделения и автоматического завершения. Поддержка ряда сторонних фреймворков для веб-разработки, таких как Django, Pyramid, web2py, Google App Engine и Flask
Слайд 21Среда программирования PyDev
http://www.pydev.org/
Плагин Python для Eclipse
Поддерживается всеми операционными системами
Источники находятся
в свободном доступе по публичной лицензии Eclipse
Обработка кода, интеграция отладки
Python, инструменты переработки кода и пр.
Возможность создания новых проектов Django, выполнение команд Django при помощи горячих клавиш и использование отдельной конфигурации запуска только для Django.
Слайд 22Среда программирования WingWare
https://wingware.com/
Создатель: WingWare
Исходный код: Закрытый
ОС: Windows, Linux, MacOS
Есть
мощный инструмент отладки, который позволяет устанавливать контрольные точки, возможность пошагового
выполнения кода, проверка данных, удалённая отладка и отладка шаблонов Django.
Поддержка matplotlib, с автоматическим обновлением графиков. Также предоставляется доработка кода, подсветка синтаксиса, исходный браузер, графический отладчик и поддержка систем управления версиями.
Слайд 23Среда программирования Komodo IDE
Создатель: ActiveState
Исходный код: Закрытый
ОС: Windows, Linux,
MacOS
Поддержка Django: подсветка синтаксиса и завершение кода для шаблонов.
Содержит
базовые функции, такие как переработку (рефакторинг) кода, автозаполнение, calltips (подсказки), сопоставление скобок, браузер кода, переход к определению, графическая отладка, многопроцессная отладка, многопоточная отладка, конфигурация точки остановки, профилирование кода, интеграция со сторонними библиотеками, такими как pyWin32.
Интеграция менеджера пакетов, отслеживание изменений, инструмент просмотра заметок, быстрые закладки, переход ко всему (Commando) и многое другое.
Слайд 24Eric IDE
https://eric-ide.python-projects.org/
Создатель: Detlev Offenbach
Исходный код: Открытый
ОС: Windows
Содержит отладчик
Python и Ruby, покрытие кода, автоматическая проверка кода, оболочку Python
и Ruby, браузер класса и пр.
Имеются функции для совместного редактирования. Диалоги Regex и Qt, опции для создания сторонних приложений в редакторе, диаграммы приложения, возможности управления проектами, и интерактивная оболочка Python.
Многоязычный пользовательский интерфейс, который включает в себя и русский
Контроль версии для Subversion, Mercurial и Git, использование объявлений в плагинах, и многое другое.
Слайд 25Конфигурирование IDE
Поскольку обновления Python выходят достаточно часто, при настройке среды
разработки важно указать путь к вашей текущей версии Python
Настройка пути
интерпретатора Python в pyCharm
Слайд 263. Основные понятия
Python Enhancement Proposals (PEP)
Одной из причин, почему код
Python прост для понимания, является наличие информативного руководстве по стилю
написания кода (представлено в двух Предложениях по развитию Python PEP 20 и PEP 8) и питонских идиомах.
Слайд 27PEP 8
Фактически представляет собой руководство по стилю написания кода
Python. Здесь рассматриваются
соглашения по именованию,
структура кода,
пустые области
(табуляция против пробелов)
и другие аналогичные темы.
Все сообщество Python старается следовать принципам, изложенным в этом документе.
С помощью программы pycodestyle (pep8)
(https://github.com/PyCQA/pycodestyle), которая запускается из командной строки, можно проверить код на соответствие принципам PEP 8.
Слайд 28PEP 20 – The Zen of Python
(https://www.python.org/dev/peps/pep-0020/ ) (набор принципов
для принятия решений в Python) всегда доступен по команде import
this в оболочке Python
Красивое лучше, чем уродливое.
Явное лучше, чем неявное.
Простое лучше, чем сложное.
Сложное лучше, чем запутанное.
Одноуровневое лучше, чем вложенное.
Разреженное лучше, чем плотное.
Читаемость имеет значение.
Особые случаи не настолько особые, чтобы нарушать правила.
При этом практичность важнее безупречности.
Ошибки никогда не должны замалчиваться.
Если не замалчиваются явно.
Встретив двусмысленность, отбросьте искушение угадать.
Должен существовать один – и желательно только один – очевидный способ сделать это.
Хотя он поначалу может быть и не очевиден, если вы не голландец.
Сейчас лучше, чем никогда.
Хотя никогда зачастую лучше, чем прямо сейчас.
Если реализацию сложно объяснить – идея плоха.
Если реализацию легко объяснить – идея, возможно, хороша.
Пространства имен – отличная штука! Будем делать их побольше!
Слайд 29Явное лучше чем неявное
Неявно передаются переменные (плохо!)
def make_dict(*args):
x, y = args
return dict(**locals())
Явно указываются
принимаемые и возвращаемые значения (хорошо!)
def make_dict(x, y):
return {'x': x, 'y': y}
Слайд 30Разреженное лучше, чем плотное
В каждой строке рекомендуется размещать только одно
выражение
print(' Так ' ); print('неверно')
print('Так ')
print('верно')
Неверно:
if ( and ):
<инструкции>
Верно:
cond1 = <условие1>
cond2 = <условие2>
if cond1 and cond2: <инструкции>
Слайд 31Философия Python сосредоточена во фразе
«Мы все – ответственные пользователи»
Любой
клиентский код может переопределить свойства и методы объекта. Однако сообщество
Python предпочитает полагаться на набор соглашений, которые указывают, к каким элементам нельзя получить доступ напрямую.
Основным соглашением для закрытых свойств и деталей реализации является обязательное добавление к именам подобных элементов нижнего подчеркивания (например, sys._getframe).
Если клиентский код в нарушение этого правила получает доступ к отмеченным элементам, то считается, что любое неверное поведение или проблемы вызваны именно клиентским кодом.
Слайд 32Структура программы
Программы делятся на модули.
Модули содержат инструкции.
Инструкции состоят из выражений.
Выражения
создают и обрабатывают объекты.
Синтаксис языка Python по сути построен на
инструкциях и выражениях. Выражения обрабатывают объекты и встраиваются в инструкции. Инструкции представляют собой более крупные логические блоки
Слайд 33Структура кода на Python
Python отличается от других языков тем, что
пробелы в нем используются для того, чтобы задать структуру программы.
Любая
программа более читаема, если её строки достаточно короткие. Рекомендуемая максимальная длина строки равна 80 символам
Формат инструкций:
<Основная инструкция>:
<Вложенный блок инструкций>
Конец строки является концом инструкции
Конец отступа – это конец блока
Перенос строки – символ "\"
См. Руководство для оформления программ на Python
Обычно на каждой строке располагается одна инструкция, но для большей компактности иногда можно записать несколько инструкций в одной строке, разделив их ";"
Слайд 34См. также
https://pythonworld.ru/osnovy/pep-8-rukovodstvo-po-napisaniyu-koda-na-python.html
https://www.calculate-linux.org/main/ru/python_style_guide
http://www.python.org/doc/essays/styleguide.html
Слайд 35Комментарии
Комментарии предназначены для вставки пояснений в текст программы, интерпретатор полностью
их игнорирует. Внутри комментария может располагаться любой текст, включая инструкции,
которые выполнять не следует.
# Пример комментария
S = 1 # и это комментарий
Слайд 36Начало файла
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
Это связано с переносимостью
скриптов. Путь к python на разных системах может отличаться, а
вот путь к env на всех системах неизменный. Поэтому, вызывая env и передавая ей в качестве аргумента нужный интерпретатор, можно быть уверенным, что скрипт будет запущен вне зависимости от того, где на самом деле находится интерпретатор (главное, чтобы он был в PATH).
Вторая строка показывает систему кодировки кода
Слайд 37Продолжение длинной строки
Если строка длиннее принятого в PEP8 значения (80)
то рекомендуется заключить элементы в круглые скобки. Если интерпретатор Python
встретит незакрытую круглую скобку в одной строке, он будет присоединять к ней следующие строки до нахождения закрытой скобки. То же поведение верно для фигурных и квадратных скобок
long_string = (
' Это длинная строка'
' с продолжением'
)
Примечание: по возможности следует избегать таких строк, чтобы не вредить читабельности
Слайд 38Временная переменная
Если необходимо присвоить какое-то значение, но сама переменная не
нужна, воспользуйтесь двойным подчеркиванием ( __ ).
Иногда рекомендуют для этих
целей использовать одинарное подчёркивание ( _ ), однако проблема в том, что оно зачастую применяется как псевдоним для функции gettext.gettext() и как интерактивное приглашение сохранить значение последней операции, что может вызвать перезапись этой переменной.
Слайд 394. Анализаторы кода
Поскольку в Python используется интерпретатор, а не компилятор,
то многие ошибки обнаруживаются уже в ходе выполнения.
Поэтому имеет
смысл использовать анализаторы кода.
Например
https://www.pylint.org/
https://pypi.python.org/pypi/pyflakes
PyLint можно интегрировать в IDE, такие как PyCharm и текстовые редакторы
Подробнее об анализаторах кода см.
https://python-scripts.com/code-analysis
Слайд 405. Модули
Один из основных уровней абстракции. Уровни абстракции позволяют программисту
разбивать код на части, которые содержат связанные данные и функциональность.
Импортирование
модуля производится командой import
Модули могут быть встроенными, сторонними и внутренними (пользовательскими).
Примеры встроенных модулей – os, sys.
Примеры сторонних пакетов в среде – Requests, NumPy
Пример:
import sys #Встроенный модуль
import matplotlib.pyplot as plt # Сторонний модуль
Слайд 41Примеры пользовательских модулей:
Модуль взаимодействия с пользователем
Модуль записи в файл
Модуль считывания
из файла
Модуль построения графиков
Управляющий модуль
Расчётный модуль
Модуль функций
Слайд 42Именование модулей
Модулям присваиваются короткие имена, которые начинаются со строчной буквы.
Не нужно использовать символы типа (.) или (?)
Также не следует
злоупотреблять (_), поскольку можно спутать с именем переменной
Слайд 43Рекомендации
Не используйте расширения имен файлов в инструкциях import и reload.
Не
указывайте полные пути к файлам и расширения в инструкциях import.
Например, следует писать import mod, а не import mod.py).
Слайд 44Упаковка
Python предоставляет достаточно понятную систему упаковки, которая расширяет механизм модулей
так, что он начинает работать с каталогами.
Любой каталог, содержащий файл
__init__.py, считается пакетом Python.
Каталог высшего уровня, в котором находится файл __init__.py, является корневым пакетом.
Разные модули пакетов импортируются аналогично простым модулям, но файл __init__.py при этом будет использован для сбора всех описаний на уровне пакета.
Признаком хорошего тона является поддержание файла __init__.py пустым, когда модули и подпакеты пакета не имеют общего кода.
Слайд 45Пакетирование модулей
Модули можно группировать по назначению и располагать в соответствующих
папках. Например:
sound/
Верхний уровень
__init__.py Инициализатор пакета
formats/ подпакет конверсии форматов
__init__.py
wavread.py
wavwrite.py
aiffread.py
effects/ Подпакет эффектов
__init__.py
echo.py
surround.py
reverse.py
filters/ Подпакет фильтров
__init__.py
equalizer.py
vocoder.py
karaoke.py
См. https://docs.python.org/3/tutorial/modules.html#packages
Слайд 46Импорт модулей из пакетов
Файл __init__.py нужен, чтобы показать, что папка
содержит модули. Сам файл может быть пустым, либо содержать инициализацию
переменной __all__ или код инициализации модулей
Импорт подмодуля: import sound.effects.echo
Обращение к нему: sound.effects.echo.echofilter (input, output, delay=0.5, atten=5)
Альтернативно: from sound.effects import echo
Обращение к нему: echo.echofilter (input, output, delay=0.5, atten=5)
Альтернативно: from sound.effects.echo import echofilter
Обращение к нему: echofilter(input, output, delay=0.5, atten=5)
Слайд 47Импорт модулей (продолжение)
Пусть в файле \effects\ __init__.py определена:
__all__ =
["echo", "surround", "reverse"]
Тогда
from sound.effects import *
импортирует все три названных подмодуля
Если
же не определить __all__ , тогда НЕ импортируются подмодули из sound.effects
Слайд 48Читаемость импортированных модулей
from modu import * #Непонятный код
x = sqrt(4) #Откуда что?
from
modu import sqrt #Импортируем
# конкретную функцию
x = sqrt(4)
import modu #
Импортируем модуль
x = modu.sqrt(4) # И ссылаемся на
# функцию sqrt внутри него
Слайд 49Импорт отдельных подмодулей
Из вышеприведённого примера можно импортировать отдельные подмодули в
sounds/effects/surround.py с использованием относительных путей:
#импорт sound/effects/echo.py
from . import echo
#импорт
sound/formats
from .. import formats
#импорт sound/filters/equalizer.py
from ..filters import equalizer
Слайд 50Структура, это главное
Следует избегать большого количества циклических зависимостей
Например, если файл
one.py зависит от файла two.py, который зависит от файла one.py,
то это может вызвать ошибку ImportError.
Избыточное использование глобального состояния или контекста
Например, вместо явной передачи данных используются глобальные переменные, которые модифицируются другими структурными единицами. Отследить, какие именно внесли критические изменения в такие переменные очень сложно.
Слайд 51Читабельность важнее скорости
Спагетти-код. Вложенные условия if, расположенные на нескольких страницах
подряд, и циклы for, содержащие большое количество скопированного текста.
Подробнее см.
https://habrahabr.ru/post/187154/
Равиоли-код состоит из множества небольших логических фрагментов, зачастую классов или объектов, которые не имеют хорошей структуры. Т.е. это чересчур мелкоструктурированный код.
Слайд 52ООП
В Python все элементы являются объектами и работают как объекты.
Функции являются объектами первого класса. Функции, классы, строки и даже
типы считаются в Python объектами: все они имеют тип, их можно передать как аргументы функций, они могут иметь методы и свойства.
Однако, в отличие от Java, в Python парадигма объектно-ориентированного программирования (ООП) не основная. Проект, написанный на Python, вполне может и не быть объектно-ориентированным
Слайд 53Функциональное программирование
Парадигма, которая в своей чистейшей форме не имеет операторов
присваивания и побочных эффектов и вызывает функции одну за другой,
чтобы выполнить задачу.
В Python имеются инструменты, которые позволяют заниматься функциональным программированием, хотя он не является чисто функциональным языком.
Подробнее с этим аспектом Python можно ознакомиться http://bit.ly/functional-programming-python
Слайд 546. Доступ к документации
Документ
Пуск>Программы (Все программы)>Python 3.x> Python 3.x Manuals.
Сервер
документов (откроется в браузере)
Пуск>Программы (Все программы)>Python 3.x> Python 3.x Module
Docs.
Там находятся страницы с описанием всех классов, функций и констант, объявленных в стандартных модулях
Чтобы завершить работу, следует переключиться в его окно, ввести команду q и нажать . А введенная там команда b повторно выведет страницу со списком модулей.
Оригинальную документацию онлайн см. https://docs.python.org/3/
Слайд 55Функция help
С помощью функции help() можно получить документацию по конкретной
функции и по всему модулю сразу.
Для вывода помощи по классу
str в модуле builtins набрать в консоли:
>>>help(str)
Cначала импортируем модуль
>>> import builtins
А затем выведем справку по нему
>>> help(builtins)
Слайд 56Строки документирования
для комментирования большого фрагмента кода используются утроенные кавычки или
утроенные апострофы. Такие строки не являются комментариями в полном смысле
этого слова. Вместо комментирования фрагмента создается объект строкового типа, который сохраняется в атрибуте __doc__.
Функция help() при составлении документации получает информацию из этого атрибута.
Слайд 57Пример документирования
# -*- coding: utf-8 -*-
"""описание модуля testd.py """
def func():
"""
Описание функции"""
pass
Подключаем модуль testd и выводим документацию:
# -*- coding: utf-8
-*-
import testd
help(testd)
Слайд 58Результат в консоли
Help on module testd:
NAME
testd - описание
модуля testd.py
FUNCTIONS
func()
Описание функции
FILE
c:\users\пользователь\pycharmprojects\modulestest01\testd.py
Слайд 59Атрибут __doc__:
import testd
print(testd.__doc__)
print(testd.func.__doc__)
Вывод:
описание модуля testd.py
Описание функции
Слайд 60Список всех атрибутов
Список всех атрибутов, имеющихся у любого объекта, можно
получить с помощью функции dir(X)
Например: print(dir(print)) выдаст
['__call__', '__class__', '__delattr__', '__dir__',
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__text_signature__']