Все встроенные коллекции в Python, такие как списки, кортежи, строки, множества и словари, объединяет то, что они являются итерируемыми объектами (англ. iterable object), то есть такими объектами, которые поддерживают возможность последовательного прохода по своим элементам. Это означает, что мы можем перебрать каждый элемент таких коллекций в цикле for:

for элемент in коллекция:
    действия_с_элементом

Основное преимущество итерируемых объектов заключается в том, что цикл for берет на себя работу по перебору элементов. Вместо того чтобы вручную обращаться к каждому элементу, мы можем последовательно перебрать каждый элемент такого объекта. 

Давайте посмотрим на простой пример:

fruits = ["Яблоко", "Банан", "Апельсин"]
for fruit in fruits:
    print(fruit)
# Вывод: Яблоко
# Вывод: Банан
# Вывод: Апельсин

Здесь цикл for проходит по каждому элементу списка fruits. На каждой итерации переменная fruit принимает значение очередного элемента списка.

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

movie = "Тор"
for char in movie:
    print(char)
# Вывод: Т
# Вывод: о
# Вывод: р

Перебор элементов словаря

По умолчанию цикл for перебирает ключи словаря:

student_data = {"Имя": "Михаил", "Фамилия": "Романов", "Возраст": 19}
for data in student_data:
    print(data)
# Вывод: Имя
# Вывод: Фамилия
# Вывод: Возраст

Последовательность значений словаря возвращает метод dict.values().

Метод

dict.values()

Описание

Возвращает последовательность значений словаря dict

Возвращаемое значение

Последовательность значений словаря

Такую последовательность можно перебрать в цикле for:

student_data = {"Имя": "Михаил", "Фамилия": "Романов", "Возраст": 19}
for data in student_data.values():
    print(data)
# Вывод: Михаил
# Вывод: Романов
# Вывод: 19

Также существует специальный метод dict.keys(), который явно возвращает последовательность ключей словаря.

Метод

dict.keys()

Описание

Возвращает последовательность ключей словаря dict

Возвращаемое значение

Последовательность ключей словаря

Результат перебора такой последовательности будет совпадать с результатом перебора самого словаря:

student_data = {"Имя": "Михаил", "Фамилия": "Романов", "Возраст": 19}
for data in student_data.keys():
    print(data)
# Вывод: Имя
# Вывод: Фамилия
# Вывод: Возраст

Однако наиболее распространенный способ перебора элементов словаря – использование метода dict.items(), который возвращает последовательность пар (ключ, значение).

Метод

dict.items()

Описание

Возвращает последовательность пар (ключ, значение) словаря dict

Возвращаемое значение

Последовательность пар (ключ, значение) словаря

В таком случае после ключевого слова for объявляется не одна, а две переменные: для ключей и для значений:

stats = {"Здоровье": 162, "Сила атаки": 34}
for key, value in stats.items():
    print(f"{key} - {value}")
# Вывод: Здоровье - 162
# Вывод: Сила атаки - 34

Здесь переменная key последовательно принимает все значения ключей словаря, а value – значений.

Перебор элементов по индексу в цикле for

Строки, списки и кортежи – это упорядоченные коллекции, то есть у каждого элемента есть свой порядковый номер (индекс), по которому можно обратиться к этому элементу. При этом индексы образуют последовательность целых чисел от 0 до индекса последнего элемента коллекции.

Перебор индексов в цикле for

Последовательность индексов любой коллекции можно создать с помощью функции range() и перебрать в цикле for. Чтобы узнать, сколько всего элементов хранится в любой встроенной коллекции, мы можем воспользоваться функцией len() (от англ. length – длина).

Функция

len(iterable)

Описание

Возвращает количество элементов в коллекции iterable

Параметры

  • iterable – итерируемый объект, количество элементов которого требуется определить

Возвращаемое значение

Целое число

Если в списке, например, 5 элементов, то его индексы представляют собой последовательность чисел от 0 до 4. Такую последовательность индексов от 0 до len() - 1 удобно сгенерировать через функцию range() и перебрать в цикле for:

heroes = ["Чип", "Дейл", "Гаечка"]
for i in range(len(heroes)):
    print(heroes[i])
# Вывод: Чип
# Вывод: Дейл
# Вывод: Гаечка

Здесь переменная i последовательно принимает значение от 0 до 2, поэтому на каждой итерации цикла мы обращаемся к соответствующему элементу коллекции heroes.

Перебор пар (индекс, значение) в цикле for

Однако для получения индекса необязательно использовать конструкцию range(len()), так как существует специальная функция enumerate(), возвращающая кортеж из номера итерации цикла (по умолчанию совпадает с индексом), и текущего значения.

Функция

enumerate(sequence, start=0)

Описание

Возвращает кортеж (счётчик, значение) для каждого элемента коллекции sequence

Параметры

  • sequence – коллекция (итерируемый объект)

Необязательные параметры:

  • start – значение, с которого начинается отсчёт. По умолчанию start=0

Возвращаемое значение

Итератор кортежей (счётчик, значение)

Все встроенные коллекции являются итерируемыми объектами, то есть их можно последовательно перебрать в цикле for. Объект, который обеспечивает этот перебор, называется итератором.

Цикл for неявно превращает итерируемый объект в итератор и затем запрашивает у него элементы один за другим. Поэтому итератор кортежей также сразу можно перебирать в цикле for. Однако в таком случае следует объявить не одну, а две переменные: для индекса и для значения:

planets = ("Кибертрон", "Татуин", "Солярис")
for index, value in enumerate(planets):
    print(f"Планета {value} находится по индексу {index}")
