Последовательности и цикл for
Операции над объектами как совокупность методов
dir(объект), пространство имён, методы
int.__add__(100500,42) или даже (100500).__add__(42) как 100500*42
"строка".__len__() как len("строка")
- и т. п.
- понятие протокола
строгая типизация (__mul__() vs __rmul__()) и т. п.
Последовательность — это свойство объекта (нужные методы).
Цикл for
- Общий вид:
имена, а не только имя — распаковка, если элемент последовательности — тоже последовательность
break, continue и else:
- примеры со строками и кортежами
Кстати,
В конструкции множественного связывания имена = последовательность последовательность любая
Индексируемые/неиндексируемые последовательности
Имеют метод последовательность.__getitem__(что-то), что означает последовательность[что-то]
Кортеж:
- индексирование, +от конца
- секционирование, шаг, умолчания, отсутствие границ
как на самом деле работает .__getitem__()
тип slice
.__getitem__(кортеж) — не работает
Cтрока (введение):
Подстрока строки — строка
Модифицируемые
Имеют метод .__setitem__() Список:
.setitem(число)
.setitem(slice)
- вариант с шагом
циклическая cборка [выражение for имена in последовательность]
- Что работает так:
и даже [выражение for имена1 in последовательность1 for имена2 in последовательность2 …]:
то есть является декартовым произведением
- Методы списков
Список как динамический массив, сложность модификации его начала (n) и конца (1)
список как стек, .append(), .pop()
- сравнение с linked lists; есть ли разница в эффективности?
- единственная выгода linked list — это константная сложность вставки/удаления произвольного элемента
но алгоритмов, требующих вставки/удаления произвольного элемента без предварительного поиска, кажется (?) нет, а поиск в обоих случаях линейный
Деки:
Ответ на предыдущий вопрос — очередь
from collectiond import deque
- добавление в начало и в конец
Вычислимые последовательности (введение)
Значения не хранятся, а вычисляются .__getitem__()-ом
range (индексируемая!)
Про Д/З
Почти весь ввод в Д/З делается с помощью eval(nput()):
input() вводит строку
eval() вычисляет эту строку, как если бы это было выражение python3
Д/З
Прочитать и прощёлкать тьюториал (и про цикл for)
EJudge: MaxSubsum 'Полоса удач'
Ввести в столбик последовательность целых (положительных и отрицательных) чисел, не равных нулю; в конце этой последовательности стоит 0. Вывести наибольшую сумму последовательно идущих элементов этой последовательности (не менее одного).
2 3 -7 -1 3 4 5 -2 -4 7 8 -6 -1 0
21
EJudge: PackedQueue 'Чудо-конвейер'
Ввести последовательность объектов Python (кортежей или целых чисел), и сымитировать работу Чудо-Конвейера. Если объект — кортеж, это означает, что на вход конвейеру подаются поочерёдно все объекты из этого кортежа. Если объект — натуральное число N, это означает, что с выхода конвейера надо снять поочерёдно N объектов, объединить их в кортеж и вывести. Если с конвейера нельзя снять N объектов, или в последовательности нет больше команд, Чудо-Конвейер немедленно останавливается.
("QWE",1.1,234),2,(None,7),0,2,(7,7,7),2,(12,),(),3,(5,6),3,100500
('QWE', 1.1) () (234, None) (7, 7) (7, 7, 12)
При подготовке последнего теста использовался графический редактор GIMP и формат XPM
EJudge: FindRect 'Морской бой'
Ввести несколько строк одинаковой длины, состоящих из символов '#' и '.'. Первый и последний символ каждой строки — '.', а первая и последняя строки состоят целиком из '-'. Известно (проверять не надо), что на получившемся поле изображены только прямоугольники, причём они не соприкасаются даже углами. Вывести количество этих прямоугольников.
------------ .###.....#.. .###.##..#.. .....##..... .....##..#.. ............ ............ .####..####. .......####. .......####. ------------
6
EJudge: SpiralDigits 'Цифры по спирали'
Ввести целые M и N, вывести последовательность 0 1 2 3 4 5 6 7 8 9 0 1 2 3 … в виде спирально (по часовой стрелке, из верхнего левого угла) заполненной таблицы N×M (N строк, M столбцов). Не забываем про то, что M и N могут быть чётными, нечётными и неизвестно, какое больше.
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
- Д/З мне: на следующий раз не забыть про множество