Python

Маленькая книга о Python #

Чем плох Python? #

Чем хорош Python, общеизвестно. Лаконичность, стандартизация, огромная стандартная библиотека и еще большее количество внешнего кода с невероятно высоким уровнем повторного использования - все это известно буквально каждому, кто имеет отношение к индустрии программного кода. А вот чем он плох?

В Python все не то, чем кажется. Чем больше вы будете узнавать язык, тем сильнее будет это ощущение. Типы данных, выражения, функции, объекты - все похоже на настоящее, они выглядят и работают так, как должны. Но это обман, внутри все работает совершенно не так, как кажется.

Язык и интерпретатор #

Интерпретатор - это программа, умеющая выполнять программы на языке программирования. Реальная, конкретная программа для вашей операционной системы (Windows, Linux, macOS…). А язык - это абстрактный набор инструкций для написания программ для интерпретатора.

Возможности интерпретатора гораздо шире того, что предлагает сам язык программирования. В них входит огромное количество написанных на Python и С программ, к которым можно обращаться из вашей программы. Они образуют стандартную библиотеку. Стандартная она потому, что она входит в состав интерпретатора и всегда доступна. Есть и внешние библиотеки, которые можно устанавливать отдельно и использоваться так же, как и стандартную. Большая часть того, что называется языком программирования Python - это сравнительно небольшой язык и очень, очень большая библиотека. Именно поэтому создается впечатление большого и сложного языка. Обманчивое впечатление - язык прост и до лаконичного компактен, а вот библиотеки, главное его богатство, способны дать фору любому другому языку. Исключая, разве что, Java c ее многотомными спецификациями.

Интерактивный режим #

Как и многие другие, интерпретатор Python может работать в интерактивном режиме. Инструкции пользователя вводятся непосредственно с клавиатуры, а интерпретатор их немедленно выполняет и возвращает результат, если он есть.

$ python
Python 3.8.3 (default, May 17 2020, 18:15:42) 
[GCC 10.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

Символы >>> в начале строки это приглашение интерактивного интерпретатора.

>>> 2+2*2
6
>>>

Чуть сложнее калькулятора.

Пакетный режим #

Однако, главная задача интерпретатора это выполнение заранее написанных программ. Поэтому самое время озадачиться инструментами для их написания. Сойдет любой текстовый редактор - vi, nano, notepad. Это, конечно, экстремальный выбор. Лучше воспользоваться “программистскими редакторами”, а еще лучше - специальной средой разработки.

Если у вас еще нет своего мнения о подходящем инструменте, взгляните в сторону PyCharm от JetBrains (она доступна бесплатно в сommunity-версии) и потратьте время на ее освоение - установите, настройте, напишите первую программу и пройдите ее в интерактивном отладчике.

Первая программа #

Те, кто говорит о бесполезности классической “первой программы”, упускают главное ее предназначение - убедиться, что среда разработки настроена правильно. Чтобы дальше уже не отвлекаться от непосредственно программирования.

print("Hello, World!") # просто и лаконично

Сохраните этот текст в файл hello.py и передайте его интерпретатору в качестве параметра.

$ python hello.py
Hello, world!
$

Создать и выполнить программу можно и не покидая среды разработки, но это детали, в которых вы сами разберетесь (надеюсь!).

Путь пингвина #

Под “пингвином” имеется в виду Linux, который позволяет указывать интерпретатор в первой строке программы при помощи символов #!

#!/usr/bin/env python
print("Hello, world!")

Сохраните этот текст в файл, предоставьте права на выполнение и запускайте:

$ chmod +x hello.py
$./hello.py
Hello, world!
$

Первая строка программы с точки зрения Python - бесполезный комментарий, а вот командный интерпретатор Linux поймет, что надо запустить интерпретатор и передать ему файл на исполнение. Это традиционный для Linux способ выполнять сценарии не уникален для Python - так работают сценарии на любом другом интерпретируемом языке (Perl, Lua и так далее).

В Windows это, само собой, работать не будет. Создавайте cmd- или bat-файлы.

C:\> echo print("Hello, world!") > hello.py
C:\> echo python hello.py > hello.bat
C:\> hello
Hello, world!

Комментарии #

Как можно догадаться, знак # используется для комментариев. Все, что находится справа от него, интерпретатором игнорируется. И пишется, строго говоря, не для него, а для вас - человека, который будет читать код. Например, для того, чтобы объяснить, что здесь происходит.

# Это однострочный комментарий
# Многострочных комментариев в Python нет
"""
Даже если вы их увидите, не верьте своим глазам
Это не комментарий и совсем скоро вы поймете, в чем здесь фокус
"""

Немного теории #

Интерпретатор Python является автоматом. В математике автоматом называется исполнитель, обладающий состоянием и поведением. Состояние автомата это совокупность всех данных, которыми он оперирует, а поведение - набор действий, которые он способен выполнять. Так же у автомата есть ввод и вывод - через них он получает инструкции для выполнение действий и возвращает результат выполнения этих действий. При выполнении этих действий автомат переходит из одного состояния в другое появления, модификации или исчезновения внутри него тех или иных данных.

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

Память #

Данные хранятся в оперативной памяти. Нам не надо знать, как именно они там хранятся. Потому, что Python оперирует объектами.

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

Объекты #

В Python объектами является все. Числа, строки, функции - вообще все.

Объект вообще - это абстрактная философская сущность, обладающая состоянием. И вот эта абстракция имеет какое-то внутреннее представление и хранится где-то в памяти компьютера. Эти “какое-то” и “где-то” для каждого объекта свои собственные.

Классы #

Будучи объектами, числа по своим свойствам все же отличаются от строк. Более того - целые числа отличаются от дробных, не говоря уже о комплексных. Целые числа можно складывать и умножать, но нельзя делить - эти операции выполняются только с дробными числами (строго говоря, они называются вещественными). Умножить строку на число можно, но результат будет слегка… необычным.

Литерал #

Способ записи данных называется литералом. Всякий раз, когда интерпретатор встречает литерал, создается объект и сохраняется в памяти. Тип данных, то есть способ его хранения, интерпретатор определяет по форма записи. Например, ответ на “Главный вопрос жизни, Вселенной и вообще” может быть записан в виде литерала 42, состоящего только из цифр, и это приведет к появлению объекта класса “целое число”. Запись 42.0 с десятичной точкой вернет нам объект класса “вещественное число” с совершенно другим внутренним представлением в памяти. А уж литерал "42", где числа заключены в кавычки, создаст объект класса “строка” с совершенно другими свойствами. При помощи литерала 42+0j вы даже можете сохранить это значение в виде комплексного числа (с нулевой мнимой частью). Работа с комплексными числами по какой-то непонятной причине встроена в язык на уровне синтаксиса.

Для списков, словарей, матриц, объектов и функций есть свои литералы. Главное, что нужно знать о литералах - это запись, приводящая к созданию объекта нужного класса.

Имена #

При создании объекты сохраняются в памяти.

Пространство имен #

Управление памятью #

Семантический сахар? #

здесь дописать про int(“42”, 33) - от 2 до 36

Функции? #

Управление потоком? #

Условия? #

Циклы? #

Исключения? #

Декомпозиция? #

Функции? #

Модули? #

Пакеты? #

Объекты? #

Библиотека? #