урок 5 из 14

Цикл for и range

Повторять действия: цикл по последовательности, range для чисел и схема накопления суммы, счётчика и максимума.

7 мин чтения · 3 главы ·5 заданий ·домашняя работа

Цикл по последовательности

Повторять одно и то же вручную — значит писать одинаковые строки. Цикл делает это за вас.

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.

range(5)0 1 2 3 4range(2, 6)2 3 4 5range(0, 10, 3)0 3 6 9сколько чисел: конец минус начало, делённое на шаг
От начала до конца, шагая заданной величиной. Правая граница не входит — как у среза.
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("привет")

привет привет привет

Копилка: сумма, счётчик, максимум

Самое частое, ради чего пишут цикл, — накопить: сумму, количество, максимум. Схема всегда одна.

сумма = 0для каждого числа:сумма = сумма + число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())

раз два три

Начальное значение здесь — пустая строка, а не ноль: она и есть «ничего» для строк. Правило то же, что с числами: копилка начинается с того, что должно получиться из пустого списка.

Задания урока

Каждое проверяется сразу: ответ сверяется с эталоном, и на неверный вариант приходит разбор.

  1. В «города» лежит список из трёх названий. Напечатайте каждое со своей строки.легко
  2. Напечатайте числа от 1 до 5, каждое со своей строки.легко
  3. В «цены» лежит список чисел. Посчитайте их сумму в «сумма» и напечатайте.средне
  4. В «числа» лежит список. Посчитайте, сколько в нём чётных, и напечатайте это число.средне
  5. В «температуры» лежат числа, среди них отрицательные. Найдите наибольшую и напечатайте.сложно

Практика и материалы по теме курса

Пройти урок с проверкой заданий Курс «Python» открыт и бесплатен, прогресс сохраняется.
Открыть курс