Цикл for в Python: перебор чего угодно на примерах
Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе
Представьте, что вы учитель и у вас 30 учеников. Для каждого нужно распечатать табель успеваемости. Будете ли вы писать 30 отдельных вызовов print? Конечно, нет. Вы скажете компьютеру: «для каждого ученика напечатать его табель». Именно это и делает цикл for.
В этом уроке вы научитесь с помощью цикла for повторять действия над списками, строками, диапазонами чисел и словарями. Вы также познакомитесь с мощными инструментами вроде enumerate() и zip(), с которыми писать циклы ещё удобнее.
К концу урока вы сможете эффективно обрабатывать наборы данных, а не писать один и тот же код снова и снова. Это один из важнейших навыков в программировании.
Как работает цикл for в Python?
Цикл for берёт коллекцию элементов и выполняет один и тот же код по разу для каждого элемента. На каждом проходе цикла переменная хранит текущий элемент. Каждый такой проход в Python называется итерацией.
Это похоже на раздачу карт. Вы берёте колоду и каждую карту кладёте на стол лицом вверх. Карта каждый раз новая, а действие одно и то же.
apple banana cherry
Устройство такое: ключевое слово for, имя переменной (fruit), ключевое слово in и коллекция (fruits), а в конце двоеточие. Код с отступом под этой строкой выполняется по одному разу для каждого элемента списка.
На первой итерации переменная fruit равна "apple", на второй "banana", на третьей "cherry". После последнего элемента цикл завершается, и Python переходит к коду, который идёт дальше.
Added 10, total is now 10 Added 20, total is now 30 Added 30, total is now 60 Added 40, total is now 100 Final total: 100
Такой приём, когда вы начинаете с некоторого значения и обновляете его на каждой итерации, называется накоплением. Он нужен постоянно: чтобы суммировать числа, собирать строки, складывать результаты и многое другое.
Что делает range() в Python?
Иногда списка для перебора нет: нужно повторить действие определённое число раз или пройти по последовательности чисел. Для этого и существует range().
range() создаёт последовательность чисел. Список в памяти при этом не создаётся: числа выдаются по одному, когда они нужны циклу. Поэтому даже огромные диапазоны обходятся дёшево.
0 1 2 3 4
Обратите внимание: range(5) начинается с 0 и останавливается перед 5. Получается ровно 5 чисел: от 0 до 4. Правило «начинаем с нуля, останавливаемся перед концом» действует в Python повсюду.
1 2 3 4 5
Когда аргументов два, первый задаёт начало, а второй конец (не включительно). Поэтому range(1, 6) даёт 1, 2, 3, 4, 5.
Count by 2s: 0 2 4 6 8 10 Countdown: 5 4 3 2 1 Blastoff!
Третий аргумент называется шагом (step): он показывает, сколько прибавлять каждый раз. Шаг 2 пропускает каждое второе число. Отрицательный шаг ведёт счёт в обратную сторону. Шаг может быть любым целым числом, положительным или отрицательным.
Как перебирать строки и словари?
Циклы for работают с любыми итерируемыми объектами в Python, а не только со списками и диапазонами. Строки и словари входят в число самых частых итерируемых объектов, которые вам придётся перебирать.
Перебор строки
Когда вы перебираете строку, вы получаете по одному символу за раз. Это удобно, чтобы считать буквы, проверять написание или обрабатывать текст посимвольно.
P y t h o n
Каждая итерация выдаёт следующий символ. Аргумент end=" " в функции print заменяет перевод строки, который ставится по умолчанию, на пробел, поэтому все символы печатаются в одну строку.
"programming" has 3 vowels
В этом примере цикл for работает вместе с инструкцией if. Для каждого символа мы проверяем, гласная ли это. Если да, увеличиваем счётчик. Такие конструкции вы будете писать постоянно.
Перебор словаря
При переборе словаря по умолчанию вы получаете ключи. Чтобы получить и ключи, и значения, используйте метод .items().
Students: Alice Bob Charlie Report card: Alice: 92 Bob: 85 Charlie: 78
Метод .items() возвращает каждую запись в виде пары (ключ, значение). Записывая for name, score in scores.items(), вы распаковываете каждую пару в две отдельные переменные. Это чище, чем обращаться к scores[name] внутри цикла.
Что делает enumerate() в Python?
Иногда нужен и сам элемент, И его позиция в списке. Можно взять range(len(list)) и вручную обращаться к списку по индексу, но в Python есть способ чище: enumerate().
colors = ["red", "green", "blue"]
for i in range(len(colors)):
print(f"{i}: {colors[i]}")colors = ["red", "green", "blue"]
for i, color in enumerate(colors):
print(f"{i}: {color}")enumerate() оборачивает итерируемый объект и выдаёт пары (индекс, элемент). Каждую пару вы распаковываете в две переменные. Оба примера выводят одно и то же, но вариант с enumerate() читается легче и больше в духе Python.
Today's to-do list: 1. Buy groceries 2. Clean house 3. Walk dog 4. Cook dinner
Аргумент start=1 говорит enumerate() начинать отсчёт с 1, а не с 0. Это то, что нужно для нумерованных списков, где «пункт номер 0» пользователю покажется странным.
Как перебрать несколько списков сразу с помощью zip()?
А если у вас два связанных списка и их нужно обработать вместе? Например, список имён учеников и список их баллов. zip() соединяет их в пары, и вы перебираете оба списка одновременно.
Alice: 92 (Pass) Bob: 85 (Pass) Charlie: 78 (Needs improvement)
zip() принимает два или больше итерируемых объекта и объединяет их поэлементно. На первой итерации вы получаете первый элемент каждого списка, на второй итерации вторые элементы, и так далее.
Alice Smith, age 25 Bob Jones, age 30 Charlie Brown, age 22
Что такое вложенные циклы for?
Цикл for можно поместить внутрь другого цикла for. Внутренний цикл выполняется полностью на каждой итерации внешнего. Это называется вложенностью, и именно так работают с сетками, таблицами и комбинациями.
1 x 1 = 1 1 x 2 = 2 1 x 3 = 3 2 x 1 = 2 2 x 2 = 4 2 x 3 = 6 3 x 1 = 3 3 x 2 = 6 3 x 3 = 9
Когда row равно 1, внутренний цикл проходит значения col 1, 2, 3. Затем row становится равным 2, и внутренний цикл снова проходит col по 1, 2, 3. Каждый раз, когда внешний цикл делает шаг вперёд, внутренний начинается заново.
Практические упражнения
Пора применить навыки работы с циклом for на деле! Упражнения идут от простого перебора к сочетанию циклов с инструментами, которые вы только что изучили.
Попробуйте решить каждое упражнение самостоятельно, прежде чем открывать подсказки. Настоящие навыки появляются именно тогда, когда вы застреваете и сами находите выход.
Дан список продуктов. С помощью цикла for выведите каждый продукт на отдельной строке.
Ожидаемый вывод:
milk
eggs
bread
butterС помощью range() и цикла for вычислите сумму всех чисел от 1 до 10 включительно. Выведите результат.
Ожидаемый вывод:
Sum: 55Не запуская код, предскажите, что именно он выведет. Внимательно посмотрите на аргументы range() и условие if.
Затем запустите код и сверьте свой ответ.
Этот код должен посчитать, сколько раз буква «l» встречается в строке «hello world», но в нём есть ошибки. Исправьте код, чтобы он выводил:
The letter "l" appears 3 timesНе меняйте переменную word и последнюю инструкцию print, исправьте только логику цикла.
С помощью enumerate() со start=1 выведите нумерованное меню ресторана.
Ожидаемый вывод:
1. Burger - $8.99
2. Pizza - $12.50
3. Salad - $7.25
4. Pasta - $10.00С помощью цикла for переверните строку "Python", собирая новую строку посимвольно. НЕ используйте срезы ([::-1]) и функцию reversed().
Ожидаемый вывод:
nohtyPПереберите словарь grades и выведите имя каждого ученика и его буквенную оценку. Балл 90 и выше соответствует «A», 80 и выше «B», 70 и выше «C», а ниже 70 ставится «F».
Ожидаемый вывод:
Alice: 95 (A)
Bob: 82 (B)
Charlie: 67 (F)
Diana: 73 (C)Итоги: цикл for в Python
Вот всё, что вы узнали о циклах for:
| Приём | Что делает | Пример |
|---|---|---|
for x in list | Перебирает каждый элемент | for fruit in fruits: |
for i in range(n) | Повторяет n раз (от 0 до n-1) | for i in range(5): |
range(start, stop, step) | Своя последовательность чисел | range(1, 11, 2) |
for char in string | Перебирает символы | for c in "hello": |
for k, v in dict.items() | Перебирает пары ключ-значение | for name, score in grades.items(): |
enumerate(iterable) | Даёт индекс и элемент | for i, x in enumerate(list): |
zip(a, b) | Соединяет в пары элементы двух списков | for x, y in zip(names, scores): |
Главные правила:
for заканчивается двоеточием (:)range() останавливается ПЕРЕД конечным числомenumerate() лучше, чем range(len(...))zip() останавливается на самом коротком спискеfor student in students)Что дальше?
Циклы for хороши, когда вы точно знаете, что перебираете. А если нужно повторять действия, пока не изменится какое-то условие? Здесь на помощь приходят циклы while. В следующем уроке, [Цикл while в Python](/python/python-while-loops), вы научитесь строить циклы на основе условий, а не коллекций.