Функции (продолжение), генераторы, стандартные исключения; взаимодействие с ОС; сравнение версий
Долги за прошлый раз
Хешируемое константное множество frozenset
Ещё раз без спешки: передача функции в качестве параметра (например, sorted()/max() и cmp()/key())
Функции (продолжение)
Вызываемый объект «fun(arg1, arg2, ...) is a shorthand for fun.__call__(arg1, arg2, ...)»
- Умолчания для параметров (присваивание во время определения) и пропуск параметров
- ⇒ Позиционные и именованные параметры
Функции-выражения (lambda)
- Свёртка позиционных и именованных параметров
* и ** в списке формальных параметров
* и ** при вызове функции
BTW dict(key=val, …)
- ⇒ переменное количество параметров
⇒ произвольные именованные параметры
- «Лёгкость» свёртки
Рекурсия. Оценка необходимости рекурсии. Гвидо и хвостовая рекурсия.
Генераторы
Объекты-итераторы iter() из коллекции (.__iter__()) или из последовательности (.__getitem__())
.next() и StopIteration
Работа цикла for
- Выражения-генераторы: для цикла лучше списков, но «одноразовые, что твои спорт-байкеры»
Генераторы: функции с yield вместо return
Разбор домашних заданий
Исключения
JT: Ошибки выполнения в интерпретируемых ЯП
- Ошибки Python — объекты
raise
Иерархия (например, ArithmeticError ⊃ ZeroDivisionError)
try: … except:
- Обработка всех или заданных исключений
Клаузы else: и finally:
- Параметры исключений (у разных разные)
raise Exception("QQ", "QKRQ", …)
Ввод/вывод
- Потоковый
Файловые объекты: open(), close(), read(), write(), readline() и итератор
Модуль sys и написание системных сценариев
Обращайте внимание на пометку Availability:
Обращайте внимание на пометку Deprecated
sys.html: Связь с системой: свойства самого python:
argv[]
exit()
stdin, stdout, stderr
getsizeof(), max…(), getrefcount()
ps1, ps2
- …
os.html: Связь с операционной системой и обеспечение (относительной) кроссплатформенности:
Системные и другие libc-вызовы
Параметры процесса: environ[], chdir()/getcwd(), идентификаторы и флаги
- Работа с файловым дескриптором вместо файлового объекта
- Создание/удаление/переименование различных файловых объектов; получение и изменение их свойств
Манипуляция с именами файловых объектов (os.path.html)
- Из используемого:
os.pipe(), os.tmpfile()
os.listdir(path)/os.makedirs(path[, mode])/os.removedirs(path)
os.stat(path), os.times()
os.urandom(n)
subprocess.html/subprocess32: Запуск подпроцессов и взаимодействие с ними
Простейший вызов вида .call()
Работа с Popen-объектом
- Перенаправление В/В (в т. ч. в канал)
Проблема буферизации В/В (когда завершается операция write?)
- Проблема синхронизации В/В
.poll() и .terminate()
time.html: .clock(), .time(), .strftime() и .sleep()
Сравнение версий
Posix diff
Сравнение версий и VCS (на примере git diff)
Модуль difflib.html
- Последовательная сущность простого построчного сравнения
Низкоуровневый интерфейс SequenceMatcher
Варианты Differ-объектов (это итераторы!): .ndiff(), .unified_diff(), …
Использование: если различий нет, строки в ndiff начинаются с двух пробелов
Д/З
Прочитать
В учебнике: datastructures.html, inputoutput.html, errors.html, classes.html (и далее)
- Документацию, упомянутую выше (хотя бы бегло заглянуть):
Задачи и упражнения
Строки:
(domari:MaxSubst) Подстрока максимальной длины из разных букв
Ввести строку и вывести ближайшую к началу подстроку максимальной длины, содержащую только различные символы.
qweqweASDFGHASDFGASasdfghas123
DFGASasdfgh
Функции:
(domari:GuessSigns) Вставить знаки в целочисленное выражение
Ввести последовательность натуральных чисел через пробел (не более 12), и вывести YES, если можно ли между этими числами вставить произвольные знаки сложения или вычитания и один знак "=", чтобы получилось равенство. Вывести NO, если нельзя. Унарные операции и пропуск знака не допускаются.
123 234 345 12
YES
Генератор:
(domari:RandomGen) Найти число в псевдослучайной последовательности
Ввести через запятую натуральные числа X0, a, c и m (c также может быть равно 0); на следующей строке ввести натуральное число Y. Использовать генератор последовательности псевдослучайных чисел линейным конгруэнтным методом и проверить, встречается ли Y в последовательности Xn+1 = (aXn + c) mod m (это и есть упомянутый метод ). Вывести YES, если встречается и NO, если нет.
7,7,7,10 6
YES
(domari:TaskTester) Тестировщик домашних заданий
Первая строка ввода — имя файла, содержащего программу на Python; в каждой паре последующих — имя файла с входными даннми и имя файла с эталонными выходными данными. Запустить введённую программу, передав ей на стандартный ввод входные данные, получить от неё вывод (стандартный вывод ошибок игнорировать) и сравнить его с эталоном. Вывести общее количество запусков и количество «успешных» запусков, вывод которых совпал с эталоном. Любую другую информацию можно выводить на стандартный вывод ошибок (sys.stderr).
DummyTest.py 001.dat 001.ans 002.dat 002.ans 003.dat 003.ans
2/3
- Протестировать с помощью тестировщика уже сделанные Д/З
Более подробная формулировка и спойлер достуны по ссылке в названии задачи.
Добиться прохождения тестов по времени