Цикл for в Python: просто и понятно!

Привет! В этой статье мы поговорим о цикле for в Python. Он позволяет работать с коллекциями любого типа (списки, строки, множества, словари):

for name in ["Вася", "Маша", "Петя"]:
    print(name)

Вывод:

Вася
Маша
Петя

Цикл for с range

Чтобы выполнить блок кода определенное количество раз, мы можем воспользоваться функцией range.

По умолчанию функция range возвращает последовательность чисел, начиная с нуля:

for i in range(3):
    print(i)

Вывод программы:

0
1
2

При этом мы можем указать, с какого числа начать:

for i in range(2, 5):
    print(i)

Вывод:

2
3
4

Также мы можем поменять шаг цикла, передав третий аргумент в функцию range:

for i in range(2, 9, 3):
    print(i)

Вывод:

2
5
8

Какой будет вывод следующего кода на Python?

for i in range(3, 15, 4):
    print(i)
3, 7, 11, 15
3, 7, 11
3, 7, 11, 14
7, 11, 14, 17

Цикл for по строке

В Python мы можем использовать цикл for для итерации по строке. Наш блок кода будет выполнен для каждого символа:

name = "Вася"

for letter in name:
    print(letter)

Вывод:

В
а
с
я

Инструкция break

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

for i in range(10):
    if i == 3:
        print("Дальше не пойду")
        break

    print(i)

Вывод:

0
1
2
Дальше не пойду

Инструкция continue

Если мы не хотим полностью останавливать работу цикла, а только пропустить одну итерацию, мы можем воспользоваться ключевым словом continue:

for i in range(5):
    if i == 3:
        print("3 не подойдет")
        continue

    print(i)

Вывод:

0
1
2
3 не подойдет
4

Из примера видно, что цикл for продолжил свое выполнение, пропустив только один элемент. В этом примере можно было бы обойтись только if-else:

for i in range(5):
    if i == 3:
        print("3 не подойдет")
    else:
        print(i)

Но я предпочитаю вариант с continue, когда у нас есть много инструкций, которые должны быть выполнены в цикле. continue позволяет убрать уровень вложенности, который возникает из-за использования else.

Какой будет вывод следующего Python кода?

for i in range(5):
    if i == 2:
        continue
    elif i == 4:
        print("Завершение")
        break

    print(i)
0 1 2 3 4 Завершение
0 1 3 Завершение
0 1 2 3 Завершение
0 1 3 4 Завершение

for-else

Ключевое слово else можно использовать не только с if, но и с for:

for i in range(3):
    print(i)
else:
    print("Закончили!")
0
1
2
Закончили!

Но давайте теперь попробуем добавить уже знакомый нам break:

for i in range(3):
    if i == 2:
        break

    print(i)
else:
    print("Закончили!")

Тут вывод уже поменялся:

0
1

Никакого “Закончили!” мы не видим. Дело в том, что else после for срабатывает только в том случае, если цикл обработал все элементы без вызова break. continue на else никак не влияет:

for i in range(3):
    if i == 2:
        continue

    print(i)
else:
    print("Закончили!")

Вывод:

0
1
Закончили!

Что будет выведено на экран?

for i in range(5):
    if i % 3 == 0:
        continue
    elif i == 4:
        break
    print(i)
else:
    print("Закончили!")
0
1, 2
1, 2, Закончили!
1, 2, 3

Вложенные циклы

Мы можем использовать цикл for внутри другого цикла for:

for i in range(1, 3):
    for j in range(1, 3):
        print(i, "*", j, "=", i * j)

Вывод:

1 * 1 = 1
1 * 2 = 2
2 * 1 = 2
2 * 2 = 4

При этом мы можем использовать циклы любой вложенности.

Инструкция pass

Если мы не хотим выполнять код в теле цикла, то можно просто указать ключевое слово pass:

for i in range(100):
  pass

Код выше ничего не сделает.

Функция enumerate с циклом for

Часто нужно знать порядковый номер элемента внутри цикла for. Для этого можно обернуть список в функцию enumerate:

names = ["Вася", "Маша", "Петя"]

for i, name in enumerate(names):
    print(i, name)

Вывод:

0 Вася
1 Маша
2 Петя

Мы можем выбрать, с какого числа enumerate начнет подсчет при помощи аргумента start.

Какой будет вывод следующего кода на Python?

students = ["Иван", "Ольга", "Егор"]

for idx, student in enumerate(students, start=1):
    print(idx, student)
0 Ольга, 1 Егор
1 Ольга, 2 Егор
0 Иван, 1 Ольга, 2 Егор
1 Иван, 2 Ольга, 3 Егор

Цикл for по словарю (dict)

Нужно пробежать по значениям в словаре? Не беда. Цикл for с этим легко справиться:

ages = {
    "Вася": 18,
    "Маша": 22,
    "Петя": 26,
}

for name in ages:
    print(name, ages[name])

Вывод:

Вася 18
Маша 22
Петя 26

При этом мы можем получить сразу и имя и возраст:

for name, age in ages.items():
    print(name, age)

Вывод:

Вася 18
Маша 22
Петя 26

Если же нам нужен только возраст, то можно воспользоваться методом .values():

for age in ages.values():
    print(age)

Вывод:

18
22
26

Обход элементов в обратном порядке

Если по какой-то причине нам нужно пройтись по элементам в обратном порядке, то мы можем обернуть элементы в функцию reversed:

for i in reversed(range(1, 4)):
    print(i)

Вывод:

3
2
1

В случае с range, мы можем просто передать отрицательный шаг, чтобы получить элементы в обратном порядке:

for i in range(3, 0, -1):
    print(i)

Вывод этой программы идентичен предыдущей.

Что будет выведено на экран?

for i in reversed(range(3)):
    print(i)
0 1 2
1 2 3
2 1 3
2 1 0

Цикл for в одну строку

Если вам нужно выполнить только одну инструкцию, то вы можете использовать сокращенную версию цикла for:

for i in range(3): print(i)

Вывод:

0
1
2

Упражнения

  1. Базовое использование for с разными типами коллекций:
    Используйте разные типы коллекций (список, строку, множество, словарь) и напишите программу на Python, где с помощью цикла for вы будете выводить каждый элемент коллекции на экран. Ваша программа должна корректно обрабатывать каждый тип коллекции.

  2. Изучение функции range с разными параметрами:
    a) Напишите программу, которая использует цикл for и range для вывода чисел от 5 до 15.
    b) Напишите программу, которая выводит каждое третье число в диапазоне от 10 до 25.

  3. Управление выполнением цикла с break:
    Напишите программу, в которой будет список из 10 имен. Ваша задача - пройтись по списку имен с помощью цикла for, и как только вы встретите имя “Дима”, программа должна вывести “Нашел Диму!” и завершить выполнение цикла. Если в списке нет имени “Дима”, то программа должна вывести “Дима не найден”.

Обсуждение