Последовательности и цикл for
Операции над объектами как совокупность методов
Поля объектов, пространство имён, dir(), поля-методы и поля-поля
- Операции — это методы
int.__add__(100500,42) или даже (100500).__add__(42) как 100500+42
"строка".__len__() как len("строка")
- и т. п.
- Понятие протокола
Пример: числовой протокол (на Си), на Python
Строгая типизация (__mul__() vs __rmul__()) и т. п.
- Последовательность — это свойство объекта (нужные методы), т. е. тоже протокол
Цикл for
- Общий вид:
имена, а не только имя — распаковка, если элемент последовательности — тоже последовательность
break, continue
else:
- примеры со строками и кортежами
- более подробно — в лекции про интераторы
Кстати,
В конструкции множественного связывания имена = последовательность последовательность любая
расширенное множественное присваивание вида «A0, A1, …, *Аk, …, AN = последовательность_из_N+m_элементов»
Функции all() и any() принимают в качестве параметра последовательность
- …одни повсюду!
Последовательности
Операции над последовательностями
Имеют метод последовательность.__getitem__(что-то), что означает последовательность[что-то]
Константные последовательности на примере кортежа
- Умножение на число и сложение
in
- индексирование, +от конца
- поэлементное сравнение
- секционирование: шаг, умолчания, отсутствие границ
как на самом деле работает [] — .__getitem__()
тип slice
.__getitem__(кортеж) — не работает, а в других типах может)
Cтрока (введение)
Подстрока строки — строка
Списки — модифицируемые последовательности
Имеют метод .__setitem__()
.setitem(число)
.setitem(slice)
- вариант с шагом
циклическая cборка [выражение for имена in последовательность]
- Что работает так:
и даже [выражение for имена1 in последовательность1 for имена2 in последовательность2 …]:
то есть является декартовым произведениемФильтрующая клауза: [выражение1 for имена in последовательность if выражение2]
Список как динамический массив, сложность модификации его начала (n) и конца (1)
список как стек, .append(), .pop()
- сравнение с linked lists; есть ли разница в эффективности?
- единственная выгода linked list — это константная сложность вставки/удаления произвольного элемента
но алгоритмов, требующих вставки/удаления произвольного элемента без предварительного поиска, кажется (?) нет, а поиск в обоих случаях линейный
Ответ на предыдущий вопрос — очередь
from collectiond import deque
- добавление в начало и в конец
Имитация многомерных структур данных
- списки списков: проблема внутренних размеров
Вычислимые последовательности
Значения не хранятся, а вычисляются .__getitem__()-ом
range (индексируемая!)
«Классический» for i in range(N):
ещё есть sorted(), но оно возвращает список
Д/З
Прочитать и прощёлкать тьюториал (и про цикл for)
EJudge: UniInterval 'Объединение отрезков'
Input:Вводится кортеж пар натуральных чисел. Это координаты отрезков на прямой. Рассмотрим объединение этих отрезков и найдём длину этого объединения (т. е. совокупную длину всех «закрашенных» нашими отрезками отрезков на прямой).
Output:(66, 91), (152, 230), (21, 81), (323, 342), (158, 211), (286, 332), (294, 330), (18, 58), (183, 236)
213
EJudge: SpiralDigits 'Цифры по спирали'
Input:Ввести целые M и N, вывести последовательность 0 1 2 3 4 5 6 7 8 9 0 1 2 3 … в виде спирально (по часовой стрелке, из верхнего левого угла) заполненной таблицы N×M (N строк, M столбцов). Не забываем про то, что M и N могут быть чётными, нечётными и неизвестно, какое больше.
Output:6,5
0 1 2 3 4 5 7 8 9 0 1 6 6 7 8 9 2 7 5 6 5 4 3 8 4 3 2 1 0 9
При подготовке последнего теста использовался графический редактор GIMP и формат XPM
EJudge: FindRect 'Морской бой'
Input:Ввести несколько строк одинаковой длины, состоящих из символов '#' и '.'. Первый и последний символ каждой строки — '.', а первая и последняя строки состоят целиком из '-'. Известно (проверять не надо), что на получившемся поле изображены только прямоугольники, причём они не соприкасаются даже углами. Вывести количество этих прямоугольников.
Output:------------ .###.....#.. .###.##..#.. .....##..... .....##..#.. ............ ............ .####..####. .......####. .......####. ------------
6
