Цикл по последовательности
Повторять одно и то же вручную — значит писать одинаковые строки. Цикл делает это за вас.
for товар in ["хлеб", "молоко", "соль"]:
print(товар)хлеб молоко соль
Читается почти как по-русски: «для каждого товара из списка — напечатай товар». Форма та же, что у условия: слово, двоеточие, блок с отступом.
for имя in откуда:
что делать с каждым
и это тоже
это уже после цикла
Имя переменной выбираете вы. На каждом заходе в неё кладётся очередной элемент, и старое значение заменяется.
for буква in "код":
print(буква)к о д
По строке цикл идёт по знакам — строка ведёт себя как последовательность.
Внутри цикла можно делать что угодно, в том числе проверять условия:
for n in [4, 7, 10, 13]:
if n % 2 == 0:
print(n, "чётное")
else:
print(n, "нечётное")4 чётное 7 нечётное 10 чётное 13 нечётное
Обратите внимание на двойной отступ: if внутри for сдвинут на четыре пробела, а его блок — на восемь.
Циклы можно вкладывать друг в друга. Внутренний проходит целиком на каждом заходе внешнего:
for i in [1, 2]:
for j in ["a", "b"]:
print(i, j)1 a 1 b 2 a 2 b
Четыре строки вместо двух: два захода внешнего цикла, и на каждом два захода внутреннего. Отсюда правило — число заходов перемножается, и вложенный цикл по тысяче элементов внутри такого же означает миллион шагов.
Отступы здесь тройные: внешний цикл, внутренний со сдвигом на четыре, его тело — на восемь. Это то место, где отступы начинают путать, и лучший способ не запутаться — читать сверху вниз, отмечая уровни.
range: числа без списка
Когда надо повторить что-то заданное число раз, список писать незачем. Числа даёт range.
for i in range(5):
print(i)0 1 2 3 4
range(5) даёт пять чисел, начиная с нуля: 0, 1, 2, 3, 4. Пятёрки среди них нет — правая граница не входит, как у среза.
Это и есть причина, по которой числа начинаются с нуля: так количество чисел совпадает с тем, что написано в скобках.
for i in range(2, 6):
print(i)2 3 4 5
С двумя числами — от первого до второго, не включая второе.
for i in range(0, 10, 3):
print(i)0 3 6 9
С тремя — третье это шаг. Шаг может быть отрицательным, и тогда счёт идёт назад:
for i in range(3, 0, -1):
print(i)3 2 1
Если переменная внутри цикла не нужна, её обычно называют _ — это обычное имя, но принято означать «значение не важно»:
for _ in range(3):
print("привет")привет привет привет
Копилка: сумма, счётчик, максимум
Самое частое, ради чего пишут цикл, — накопить: сумму, количество, максимум. Схема всегда одна.
цены = [120, 340, 90]
сумма = 0
for ц in цены:
сумма = сумма + ц
print(сумма)550
Три шага: завести до цикла, менять внутри, взять после. Забыть первый шаг — получить NameError, забыть третий — не увидеть результата.
Короткая запись того же — сумма += ц:
цены = [120, 340, 90]
сумма = 0
for ц in цены:
сумма += ц
print(сумма)550
Счётчик устроен так же, только прибавляется единица — и обычно под условием:
числа = [4, 7, 10, 13, 16]
чётных = 0
for n in числа:
if n % 2 == 0:
чётных += 1
print(чётных)3
Максимум — третья разновидность той же схемы. Начинают с первого элемента и сравнивают с каждым:
цены = [120, 340, 90]
самая = цены[0]
for ц in цены:
if ц > самая:
самая = ц
print(самая)340
Две копилки сразу — обычное дело: так считают среднее, где нужны и сумма, и количество.
оценки = [5, 4, 5, 3]
сумма = 0
сколько = 0
for о in оценки:
сумма += о
сколько += 1
print(сумма / сколько)4.25
Обе строки внутри цикла, обе с одинаковым отступом — значит выполняются на каждом заходе. Деление уже после цикла, один раз.
Копилкой может быть и строка:
слова = ["раз", "два", "три"]
строка = ""
for с in слова:
строка += с + " "
print(строка.strip())раз два три
Начальное значение здесь — пустая строка, а не ноль: она и есть «ничего» для строк. Правило то же, что с числами: копилка начинается с того, что должно получиться из пустого списка.