2.1. Теория

Язык Python является одним из самых простых в изучении и самых приятных в использовании из языков программирования, получивших широкое распространение. Программный код на языке Python легко читать и писать, и, будучи лаконичным, он не выглядит загадочным. Python - очень выразительный язык, позволяющий уместить приложение в меньшее количество строк, чем на это потребовалось бы в других языках, таких как C++ или Java.

2.1.1. История создания

Разработка языка Python была начата в конце 1980-х годов сотрудником голландского института CWI (Центр математики и информатики, голл. Centrum Wiskunde & Informatica) Гвидо ван Россумом (англ. Guido van Rossum), на основе языка ABC (Рисунок 2.1.1). В феврале 1991 года Гвидо опубликовал исходный текст в группе новостей alt.sources.

https://upload.wikimedia.org/wikipedia/commons/thumb/6/66/Guido_van_Rossum_OSCON_2006.jpg/320px-Guido_van_Rossum_OSCON_2006.jpg

Рисунок 2.1.1 - Гвидо ван Россум на конференции в 2006 г.

О создании Python Гвидо ван Россум написал в 1996 г.:

«Около 6 лет назад, в декабре 1989 г., я думал над проектом в области программирования в качестве хобби, которое бы заняло меня на время Рождественских выходных. Мой офис… был бы закрыл, но компьютер был и дома, и, в общем, это все, что у меня было на руках. Я решил написать интерпретатор для нового скриптового языка, о котором думал в последнее время: наследника ABC, который бы оказался привлекательным для Unix/C хакеров. Пилотное название «Питон» было выбрано с одной стороны в связи с немного скептическим отношением к перспективам проекта, а с другой - из-за того, что я большой фанат шоу «Летающий цирк Монти Пайтона».

В настоящее время Гвидо работает в компании Dropbox, покинув в декабре 2012 года корпорацию Google (2005-2012). Имея статус «великодушного пожизненного диктатора» проекта - он продолжает наблюдать за процессом разработки Python, принимая окончательные решения, когда это необходимо (не менее 50% рабочего времени по договоренности с DropBox).

Появившись сравнительно поздно, Python создавался под влиянием множества языков программирования. Так, например, влияние оказали такие языки, как:

  • ABC: отступы для группировки операторов, высокоуровневые структуры данных;
  • Modula-3: пакеты, модули;
  • С, C++: некоторые синтаксические конструкции;
  • Smalltalk: ООП;
  • Java: обработка исключений и др.

Большая часть других особенностей Python (например, байт-компиляция исходного кода) также была реализована ранее в других языках.

Развитие языка происходит согласно четко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP (Python Enhancement Proposal) — предложений по развитию Python.

В 2008 году, после длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используется сокращение Py3k). В Python 3000 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями Python. На сегодня поддерживаются обе ветви развития (Python 3.x и 2.x) (сравнение и рекомендации), однако получать новый функционал будет только версия 3 [6].

Ключевые вехи развития языка приведены в Таблице 2.1.1.

Таблица 2.1.1 - Основные вехи развития языка Python
Ветвь (дата выхода) Актуальная версия (дата выхода) (могла устареть)
Python 0.9.0 (1991-02) -
Python 0.9.0 (1991-02) -
Python 2.x (2000-10-16) Python 2.7.11 (2015-12-05)
Python 3.x (2008-12-03) Python 3.4.5 (2016-06-27)
  Python 3.5.2 (2016-06-27)
  Python 3.6.1 (2017-03-21)

На Видео 2.1.1 и 2.1.2 автор языка рассказывает об истории создания и развития Python (англ.).

Видео 2.1.1 - Guido van Rossum: The Early Years of Python

Видео 2.1.2 - Guido van Rossum: The Modern Era of Python

2.1.2. Особенности Python

Краткая карточка языка Python приведена в Таблице 2.1.2.

