1. Лекция 1

21 сентября 2018 г.

Заметили ошибку или есть предложение? Напишите на почту: romansdidnotcrucify@gmail.com

/!\ ACHTUNG! WORK IN PROGRESS! /!\

Данная страница ещё не закончена и находится в процессе дополнения и переработки. Почитать уже можно, но не забудьте потом заглянуть, когда будет полная версия.

Курс будет опираться на mustread учебник.

В основе предыдущего курса лежал официальный python tutorial.

Для тех, кому программирование в новинку, есть курс "Введение в программирование на Python".

2. История языка

2.1. Новое - это хорошо забытое старое

Бытующий, кажется, до сих пор миф, что python - это такой новый модный язык программирования, который захватывает мир, наполовину неверен. Питон, конечно, захватывает мир, и, конечно, модный, но он не очень новый.

История развития питона корнями уходит ещё в 80-ые годы. Гвидо Ван Россум [создатель языка] уже совсем немолодой человек ещё из поколения хакеров.

Гвидо участвовал в разработке обучающего языка ABC (конец 80-ых), а в какой-то момент решил создать язык полноценный. Так появился Python (названный в честь "Летающего цирка Монти Пайтона").

Пока Гвидо понемногу дорабатывал язык, питоном стали активно пользоваться. В 2000 году была выпущена уже совсем приличная версия Python 2.0, а в 2008 - версия Python 3.0, синтаксически отличная от версии 2.


2.2. Python 2 vs. Python 3

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

Основных причин для этого было две:

  1. Во втором питоне ещё оставался налёт "игрушечности", "обучательности";
  2. В нём было реализовано несколько неудачных архитектурных решений (в частности, объектная модель была немного странной).

В результате был выпущен Python 3, который является уже совсем индустриальным [т.е. заточенным под реальные прикладные задачи], и именно о нём мы и будем говорить.


2.3. Великодушный диктатор

Автором и бессменным руководителем проекта всё это время (вплоть до июля 2018 года) был Гвидо Ван Россум. Гвидо, imho, очень талантливый программист, в первую очередь на C; так что если кто хочет научиться программировать на C - смотрите исходники питона.

Всё это время Гвидо был BDFL (Benevolent Dictator For Life, "Великодушным пожизненным диктатором") проекта. Это означает, что все решения принимались коллегиально, но последнее слово всегда оставалось за Гвидо (что очень удобно при разрешении споров).

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


3. О языке в общих чертах

3.1. Питон - интерпретируемый язык

Языки программирования можно условно разбить на компилируемые и интерпретируемые. В компилируемых языках код программы нужно скомпилировать в т.н. исполняемый код. Этот код затем будет исполнять нечто, что ничего не знает про исходный язык программирования (даже если речь о языках, использующих JVM, не говоря уж о классических языках программирования вроде C).

В интерпретируемом же языке исполнителем является сама программа, которая анализирует исходный код. Python - интерпретируемый язык (и исполнителем кода на нём является программа под названием "python"). Из этого следуют несколько важных свойств.


3.1.1. Большинство ошибок возникает на этапе выполнения программы

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

Если же язык интерпретируемый, он обладает динамической семантикой (т.е. одни и те же команды могут значить разное в зависимости от состояния интерпретатора); поэтому на этапе синтаксического анализа вылавливаются только самые базовые ошибки. БОльшая же часть ошибок, как будет продемонстрировано, возникает во время выполнения программы.


3.1.2. Более гибкий и плотный код

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


3.2. Питон - высокоуровневый язык

Разница между высокоуровневыми и низкоуровневыми языками программирования состоит в том, насколько они ориентированы на конечный исполнитель. В низкоуровневых языках вроде C интеграция с исполнителем достаточно велика: вычислительная модель языка почти всегда совпадает с вычислительной моделью исполнителя (так, прямо в семантику C заложено: размер целого числа коррелирует с размером машинного слова; инкремент и декремент реализованы как соответствующие аппаратные инструкции и т.д.).

Высокоуровневые языки же полностью отгорожены от того фактического исполнителя, которого им подсунут. Их вычислительная модель герметична; код, написанный на Java или на Python, будет работать одинаково вне зависимости от того исполнителя, который находится внизу. Код на Python - кроссплатформенный, и может работать на всех известных ОС (и даже иногда без них).

Единственный случай, когда приходится вспоминать, на какой операционной системе выполняется код - когда приходится в нём обращаться непосредственно к ОС.


3.3. Типизация в Python

3.3.1. Строгая типизация

