Перейти к содержимому
Editor

Цикл for в Python: перебор чего угодно на примерах

Начальный25 min7 упр.95 XP

Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе

0/7 упр.

Представьте, что вы учитель и у вас 30 учеников. Для каждого нужно распечатать табель успеваемости. Будете ли вы писать 30 отдельных вызовов print? Конечно, нет. Вы скажете компьютеру: «для каждого ученика напечатать его табель». Именно это и делает цикл for.

В этом уроке вы научитесь с помощью цикла for повторять действия над списками, строками, диапазонами чисел и словарями. Вы также познакомитесь с мощными инструментами вроде enumerate() и zip(), с которыми писать циклы ещё удобнее.

К концу урока вы сможете эффективно обрабатывать наборы данных, а не писать один и тот же код снова и снова. Это один из важнейших навыков в программировании.

Как работает цикл for в Python?

Цикл for берёт коллекцию элементов и выполняет один и тот же код по разу для каждого элемента. На каждом проходе цикла переменная хранит текущий элемент. Каждый такой проход в Python называется итерацией.

Это похоже на раздачу карт. Вы берёте колоду и каждую карту кладёте на стол лицом вверх. Карта каждый раз новая, а действие одно и то же.

Ваш первый цикл for
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
# Output:
# apple
# banana
# cherry
Вывод
apple
banana
cherry

Устройство такое: ключевое слово for, имя переменной (fruit), ключевое слово in и коллекция (fruits), а в конце двоеточие. Код с отступом под этой строкой выполняется по одному разу для каждого элемента списка.

На первой итерации переменная fruit равна "apple", на второй "banana", на третьей "cherry". После последнего элемента цикл завершается, и Python переходит к коду, который идёт дальше.

Накапливаем сумму в цикле for
# The loop variable can be anything you want
numbers = [10, 20, 30, 40]
total = 0
for num in numbers:
total = total + num
print(f"Added {num}, total is now {total}")
print(f"\nFinal total: {total}")
# Output:
# 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
Вывод
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() создаёт последовательность чисел. Список в памяти при этом не создаётся: числа выдаются по одному, когда они нужны циклу. Поэтому даже огромные диапазоны обходятся дёшево.

range() с одним аргументом: stop
# range(5) gives you 0, 1, 2, 3, 4
for i in range(5):
print(i)
# Output:
# 0
# 1
# 2
# 3
# 4
Вывод
0
1
2
3
4

Обратите внимание: range(5) начинается с 0 и останавливается перед 5. Получается ровно 5 чисел: от 0 до 4. Правило «начинаем с нуля, останавливаемся перед концом» действует в Python повсюду.

range() с двумя аргументами: start и stop
# range(start, stop) - starts at start, stops before stop
for i in range(1, 6):
print(i)
# Output:
# 1
# 2
# 3
# 4
# 5
Вывод
1
2
3
4
5

Когда аргументов два, первый задаёт начало, а второй конец (не включительно). Поэтому range(1, 6) даёт 1, 2, 3, 4, 5.

range() с тремя аргументами: start, stop, step
# range(start, stop, step) - count by a custom step
print("Count by 2s:")
for i in range(0, 11, 2):
print(i, end=" ")
print() # newline
print("\nCountdown:")
for i in range(5, 0, -1):
print(i, end=" ")
print("\nBlastoff!")
# Output:
# Count by 2s:
# 0 2 4 6 8 10
#
# Countdown:
# 5 4 3 2 1
# Blastoff!
Вывод
Count by 2s:
0 2 4 6 8 10 

Countdown:
5 4 3 2 1 
Blastoff!

Третий аргумент называется шагом (step): он показывает, сколько прибавлять каждый раз. Шаг 2 пропускает каждое второе число. Отрицательный шаг ведёт счёт в обратную сторону. Шаг может быть любым целым числом, положительным или отрицательным.


Как перебирать строки и словари?

Циклы for работают с любыми итерируемыми объектами в Python, а не только со списками и диапазонами. Строки и словари входят в число самых частых итерируемых объектов, которые вам придётся перебирать.

Перебор строки

Когда вы перебираете строку, вы получаете по одному символу за раз. Это удобно, чтобы считать буквы, проверять написание или обрабатывать текст посимвольно.

Перебор строки
word = "Python"
for char in word:
print(char, end=" ")
# Output:
# P y t h o n
Вывод
P y t h o n

Каждая итерация выдаёт следующий символ. Аргумент end=" " в функции print заменяет перевод строки, который ставится по умолчанию, на пробел, поэтому все символы печатаются в одну строку.

Подсчёт гласных в цикле for
# Count vowels in a word
word = "programming"
vowel_count = 0
for char in word:
if char in "aeiou":
vowel_count += 1
print(f"\"{word}\" has {vowel_count} vowels")
# Output:
# "programming" has 3 vowels
Вывод
"programming" has 3 vowels

В этом примере цикл for работает вместе с инструкцией if. Для каждого символа мы проверяем, гласная ли это. Если да, увеличиваем счётчик. Такие конструкции вы будете писать постоянно.

Перебор словаря

При переборе словаря по умолчанию вы получаете ключи. Чтобы получить и ключи, и значения, используйте метод .items().

Перебор словаря
scores = {"Alice": 92, "Bob": 85, "Charlie": 78}
# Looping over keys (default)
print("Students:")
for name in scores:
print(f" {name}")
print()
# Looping over keys and values with .items()
print("Report card:")
for name, score in scores.items():
print(f" {name}: {score}")
# Output:
# Students:
# Alice
# Bob
# Charlie
#
# Report card:
# Alice: 92
# Bob: 85
# Charlie: 78
Вывод
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().

Без enumerate() (некрасиво)
colors = ["red", "green", "blue"]