Таблица 2.1.2 - Карточка языка Python
Характеристика Значение
Автор Гвидо ван Россум и Python Software Foundation
Официальный сайт http://www.python.org/
Год создания 1991
Класс языка Императивный, функциональный, объектно-ориентированный
Тип исполнения Интерпретируемый, компилируемый в байт-код
Расширения файлов .py, .pyc и др.
Кодировка по умолчанию UTF-8
Основные реализации CPython (эталонная реализация), Jython, IronPython и др.
Операционная система Кроссплатформенное ПО
Лицензия Python Software Foundation License
Кто и для чего использует? [7] [8]
_images/02_01_01_i.png

Ряд особенностей выделяют Python среди прочих языков программирования.

  1. Простой и легкий в освоении.

    Python – простой и минималистичный язык, что дает возможность сосредоточиться на решении задачи, а не на самом языке.

  2. Свободный и открытый.

    Python – свободное и открытое программное обеспечение (Free/Libré and Open Source Sotware - FLOSS) [9].

    В основе свободного ПО лежит идея сообщества, которое делится своими знаниями; само движение руководствуется четырьмя принципами свободы:

    • программу можно свободно использовать с любой целью («нулевая свобода»);
    • можно изучать, как программа работает, и адаптировать её для своих целей («первая свобода») - условием этого является доступность исходного текста программы;
    • можно свободно распространять копии программы — в помощь товарищу («вторая свобода»).
    • программу можно свободно улучшать и публиковать свою улучшенную версию — с тем, чтобы принести пользу всему сообществу («третья свобода») - условием этой третьей свободы является доступность исходного текста программы и возможность внесения в него модификаций и исправлений.
  3. Расширяемый и встраиваемый.

    Python можно встраивать в программы на C/C++, чтобы предоставлять возможности написания сценариев их пользователям или для ускорения работы программы.

  4. «Заряженный».

    Python поставляется по принципу «все включено» (англ. Batteries Included) и имеет обширные возможности в стандартной библиотеке в дополнение к встроенным возможностям языка.

    Стандартная библиотека позволяет решать различные задачи, связанные с использованием регулярных выражений, генерацией документации, проверкой блоков кода, распараллеливанием процессов, базами данных, сетью Интернет, электронной почтой, криптографией, GUI (графическим интерфейсом пользователя) и другим системно-зависимым функционалом.

    В случае, если стандартной библиотеки недостаточно, существует множество других высококачественных библиотек, которые можно найти в Каталоге пакетов Python: https://pypi.python.org/pypi.

2.1.3. Дзен Python

Разработчики языка Python придерживаются определенной философии программирования, называемой «The Zen of Python» («Дзен Питона»). Автором дзена считается Тим Петерс (англ. Tim Peters) - один из разработчиков языка Python.

Текст дзена [10]:

  1. Красивое лучше, чем уродливое.
  2. Явное лучше, чем неявное.
  3. Простое лучше, чем сложное.
  4. Сложное лучше, чем запутанное.
  5. Плоское лучше, чем вложенное.
  6. Разреженное лучше, чем плотное.
  7. Читаемость имеет значение.
  8. Особые случаи не настолько особые, чтобы нарушать правила.
  9. При этом практичность важнее безупречности.
  10. Ошибки никогда не должны замалчиваться.
  11. Если не замалчиваются явно.
  12. Встретив двусмысленность, отбрось искушение угадать.
  13. Должен существовать один — и, желательно, только один — очевидный способ сделать это.
  14. Хотя он поначалу может быть и не очевиден, если вы не голландец.
  15. Сейчас лучше, чем никогда.
  16. Хотя никогда зачастую лучше, чем прямо сейчас.
  17. Если реализацию сложно объяснить — идея плоха.
  18. Если реализацию легко объяснить — идея, возможно, хороша.
  19. Пространства имен — отличная штука! Будем делать их побольше!

2.1.4. Структура Python-программ

2.1.4.1. Лексическая структура

Любая Python-программа состоит из последовательности лексем (допустимых символов), записанных в определенном порядке и по определенным правилам.

Лексемы включают в себя:

  • комментарии;
  • литералы;
  • знаки пунктуации;
  • идентификаторы;
  • ключевые слова.

Примечание

Рекомендуется ознакомиться с понятиями Формы Бэкуса — Наура, Расширенной формы Бэкуса — Наура и полной грамматикой языка Python в документации (Full Grammar specification).

