Командная строка и объекты
Интерпретатор командной строки
- Командная строка как общий принцип интерфейса
- Диалог «команда — ответ…» (aka REPL)
- Точнее: ввод → синтаксический анализ → интерпретация → вывод → …
- Совмещение потока данных и потока управления
- Редактор: подсказка, история, достраивание, поиск по истории
- Диалог «команда — ответ…» (aka REPL)
- Python:
- Синтаксические ошибки / ошибки времени выполнения
Объекты и выражения с ними
- Целые, вещественные и комплексные числа
- длинные целые
- проблема представления вещественных
забегая вперёд: fractions.Decimal: и fractions.Fraction
- Строки
- Кортежи
Идентификатор объекта (id())
операции in и is (когда == не равно is)
Типы, type(), преобразование типов
- Типы — это объекты
- Функции
Функция в Python — это именованная запись алгоритма (подпрограмма)
- Функции — это тоже просто объекты
Связывание объектов
- Создание и удаление объектов при интерпретации команд
Все перечисленные объекты — константные
- Связывание объектов именами, чтобы не удалились
- Множественное связывание (многоместное и распаковкой последовательности)
- Функция, которая «возвращает много значений»
- Модифицируемые объекты — списки, словари, множества (беглый обзор)
- Связывание объектов ссылками из кортежей (и других составных типов)
- (забегая вперёд) Отличие связывания от присваивания на примере списков
Неявная динамическая строгая типизация: типизация объектов, но не имён
Конструкции вида «+=» и вообще «∀=» для любых операций (см. simple_stmts.html)
Нечто про моржа
Операция (а не выделенный оператор) связывания: «:=», см pep-0572
Называется «walrus operator»
- основное применение (здравствуй, Си!): Переключить отображение номеров строк
1 while chunk := fp.read(200): 2 print(chunk)
- Но не только!
Кеш, треш и изоляция
Связывание и refcount:
- Как кешируются объекты? (а нужно ли это знать)
TODO Есть подозрение, что в 3.14 будет не так
но
- Переключить отображение номеров строк
1 >>> a, b = 92, 92 2 >>> c = 92 3 >>> a is b is c 4 True
- проблема кольцевых изолированных пространств имён Переключить отображение номеров строк
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
Переключить отображение номеров строк1 >>> import gc 2 >>> gc.disable() 3 >>> gc.set_debug(gc.DEBUG_LEAK) 4 >>> a = [1,.2,3]; a[1] = a 5 >>> a 6 [1, [...], 3] 7 >>> hex(id(a)) 8 '0x7f699e930800' 9 >>> del a 10 >>> gc.collect() 11 gc: collectable <list 0x7f699e930800> 12 1 13 >>> gc.garbage 14 [[1, [...], 3]]
Как посмотреть все ссылки на объект: gc.get_referrers()
Д/З
Прочитать и отщёлкать appetite.html, interpreter.html и introduction.html
- Добыть на рабочем компьютере
Python (желательно 3.11, к ноябрю — обязательно 3.11+)
Редактор, в котором можно писать программы (idle есть почти всегда, например, в дистрибутивах ALT Linux он лежит в пакете python3-tools и называется idle3)
Монстры типа WingIDE, PyCharm или Komodo не рекомендуются, но и не запрещаются
- Написать и запустить программу из файла, в котором написано:
- Переключить отображение номеров строк
1 print("QQ")
Для новоприбывших на спецкурс
Часть прошлого Д/З
Зарегистрироваться на факультетском EJudge (это же и регистрация на С/К)
- не забыть представиться (ФИО и группа в поле «имя»)!
(для тех, кто не успел в прошлый раз)
EJudge: HelloWorld 'Hello World'
Написать программу, которая выводит строку Hello, world (в точности)
(ввод не нужен)
Hello, world
В следующий раз практическая часть Д/З уже будет более настоящей!