for i in range(len(colors)):
    print(f"{i}: {colors[i]}")
С enumerate() (чисто)
colors = ["red", "green", "blue"]

for i, color in enumerate(colors):
    print(f"{i}: {color}")

enumerate() оборачивает итерируемый объект и выдаёт пары (индекс, элемент). Каждую пару вы распаковываете в две переменные. Оба примера выводят одно и то же, но вариант с enumerate() читается легче и больше в духе Python.

enumerate() со start=1 для нумерованных списков
tasks = ["Buy groceries", "Clean house", "Walk dog", "Cook dinner"]
print("Today's to-do list:")
for i, task in enumerate(tasks, start=1):
print(f" {i}. {task}")
# Output:
# Today's to-do list:
# 1. Buy groceries
# 2. Clean house
# 3. Walk dog
# 4. Cook dinner
Вывод
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() соединяет их в пары, и вы перебираете оба списка одновременно.

Перебор двух списков с zip()
names = ["Alice", "Bob", "Charlie"]
scores = [92, 85, 78]
for name, score in zip(names, scores):
result = "Pass" if score >= 80 else "Needs improvement"
print(f"{name}: {score} ({result})")
# Output:
# Alice: 92 (Pass)
# Bob: 85 (Pass)
# Charlie: 78 (Needs improvement)
Вывод
Alice: 92 (Pass)
Bob: 85 (Pass)
Charlie: 78 (Needs improvement)

zip() принимает два или больше итерируемых объекта и объединяет их поэлементно. На первой итерации вы получаете первый элемент каждого списка, на второй итерации вторые элементы, и так далее.

Объединяем три списка через zip()
# zip() works with more than two lists
first_names = ["Alice", "Bob", "Charlie"]
last_names = ["Smith", "Jones", "Brown"]
ages = [25, 30, 22]
for first, last, age in zip(first_names, last_names, ages):
print(f"{first} {last}, age {age}")
# Output:
# Alice Smith, age 25
# Bob Jones, age 30
# Charlie Brown, age 22
Вывод
Alice Smith, age 25
Bob Jones, age 30
Charlie Brown, age 22

Что такое вложенные циклы for?

Цикл for можно поместить внутрь другого цикла for. Внутренний цикл выполняется полностью на каждой итерации внешнего. Это называется вложенностью, и именно так работают с сетками, таблицами и комбинациями.

Вложенные циклы: таблица умножения
# Multiplication table (1-3)
for row in range(1, 4):
for col in range(1, 4):
result = row * col
print(f"{row} x {col} = {result}")
print() # blank line between rows
# Output:
# 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
Вывод
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 на деле! Упражнения идут от простого перебора к сочетанию циклов с инструментами, которые вы только что изучили.

Попробуйте решить каждое упражнение самостоятельно, прежде чем открывать подсказки. Настоящие навыки появляются именно тогда, когда вы застреваете и сами находите выход.

Упражнение 1: список покупок
Напишите код

Дан список продуктов. С помощью цикла for выведите каждый продукт на отдельной строке.

Ожидаемый вывод:

milk
eggs
bread
butter
groceries = ["milk", "eggs", "bread", "butter"]
# Use a for loop to print each item
Упражнение 2: сумма чисел от 1 до 10
Напишите код

С помощью range() и цикла for вычислите сумму всех чисел от 1 до 10 включительно. Выведите результат.

Ожидаемый вывод:

Sum: 55
# Calculate the sum of numbers 1 through 10 using range()
total = 0
# Write your for loop here
print(f"Sum: {total}")
Упражнение 3: предскажите вывод
Угадайте вывод

Не запуская код, предскажите, что именно он выведет. Внимательно посмотрите на аргументы range() и условие if.

Затем запустите код и сверьте свой ответ.

for num in range(1, 8, 2):
if num > 4:
print(f"{num} is big")
else:
print(f"{num} is small")
Упражнение 4: исправьте ошибку в счётчике букв
Исправьте ошибку

Этот код должен посчитать, сколько раз буква «l» встречается в строке «hello world», но в нём есть ошибки. Исправьте код, чтобы он выводил:

The letter "l" appears 3 times

Не меняйте переменную word и последнюю инструкцию print, исправьте только логику цикла.

word = "hello world"
count = 0
for char in word:
if char == "L":
count = 1
print(f'The letter "l" appears {count} times')
Упражнение 5: нумерованное меню
Напишите код

С помощью enumerate() со start=1 выведите нумерованное меню ресторана.

Ожидаемый вывод:

1. Burger - $8.99
2. Pizza - $12.50
3. Salad - $7.25
4. Pasta - $10.00
items = ["Burger", "Pizza", "Salad", "Pasta"]
prices = [8.99, 12.50, 7.25, 10.00]
# Use enumerate() and zip() to print the numbered menu
Упражнение 6: переверните строку
Напишите код

С помощью цикла for переверните строку "Python", собирая новую строку посимвольно. НЕ используйте срезы ([::-1]) и функцию reversed().

Ожидаемый вывод:

nohtyP
original = "Python"
reversed_str = ""
# Use a for loop to build the reversed string
print(reversed_str)
Упражнение 7: табель успеваемости
Напишите код

Переберите словарь grades и выведите имя каждого ученика и его буквенную оценку. Балл 90 и выше соответствует «A», 80 и выше «B», 70 и выше «C», а ниже 70 ставится «F».

Ожидаемый вывод:

Alice: 95 (A)
Bob: 82 (B)
Charlie: 67 (F)
Diana: 73 (C)
grades = {"Alice": 95, "Bob": 82, "Charlie": 67, "Diana": 73}
# Loop over the dictionary and print each student's grade

Итоги: цикл 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), вы научитесь строить циклы на основе условий, а не коллекций.

    Похожие уроки

    Урок был полезен?