2.1.4.1.1. Комментарии

Комментарии предназначены для пояснения кода для разработчика (Python их пропускает) и начинаются с символа #, действуя до конца строки (Листинг 2.1.1).

Листинг 2.1.1 - Пример комментариев
# Вся эта строка является комментарием
x = 5  # Это inline-комментарий (отступ 2 пробела)
y = '#Это строка'  # А это комментарий

Комментарии должны объяснять, почему что-то реализовано именно так и объяснять:

  • предположения, важные решения, важные детали;
  • проблемы, которые решает код;
  • проблемы, которых необходимо избежать и т.д.

2.1.4.1.2. Литералы

Литералы - значения, представленные в коде программы, например, числа или строки (Листинг 2.1.2).

Листинг 2.1.2 - Пример литералов
5         # Целочисленный литерал
3.4       # Литерал в виде числа с плавающей точкой
'строка'  # Строковый литерал

2.1.4.1.3. Знаки пунктуации

В алфавит Python входит достаточное количество знаков пунктуации, которые используются для различных целей. Например, знаки + или * могут использоваться для сложения и умножения, а знак запятой , - для разделения параметров функций.

2.1.4.1.4. Идентификаторы

Идентификатор - обычное имя, которое дается ссылке на какой-либо объект. Любой идентификатор имеет некоторые правила и соглашения наименования:

  • правила:

    • может состоять из букв (ASCII или Unicode), знаков подчеркивания _ или цифр 0-9;
    • цифра не может быть на первом месте;
    • чувствителен к регистру: UserName, username и USERNAME - разные идентификаторы;
    • не должен совпадать с каким-либо из ключевых слов языка Python (Листинг 2.1.4);
  • соглашения:

    • использовать змеиный_регистр (англ. snake_case): customer_account;
    • не использовать предопределенные имена (Листинг 2.1.3);
    • не использовать 2 знака подчеркивания __ в начале и конце, и _ или __ в начале идентификатора; данный синтаксис имеет специальное назначение.

Стиль наименования определяется документом PEP 8, который содержит общие стандарты стилевого оформления.

Листинг 2.1.3 - Некоторые предопределенные имена в Python
# В языке Python имеется встроенная функция dir(), которая
# возвращает список атрибутов объекта. Если эта функция вызывается
# без аргументов, она возвращает список встроенных атрибутов
>>> dir()
['__builtins__', '__doc__', '__name__']

# Атрибут builtins в действительности является модулем, в котором
# определены все встроенные атрибуты языка Python. Его можно
# использовать в качестве аргумента функции dir():
>>> dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError',
 ...
 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

Примеры имен идентификаторов:

Допустимые Недопустимые
  • i
  • my_name
  • name_23
  • a1b2_c3
  • любые_символы_utf8_üöäß
  • 2things
  • здесь есть пробелы
  • >a1b2_c3
  • "это_в_кавычках"

2.1.4.1.5. Ключевые слова

Некоторые слова имеют в Python специальное назначение и представляют собой управляющие конструкции языка. Список ключевых слов приведен в Листинге 2.1.4.

Листинг 2.1.4 - Ключевые слова в Python
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue',
 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global',
 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass',
 'raise', 'return', 'try', 'while', 'with', 'yield']

2.1.4.2. Синтаксическая структура

Для составления программы необходимо объединить лексемы в синтаксические конструкции. Примеры конструкций приведены в Листинге 2.1.5.

Листинг 2.1.5 - Примеры синтаксических конструкций в Python
# 1. Простейшие синтаксические конструкции - литералы

# простые
5  # Литерал - целое число
'это строка'  # Литерал - строка

# составные
[1, 2, 3]  # Литерал - список чисел

# с использованием знаков операций
x = 1   # Присваивание
y += 1  # Увеличение на 1

# 2. Операторы
if x > 10:  # Если выражение истинно
    x += 1  # Увеличить x на 1

