Командная строка и объекты
Интерпретатор командной строки
- Командная строка как общий принцип интерфейса
- Диалог «команда — ответ…» (aka REPL)
- Точнее: ввод → синтаксический анализ → интерпретация → вывод → …
- Совмещение потока данных и потока управления
- Редактор: подсказка, история, достраивание, поиск по истории
- Диалог «команда — ответ…» (aka REPL)
- Python:
- Синтаксические ошибки / ошибки времени выполнения
Другие реализации: исходный Python написан на Си
Brython — Python в броузере, написан на JS
PyPy, написан на… Python!
Встроенные: pocketpy, MicroPython, …
- …
Объекты и выражения с ними
- Целые, вещественные и комплексные числа
- длинные целые
- проблема представления вещественных
забегая вперёд: fractions.Decimal: и fractions.Fraction
- Строки
- Кортежи
Идентификатор объекта (id())
операции in и is (когда == не равно is)
Типы, type(), явное преобразование типов как конструктор
Типы — это объекты: type(9)("00531")
- Функции
Функция в Python — это именованная запись алгоритма (подпрограмма)
- Функции — это тоже просто объекты; пример — список функций
Связывание объектов
- Создание и удаление объектов при интерпретации команд
Все перечисленные в предыдущем разделе объекты — константные
- Связывание объектов именами, чтобы не удалились
- Множественное связывание (многоместное и распаковкой последовательности)
- Функция, которая «возвращает много значений»
- Модифицируемые объекты — списки, словари, множества (беглый обзор)
- Связывание объектов ссылками из кортежей (и других составных типов)
- (забегая вперёд) Отличие связывания от присваивания на примере списков
Неявная динамическая строгая типизация: типизация объектов, но не имён:
213 + "123" — не заработает никогда;
A + B — заработает, если у A есть метод .__add__(), который умеет работать с объектами типа B
Если не вышло, можно наоборот — у B есть метод .__radd__(), который умеет работать с объектами типа A
Конструкции вида «+=» и вообще «∀=» для любых операций (см. simple_stmts.html)
Нечто про моржа
Операция (а не выделенный оператор) связывания: «:=», см pep-0572
Называется «walrus operator»
- основное применение (здравствуй, Си!):
- Но не только!
Кеш, треш и изоляция
Связывание и refcount:
- Как кешируются объекты? (а нужно ли это знать?)
Уже в 3.13.7 будет не так (id(c) в первой строчке будет другим)
но
- проблема кольцевых изолированных пространств имён
1 >>> a = [1, 2, "QQ"]; b = [a, 4]; a[1] = b 2 >>> a 3 [1, [[...], 4], 'QQ'] 4 >>> b 5 [[1, [...], 'QQ'], 4] 6 >>> a[1] is b 7 True 8 >>> b[0] is a 9 True 10 >>> c = a, b 11 >>> import sys 12 >>> sys.getrefcount(a) 13 4 14 >>> sys.getrefcount(c[0]) 15 4 16 >>> del a, b 17 >>> sys.getrefcount(c[0]) 18 3 19 >>> sys.getrefcount(c[1]) 20 3 21 >>> del c
Нечто про gc
Как посмотреть все ссылки на объект: gc.get_referrers()
Д/З
Прочитать и отщёлкать appetite.html, interpreter.html и introduction.html
- Добыть на рабочем компьютере
Python (не ниже 3.11, желательно 3.12, можно больше
Редактор, в котором можно писать программы (idle есть почти всегда, например, в дистрибутивах ALT Linux он лежит в пакете python3-tools и называется idle3)
Монстры типа Spyder, WingIDE, PyCharm или VSCode не рекомендуются, но и не запрещаются
- Написать и запустить программу из файла, в котором написано:
1 print("QQ")
Для новоприбывших на спецкурс
Часть прошлого Д/З
Зарегистрироваться на факультетском EJudge (это же и регистрация на С/К)
- не забыть представиться (ФИО и группа в поле «имя»)!
(для тех, кто не успел в прошлый раз)
EJudge: HelloWorld 'Hello World'
Написать программу, которая выводит строку Hello, world (в точности)
(ввод не нужен)
Hello, world
В следующий раз практическая часть Д/З уже будет более настоящей!