Типизация в питоне строгая. У каждого объекта есть один конкретный тип; не бывает так, что мы не знаем, какого типа объект, или что объект относится к некоторому "неопределённому типу", который будет разрешён впоследствии, или что у нас есть объекты некого "универсального" типа.


3.3.2. Динамическая типизация

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

Таким образом, объекты-то типизированные, а вот имена, они же идентификаторы, абсолютно не привязаны к типу.


3.3.3. Утиная типизация (duck typing)

Утиная типизация - строгая динамическая типизация, доведённая до крайности. Определяется она следующим простым правилом:

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


3.4. Питон - объектно-ориентированный язык

В питоне самая прозрачная и самая понятная объектная модель из всех, что я когда-либо видел. При этом она достаточно современная и достаточно мощная; поддерживает всякие штуки, связанные с объектным планированием.

Пожалуйста, не путайте: объектно-ориентированный язык - всего лишь язык, который поддерживает объектно-ориентированную парадигму планирования разработки. Никакой специальной "объектности" в самом языке, вообще говоря, нет. "Объектность" - это способ планирования вашей программы.

В питоне, однако, объектная модель лежит ещё и в основе организации языка (чуть позже мы увидим, что в питоне есть только объекты и методы, больше ничего).


3.5. Питон - динамически развивающийся язык

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

В язык постоянно добавляют разные новые штуки; пропустил пару анонсов, смотришь - а там уже что-то ещё новое придумали.

Активному развитию языка помогает большое и организованное сообщество разработчиков.


3.5.1. Немного о процессе нововведений

Сначала вносится предложение какого-нибудь изменения в язык. Делается это в виде PEP (Python Enhancement Proposal).

В PEP человек, желающий перемен, описывает:

  1. Что он хочет добавить;
  2. Зачем - с какими целями и почему раньше было плохо;
  3. И как он собирается это сделать.

После чего этот PEP обсуждается в сообществе, а потом приходит (приходил) Гвидо и всех банил и одобрял или не одобрял предложенные изменения.


3.5.2. NEVER STOP

Эти изменения могут происходить весьма спонтанно (кто-то что-то захотел сделать - сделал). Это накладывает на программиста на Питоне довольно интересную обязанность: быть всегда в тренде.

Если вы будете развиваться вместе с языком, у вас всегда будет хороший бэкграунд и хорошая возможность идти дальше.


3.5.3. Больше модулей!

Помимо самого языка, в который входят порядка 200 модулей (т.е. дополнений), есть ещё PyPI (Python Package Index), где на данный момент находится более 150000 готовых проектов. Мало того, что они там есть, так авторы ещё и потрудились встроить их в структуру PyPI, снабдили документацией и т.д.

Это не означает, что все эти проекты разрабатываются командами из 100500 участников - зачастую это работа одного человека - но, тем не менее, это

  1. живые проекты,
  2. исходный код которых доступен
  3. под свободной лицензией - и это важно!

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


3.5.4. Документация

В питоне с документацией всё довольно неплохо. На официальном сайте есть Tutorial, который я горячо рекомендую, есть справочник по питону (это такая настольная книга для программиста, которую надо читать долго и внимательно), а для тех, кто фанатеет от БНФов, есть Language Reference.

4. Интерпретатор командной строки

Запускаем интерпретатор python:

>>>python3

Он называется python3, потому что в linux много программ написано на python 2; они неохотно переходят на python 3 (либо не переходят совсем). Как правило, в linux-системах присутствуют оба питона: один из них называется python, другой - python3.

Интерпретатор командной строки устроен таким образом, что вы даёте какую-то команду, а интерпретатор на неё реагирует. Фактически это диалог человека и машины.

4.1. Как это устроено

На самом деле, здесь не два шага: запрос - ответ, а четыре:

  1. ввод команды;
  2. её лексический, затем - синтаксический разбор;
  3. её интерпретация;
  4. вывод результата.

5. Арифметика в Python

5.1. Основные операции

5.2. Длинная арифметика

5.3. Вещественные числа

5.4. Рациональные числа

5.5. Комплексные числа

6. Строки (кратко)

7. Кортежи (кратко)

8. Операции сравнения

9. Выражения

10. Связывание объектов

11. Квест!

Домашние задания публикуются на основной странице курса.

Очень рекомендуется читать учебник.

Главное домашнее задание - добыть себе Python и в него потыкать.

  1. Возможно, мы успеем поговорить про аннотации, и тогда станет ясно, почему "почти". (1)

LecturesCMC/PythonIntro2018/01_Commandline/Conspect (последним исправлял пользователь RomanKrivonogov 2018-10-08 13:31:41)