Синтаксические конструкции могут вкладываться друг в друга (выполняться внутри других конструкций, принадлежать им), образуя блочную структуру. Блок кода начинается двоеточием :, а тело блока выделяется обязательным отступом в виде 4-х пробелов (Листинг 2.1.6).

Листинг 2.1.6 - Пример вложенных блоков кода в Python
if show_table:                # Блок условия
    for i in range(10):       # Блок for внутри if
        for j in range(9):    # Вложенный блок for
            print(i, j, i*j)  # Тело вложенного блока for

2.1.4.3. Составные элементы Python-программы

Python относится к языкам, разделяющим идею методологии структурного программирования, в основе которой лежит представление программы в виде иерархической структуры блоков.

Блоки в свою очередь могут состоять из элементов или из таких же блоков. Блоки, выделяемые в Python, представлены в Таблице 2.1.3.

Таблица 2.1.3 - Элементы и блоки в Python
Наименование блока Описание
1 Последовательность (инструкция) Любое атомарное действие, например, присваивание
2 Ветвление (условие) Выполнение инструкций в зависимости от определенного условия
3 Цикл Многократное исполнение набора инструкций
4 Подпрограмма (процедура/функция) Часть компьютерной программы, содержащая описание определенного набора инструкций, которая может быть многократно вызвана из разных частей программы. Может содержать (1)-(3)
5 Класс Абстрактный тип данных в объектно-ориентированном программировании, задающий общее поведение для группы объектов; модель объекта. Может содержать (1)-(4)
6 Модуль Функционально законченный фрагмент программы, оформленный в виде отдельного файла с исходным кодом или поименованной непрерывной ее части. Может содержать (1)-(5)
7 Пакет Логически законченная совокупность модулей как единое целое

На Рисунке 2.1.2 приведено визуальное обозначение блоков.

_images/02_01_02.png

Рисунок 2.1.2 - Блоки кода в Python

Примечание

Методологию структурного программирования предложил известный нидерландский ученый Эдсгер Дейкстра еще в 1968 г. и она до сих пор не теряет актуальности.

Обязательно ознакомьтесь с принципами структурного программирования - следование им позволит сделать код лаконичным и лишенным многих проблем, особенно, когда он перестанет быть просто учебным заданием.

2.1.4.4. Структура файла и кодировка программы

Программный код на языке Python можно записать в любом простом текстовом редакторе, который способен загружать и сохранять текст либо в кодировке ASCII, либо UTF-8. По умолчанию предполагается, что файлы с программным кодом на языке Python сохраняются в кодировке UTF-8 - надмножестве кодировки ASCII, с помощью которой можно представить практически любой символ любого национального алфавита. Файлы с программным кодом на языке Python обычно имеют расширение .ру.

В начале файла также допускается, но не рекомендуется указывать отдельной строкой кодировку отличную от UTF-8, например # coding: cp-1251.

Не рекомендуется также делать размер строки кода больше 80 символов (такую программу удобно просматривать и при необходимости распечатать - в большинстве редакторов для этого специально предусмотрена визуальная вертикальная полоса). Если строка все же не умещается в это ограничение, необходимо выполнить перенос строки (Листинг 2.1.7).

Листинг 2.1.7 - Перенос длинной строки в Python
# Для переноса строки используется обратный слеш \
# Это указывает на явный перенос строки
>>> "Это строка, " \
... "а это ее продолжение"
'Это строка, а это ее продолжение'

# При этом, если была открыта какая-либо скобка ( [ {,
# обратный слеш при переносе можно не ставить - Python поймет все сам
>>> a = [1, 2, 3,
... 4, 5, 6, 7, 8, 9, 10]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Также следует соблюдать PEP 8:

  • использовать отступ в 4 пробела, а не табуляцию;

  • когда возможно, оставлять комментарии в отдельной строке;

  • использовать пробелы вокруг операторов и после запятой, но не непосредственно внутри конструкции скобок:

    a = f(1, 2) + g(3, 4)
    
  • не использовать редкие кодировки и не-ASCII символы в идентификаторах, если есть шанс, что люди, говорящие на другом языке, будут читать или поддерживать код.

Примечание

