Циклы и последовательности
Разбор домашних заданий
Персональный, с объяснением словами
Списки
Списки — это последовательности, которые хранят произвольные объекты.
Задание списка [элемент, … ,]
- Вот это довольно осмысленный список А вот это — не очень (ну зачем он может понадобиться?):
Цикл `for` для списка
- Устроен так:
Цикл совершает столько оборотов, сколько элементов в последовательности, и на каждом обороте имя «имя» связывает очередной элемент этой последовательности:
- Упражнение: вывести только положительные числа из заданного списка
Индексирование
У списка есть длина :
Элементы списка нумеруются с 0 до len(список)-1:
- Попытка обратиться к элементу с индексом большим, чем есть в списке, приведёт к исключению:
Обратите внимание: в списке 16 элементов с индексами от 0 до 15 включительно — или до 16 не включая:
- Индексы бывают отрицательные — с конца списка:
Список — модифицируемая последовательность, мы можем заменять один объект другим:
1 >>> a 2 [12, -657, 34, -67, 0, 467, -78, -45, 0, 56, -78, 89, -89, 80, 0, 2] 3 >>> a[3] = "QQ" 4 >>> a 5 [12, -657, 34, 'QQ', 0, 467, -78, -45, 0, 56, -78, 89, -89, 80, 0, 2] 6 >>> a[-6] = "QKRQ" 7 >>> a 8 [12, -657, 34, 'QQ', 0, 467, -78, -45, 0, 56, 'QKRQ', 89, -89, 80, 0, 2] 9 >>> a[3], a[-6] = 0, 0 10 >>> a 11 [12, -657, 34, 0, 0, 467, -78, -45, 0, 56, 0, 89, -89, 80, 0, 2]
Упражнение: проход списка по индексам с помощью while
Индексы на N элементов в Python3 всегда начинаются с 0 и заканчиваются N-1
Объекты типа range
Range (диапазон) — это вычислимая последовательность. Можно представить себе, что это список, элементы которого не хранятся в памяти, а вычисляются по ходу:
Простейший пример: range(N):
- Range с одним параметром N — это диапазон от 0 до N (не включая N, разумеется):
С двумя — range(M, N) — диапазон от M до N:
С тремя — range(M, N, S) — диапазон от M до N с шагом S:
- Обратите внимание на то, что 22, как полагается, не вошло в диапазон
- Range — настоящая последовательность, её можно использовать везде, где используются последовательности!
- Распаковывать при связывании:
- Превращать в список:
Использовать в цикле for:
- Индексировать!
Упражнение: заменить отрицательные элементы положительными
Некоторые методы списков
- Добавить один элемент в конец списка можно так:
Получить последний элемент в списке (a[-1]) и одновременно удалить его оттуда — так:
- Можно получить и удалить элемент с произвольным индексом:
1 >>> a = [12,-657,34,-67,0,467,-78,-45,0,56,-78,89,-89,80,0,2] 2 >>> a 3 [12, -657, 34, -67, 0, 467, -78, -45, 0, 56, -78, 89, -89, 80, 0, 2] 4 >>> a.pop(0) 5 12 6 >>> a 7 [-657, 34, -67, 0, 467, -78, -45, 0, 56, -78, 89, -89, 80, 0, 2] 8 >>> a.pop(3) 9 0 10 >>> a 11 [-657, 34, -67, 467, -78, -45, 0, 56, -78, 89, -89, 80, 0, 2] 12 >>> a.pop(-4) 13 -89 14 >>> a 15 [-657, 34, -67, 467, -78, -45, 0, 56, -78, 89, 80, 0, 2]
- Можно получить и удалить элемент с произвольным индексом:
- Вставить элемент на произвольное место:
Операции insert(i,e) и pop(i) требуют перемещать элементы списка (соответственно, вправо, чтобы образовалось свободное место, и влево, чтобы после удаления не пустовало). Если вставлять/удалять в начале вписка, то переставлять придётся все его элементы.
А вот операции append()/pop() работают с концом списка и не требуют ничего перемешать. Эти «дешёвые» операции реализуют абстракцию «стек» (FILO), которая очен:ь часто встречается в различных алгоритмах.
Упражнение: ввод списка до 0
Ввод списка с помощью eval(input())
По умолчанию input() возвращает объект типа «строка» (str):
- Даже если мы вводим что-то похожее на объект Python3, это всё равно просто строка:
- Эту строку можно обработать преобразованием типа, если мы точно знаем, что именно ввели:
А вот если эту строку обработать eval(), эта функция вычислит выражение, находящееся в строке! Более точно, эту строку обработает Python3, как если бы бы её ввели в интерпретаторе:
Соответственно, если в этой строке содержится в точности то, как мы записывает список, eval() преобразует её в список:
(не успели) Поиск первого (например, отрицательного) и for, клауза exit не успели .remove()/index()/in
Д/З
прочитать и прощёлкать десятую главу учебника
EJudge: NotMax 'Меньше максимального'
Ввести непустой список (с помощью eval(input())), и вывести в столбик все его элементы, которые меньше максимального. Функцией max() не пользоваться! Если все элементы одинаковые, не выводить ничего.
[1,6,3,3,8,5,3,8,5,3,7]
1 6 3 3 5 3 5 3 7
EJudge: ListEdit 'Модифицировать список'
Ввести и модифицировать список: элементы, стоящие на чётных местах умножить на 2, а на нечётных — поделить нацело (то есть с помощью. «//») на 3, если они сами делятся на 3 . Вывести результат (в виде списка).
[1,2,3,4,5,6,7,8]
[2, 2, 6, 4, 10, 2, 14, 8]
EJudge: ThirdNeg 'Третье отрицательное'
Ввести список. Вывести третье по счёту отрицательное число в этом списке, если оно там есть и "NO" иначе.
[1,2,-3,4,-5,6,-7,8,9]
-7
- Ввести список чисел. Элементы списка, стоящие на чётных местах, означают дистанцию, на которую надо продвинуться вперёд, а на нечётных — угол поворота черепашки влево. Убедиться, что такой ввод:
[100,90,100,90,100,-120,100,-120,100,-120,100,90,100,90]
даёт такую фигуру:
Нарисовать ещё что-нибудь осмысленное