Функции и генераторы; словари, множества; строки
Остатки от прошлой лекции
Интерактивная HTML-документация
Скалярные типы данных
- Целые и длинные целые
- Вещественные и комплексные числа
о несуществовании вещественных чисел в цифровых ЭВМ (2.2 + 3.3)
⇒ модули decimal.html, fractions.ahtml
Булевский и типы-объекты (None, NotImplemented, Ellipsis и т. п.)
BTW: модуль random и его возможности
Последовательности
(в основном были на прошлом занятии)
- Кортежи (константные списки)
- со скобками и без, с запятой в конце и без неё
кортеж в левой части присваивания и цикла for
- секционирование последовательностей на примере кортежей
- отрицательные значения и умолчания
методы: count и index; функция len(), операция in
- перечисления и многоточие (Ellipsis) — для пользовательских объектов
- Списки
принципиальное отличие изменяемых структур от неизменяемых: non-hashable, скорость?
- секция в левой части присваивания
методы append/pop/extend; insert/remove; reverse/sort
- выражение-генератор списка
вложенное выражение-генератор (например, [x*y for x in xrange(5) for y in xrange(x)])
xrange, enumerate
Строки
двойственная сущность строки как константной последовательности однобуквенных строк же (.index(), .count(), in и т. п. работают по подстрокам)
- четыре способа закавычить строку
- Строковые методы
- Полезные и не очень (обзор)
Разбор ввода и склейка вывода с помощью .split() и .join()
управляющие символы и модификатор r"
Форматирование строки с помощью .format()
Старый C-like стиль: строка%послдедовательность
- Кодировка, строки, u-строки и их преобразование
однобайтовый UTF в Python2
chr()/ord()
unicode() (нужна кодировка), обратное (используется LOCALE)
# coding: UTF в файле
Другой тип данных:
bytearray, список однобайтовых целых, он же изменяемая строка
Множества
set() и frozenset()
- Выражение-генератор множества
Словари
- Хешируемые объекты и (видимо) поиск по хешу ⇒ хеш == индекс словаря
- ⇒ не требуется сохранение порядка
- Задание словаря
в виде {ключ:значение, …}
в виде циклического конструктора типа {выражение:выражение for имя in последовательность}
с помощью именованных параметров функции: dict(key=val, …) (см. далее)
из списка пар dict(список_пар)
BTW: функции zip() и enumerate()
Dict[key] и Dict[key]=значение: автодобавление ключа
итератор и проверка in по ключу
keys()/values()/items()
BTW типы view<что-нибудь>, например, viewkeys() (поддерживает алгебру множеств)
pop(), popitem(); update(), get() и sedtefault()
JT: В питоне вообще много сделано на словарях
Функции
JT: «Побочный эффект» — ересь, мелочь или строгая теория?
Вызываемый объект «fun(arg1, arg2, ...) is a shorthand for fun.__call__(arg1, arg2, ...)»
Передача по ссылке (википедия: по соиспользованию)
- Отсутствие проверки вплоть до вызова (динамическая типизация)
- Пространство имён и локальные переменные
Локальность переменных (по первой встрече в LHS или RHS), global
- Умолчания для параметров (присваивание во время определения) и пропуск параметров
- ⇒ Позиционные и именованные параметры
- Строки документации
Функции-выражения (lambda)
JT: Краешек бездны: функционалы
Краешек оврага: «таблицы эмуляции» и передача функции в качестве параметра (например, sorted()/max() и cmp()/key())
- Свёртка позиционных и именованных параметров
* и ** в списке формальных параметров
* и ** при вызове функции
- ⇒ переменное количество параметров
⇒ произвольные именованные параметры
Рекурсия. Оценка необходимости рекурсии. Гвидо и хвостовая рекурсия.
Неявная динамическая типизация в Python
- Любые функции (методы) применимы к любым объектам
- Если в процессе выполнения происходит обращение к несуществующему объекту (полю), активизируется исключение
- Проверка существования объекта (поля) происходит в момент обращения к енму
- Все операции над объектами (типа +, [ , () и т. п.) — спецметоды объектов
Генераторы
Объекты-итераторы iter() из коллекции (.__iter__()) или из последовательности (.__getitem__())
.next() и StopIteration
Работа цикла for
- Выражения-генераторы: для цикла лучше списков, но «одноразовые, что твои спорт-байкеры»
Генераторы: функции с yield вместо return
Параметрические: .send(par) вместо .next() ( ⇒ par = yield)
Управление: .close() и .throw(исключение)
⇒ JT: Отложенные вычисления и… «побочный эффект»
Д/З
TODO
- Прочитать и прощёлкать
В учебнике до пятой главы включительно и седьмую главу (есть на русском)
Прочитать про модули random.hmtl, decimal.html, fractions.ahtml
- Задачи