После установки flake8 в Практикуме №2, проверка соблюдения подавляющего большинства правил будет осуществляться автоматически.

2.1.5. Выполнение Python-программ

Для выполнения программы, написанной на языке Python, требуется установленный интерпретатор.

2.1.5.1. Установка и запуск Python

В операционных системах Маc или других UNIX-подобных системах Python, как правило, уже установлен. Проверить это можно, введя команду python -V.

В ряде случаев в ОС установлены 2 версии Python - 2.X и 3.X. - тогда команду python следует заменять на python3.

Установка Python рассмотрена отдельно в Практикуме.

Для запуска интерпретатора Python необходимо набрать python в терминале операционной системы (Рисунок 2.1.3).

_images/02_01_03.png

Рисунок 2.1.3 - Запуск интерпретатора Python

Python предоставляет 2 способа написания программы:

  • интерактивный режим: позволяет организовать диалог между разработчиком/пользователем и терминалом, отображая результат обработки каждой команды (Рисунок 2.1.4);
  • режим запуска файла: выполняет файл с исходным текстом программы целиком (Рисунок 2.1.5).
_images/02_01_04.png

Рисунок 2.1.4 - Интерактивный режим работы с интерпретатором

_images/02_01_05.png

Рисунок 2.1.5 - Запуск файла с исходным текстом программы

В дистрибутив Python также входит интегрированная среда разработки IDLE, предоставляющая не только возможность работы, как в интерактивном режиме, так и в качестве текстового редактора, но и ряд других возможностей. На Рисунке 2.1.6 приведен пример работы с IDLE.

_images/02_01_06.png

Рисунок 2.1.6 - Написание программы в IDLE

Примечание

Какой режим использовать?

Интерактивный режим удобно использовать в случае, если необходимо быстро протестировать небольшой блок кода или даже использовать как калькулятор с большим набором функций. В остальных случаях целесообразнее использовать IDE.

2.1.5.2. Установка IDE

Для Python существует множество IDE, предоставляющих удобные средства написания, запуска и отладки приложений. Среди профессиональных сред стоит отметить PyCharm, Wing IDE и PyDev.

В качестве IDE в настоящем курсе используется (достаточно выбрать одну):

  • Atom: бесплатный текстовый редактор с открытым исходным кодом для Windows, macOS и Linux (Рисунок 2.1.7);
  • Geany: свободная, кроссплатформенная, легковесная и русифицированная среда разработки программного обеспечения (Рисунок 2.1.8).

С приобретением достаточных навыков разработки и увеличением сложности рассматриваемых программ имеет смысл переход на одну профессиональных IDE, отмеченных выше.

_images/02_01_07.png

Рисунок 2.1.7 - Главное окно Atom

_images/02_01_08.png

Рисунок 2.1.8 - Главное окно Geany

Установка, а также настройка Atom и Geany рассмотрены в Практикуме.


[1]Sebesta, W.S Concepts of Programming languages. 10E; ISBN 978-0133943023.
[2]Python - официальный сайт. URL: https://www.python.org/.
[3]Python - FAQ. URL: https://docs.python.org/3/faq/programming.html.
[4]Саммерфилд М. Программирование на Python 3. Подробное руководство. — М.: Символ-Плюс, 2009. — 608 с.: ISBN: 978-5-93286-161-5.
[5]Лучано Рамальо. Python. К вершинам мастерства. — М.: ДМК Пресс , 2016. — 768 с.: ISBN: 978-5-97060-384-0, 978-1-491-94600-8.
[6]PEP 404 – Python 2.8 Un-release Schedule (почему Python 2.8 никогда не будет). URL: https://www.python.org/dev/peps/pep-0404/.
[7]ПО, написанное на Python. URL: https://en.wikipedia.org/wiki/List_of_Python_software.
[8]Организации, использующие Python. URL: https://wiki.python.org/moin/OrganizationsUsingPython.
[9]Р. Столмен. FLOSS и FOSS. URL: http://www.gnu.org/philosophy/floss-and-foss.ru.html.
[10]PEP 20 – The Zen of Python. URL: https://www.python.org/dev/peps/pep-0020/.