Урок 4 из 8 · 20 мин · обновлено

Циклы: for и while

Как заставить программу повторять действия: цикл for с range, накопление суммы, цикл while, а также break и continue.

Зачем нужны циклы

Допустим, нужно вывести числа от 1 до 5. Можно написать пять строк с print, но что, если чисел будет тысяча? Для повторяющихся действий есть циклы — конструкции, которые выполняют блок кода несколько раз.

Цикл for и range

for перебирает элементы по очереди. Чаще всего вместе с ним используют range() — функцию, которая создаёт последовательность чисел:

Python
for i in range(1, 6):
    print(i)

Результат — числа от 1 до 5, каждое на новой строке. Переменная i на каждом шаге принимает следующее значение.

У range() три варианта записи:

Запись Числа
range(5) 0, 1, 2, 3, 4
range(1, 6) 1, 2, 3, 4, 5
range(0, 10, 2) 0, 2, 4, 6, 8 — с шагом 2

Главное правило: правая граница не входит в последовательность. К этому быстро привыкаешь.

for умеет перебирать не только числа. Например, строку — по одному символу:

Python
for letter in "кот":
    print(letter)

В уроке 6 так же будем перебирать списки.

Накопление результата

Частая задача — посчитать сумму. Для этого заводят переменную до цикла и на каждом шаге что-то к ней прибавляют:

Python
total = 0
for price in range(100, 401, 100):  # 100, 200, 300, 400
    total += price                  # то же, что total = total + price
print(total)                        # 1000

Запись total += price — сокращение для total = total + price. Так же работают -=, *= и другие.

Цикл while

while повторяет блок, пока условие верно. Он нужен, когда заранее неизвестно, сколько будет повторов:

Python
balance = 1000
months = 0

while balance < 2000:
    balance = balance * 1.1   # +10% каждый месяц
    months += 1

print("Сумма удвоится через", months, "мес.")

Будьте внимательны: если условие никогда не станет ложным, цикл будет бесконечным. Остановить зависшую программу можно сочетанием Ctrl+C.

break и continue

  • break — сразу выйти из цикла;
  • continue — пропустить остаток текущего шага и перейти к следующему.
Python
for n in range(1, 10):
    if n % 2 == 0:
        continue      # чётные пропускаем
    if n > 7:
        break         # дальше 7 не идём
    print(n)          # 1, 3, 5, 7

Типичный пример break — проверка пароля с ограниченным числом попыток:

Python
attempts = 0
while attempts < 3:
    password = input("Пароль: ")
    if password == "secret":
        print("Добро пожаловать!")
        break
    attempts += 1

Попробуйте сами. Выведите таблицу умножения на 7 в виде 7 x 1 = 7 … 7 x 10 = 70, а затем посчитайте сумму всех чисел от 1 до 100.

Решение
Python
for i in range(1, 11):
    print("7 x", i, "=", 7 * i)

total = 0
for n in range(1, 101):
    total += n
print(total)   # 5050

Обратите внимание на range(1, 11) и range(1, 101): чтобы включить 10 и 100, правую границу берут на единицу больше.

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Какие числа даст range(1, 5)?

  2. Когда остановится цикл while?

  3. Что делает break внутри цикла?

  4. Чему будет равна переменная total после цикла: total = 0; for n in range(1, 4): total += n?