# Вывод: Планета Кибертрон находится по индексу 0
# Вывод: Планета Татуин находится по индексу 1
# Вывод: Планета Солярис находится по индексу 2

Для того, чтобы начать отсчёт не с 0, мы можем присвоить параметру start какое-то значение, например, 100:

celestials = ["Аришем", "Эсон", "Незарр"]
for num, value in enumerate(celestials, 100):
    print(f"Целестиал {value} под номером {num}")
# Вывод: Целестиал Аришем под номером 100
# Вывод: Целестиал Эсон под номером 101
# Вывод: Целестиал Незарр под номером 102

Перебор элементов по индексу в цикле while

Перебирать элементы упорядоченных коллекций по индексу можно не только в цикле for, но и в цикле while:

robins = ["Дик Грейсон", "Тим Дрейк", "Джейсон Тодд"]
i = 0
while i < len(robins):
    print(f"Лучший Робин - {robins[i]}")
    i += 1
# Вывод: Лучший Робин - Дик Грейсон
# Вывод: Лучший Робин - Тим Дрейк
# Вывод: Лучший Робин - Джейсон Тодд

В таком случае мы вручную управляем индексом i, увеличивая его на каждой итерации, пока не достигнем конца коллекции.

Примеры

Пример 1. Анализ продаж по категориям

Программа рассчитывает общую выручку по категориям товаров из данных за день:

sales = {
    "Электроника": 150000,
    "Одежда": 80000,
    "Книги": 35000
}
 
total = 0
for category, amount in sales.items():
    print(f"{category}: {amount} руб.")
    total += amount
 
print(f"==================\nОбщая выручка: {total} руб.") 

Вывод:

Электроника: 150000 руб.
Одежда: 80000 руб.
Книги: 35000 руб.
==================
Общая выручка: 265000 руб.

Пример 2. Поиск самой низкой температуры

Программа находит наименьшее значение в списке со среднесуточными температурами за неделю:

temperatures = [15, 12, 18, 23, 9, 16]
min_temperature = temperatures[0]
for each_temperature in temperatures:    
    if each_temperature < min_temperature:        
        min_temperature = each_temperature
 
print(f"Наименьшая температура: {min_temperature}")

Вывод:

Наименьшая температура: 9

Пример 3. Отслеживание выполнения задач по номеру

Программа выводит на экран каждую задачу из списка с её порядковым номером:

tasks = ["Написать отчет", "Отправить письма", "Запланировать встречу"]

print("Список задач:")
# Нумерация начнётся с 1, так как start=1
for index, task in enumerate(tasks, start=1):
    print(f"{index}. {task}")

Вывод:

Список задач:
1. Написать отчет
2. Отправить письма
3. Запланировать встречу

Итоги

  • Все встроенные коллекции в Python являются итерируемыми объектами, то есть такими объектами, которые поддерживает возможность последовательного прохода по своим элементам.
  • Итератор – это объект, обеспечивающий последовательный доступ к элементам итерируемого объекта. Цикл for неявно превращает итерируемый объект в итератор и затем запрашивает у него элементы один за другим.
  • Цикл for – это основной инструмент для перебора элементов коллекций.
  • Метод dict.values() возвращает последовательность значений словаря.
  • Метод dict.keys() возвращает последовательность ключей словаря.
  • Метод dict.items() возвращает последовательность пар (ключ, значение).
  • Упорядоченные коллекции (строки, списки и кортежи) можно перебирать по индексу.
  • Функция len() возвращает количество элементов в коллекции.
  • Конструкция range(len(коллекция)) создаёт последовательность индексов коллекции, которую можно перебрать в цикле for.
  • Функция enumerate() возвращает итератор кортежей (счётчик, значение).
  • Упорядоченные коллекции можно по индексу перебрать в цикл while, вручную управляя счётчиком индекса.

Задания для самопроверки

1. Дано множество unique_numbers = {5, 2, 8, 2, 9, 5}. Выведите на экран все элементы этого множества. Обратите внимание на то, что дубликаты будут выведены только один раз.

unique_numbers = {5, 2, 8, 2, 9, 5}
for number in unique_numbers:
    print(number, end=" ")
# Вывод: 8 9 2 5

2. Дан словарь city_population = {"Москва": 13149803, "Санкт-Петербург": 5597763, "Владивосток": 622782}. Для каждого города выведите на экран строку в формате "{Город} - население {количество}".

city_population = {"Москва": 13149803, "Санкт-Петербург": 5597763, "Владивосток": 622782}
for city, population in city_population.items():
    print(f"{city} - население {population}")
# Вывод: Москва - население 13149803
# Вывод: Санкт-Петербург - население 5597763
# Вывод: Владивосток - население 622782

3. Запросите у пользователя целое число n > 1 и выведите на экран все чётные числа от 2 до n включительно на одной строке через пробел.

Пример входных данных

Пример выходных данных

8

2 4 6 8

17

2 4 6 8 10 12 14 16

12

2 4 6 8 10 12

n = int(input("Введите целое число n: "))
for i in range(2, n + 1):
    if i % 2 == 0:
        print(i, end=" ")

4. Запросите у пользователя строку и выведите на экран каждой символ этой строки на одной строке через пробел. Используйте цикл while.

Пример входных данных

Пример выходных данных

Мышь

М ы ш ь

Провод

П р о в о д

Ток

Т о к

input_string = input("Введите строку: ")
i = 0
while i < len(input_string):
    print(input_string[i], end=" ")
    i += 1