Цикл for в Python: простое руководство

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

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

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

Давайте начнем!

Итерация по списку Python: синтаксис цикла for

Прежде всего, мы увидим, как использовать цикл for для перебора элементов последовательности Python.

Общий синтаксис цикла for следующий:

for {item} in {sequence}:
    {code_block}

Примечание: обязательно соблюдайте правильный отступ тела цикла (code_block в примере выше) внутри цикла for.

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

Выполнение цикла может завершиться даже до окончания последовательности, если возникнут определенные условия; мы увидим это позже в этом уроке.

В следующем примере кода показан цикл for, который выполняет итерацию по элементам списка Python:

animals = ['lion', 'tiger', 'giraffe']

for animal in animals:
    print(animal)

Вывод:

lion
tiger
giraffe

Поведение цикла for можно изменить с помощью операторов break и continue.

Использование операторов Break и Continue с циклом For в Python

Оператор break в Python останавливает выполнение цикла for и продолжает выполнение кода после цикла.

animals = ['lion', 'tiger', 'giraffe']

for animal in animals:
    if animal == 'tiger':
        break
    else:
        print(animal)

Мы используем оператор if else, чтобы выйти из цикла или вывести элемент списка на основе условия.

Вывод будет следующим, поскольку выполнение цикла for прерывается на втором элементе списка, когда значение переменной animal равно строке «tiger»:

lion

В нашем предыдущем примере мы также можем опустить оператор else:

for animal in animals:
    if animal == 'tiger':
        break
    print(animal)

А теперь давайте вернемся к утверждению «продолжить»…

Оператор continue используется для пропуска текущей итерации в цикле for и продолжения выполнения кода со следующей итерации цикла.

Давайте заменим break на continue в предыдущем примере кода и посмотрим, что произойдет:

for animal in animals:
    if animal == 'tiger':
        continue
    print(animal)

На этот раз наш код также выводит третий элемент списка, поскольку оператор continue в Python пропускает вторую итерацию, но не выходит из цикла, как это делает оператор break.

Это означает, что цикл продолжает свое выполнение и выводит третий элемент списка.

lion
giraffe

Цикл for, применяемый к кортежам и наборам

Преимущество реализации цикла for в Python заключается в том, что его можно применять к любому типу последовательности, например, к кортежу или набору.

Кортеж

animals = ('lion', 'tiger', 'giraffe')

for animal in animals:
    print(animal)

Набор

animals = {'lion', 'tiger', 'giraffe'}

for animal in animals:
    print(animal)

Вы можете видеть, что способ написания цикла for не меняется для списков, кортежей или множеств.

Единственное, что меняется, — это вывод кода при применении к набору, учитывая, что наборы неупорядочены и неиндексированы.

Прежде чем продолжить, запустите код на своем компьютере, чтобы увидеть разницу между кортежем и набором.

Цикл for, применяемый к строкам Python

Строка Python — это тоже последовательность, последовательность символов. По этой причине вы также можете применить цикл for к строке.

Давайте напишем цикл for, который перебирает символы строки:

website = 'pythonwiki.ru'

for character in website:
    print(character)

Вот что получилось:

p
y
t
h
o
n
w
i
k
i
.
r
u

Оператор print автоматически добавляет символ новой строки после каждого символа строки.

А что, если мы хотим вывести каждый символ без перевода строки?

Чтобы напечатать строку в Python без символа новой строки, можно передать аргумент end= функции print().

В этом случае мы удалим перевод строки и вставим пробел между каждым символом:

website = 'pythonwiki.ru'

for character in website:
    print(character, end=' ')

Как вы можете видеть ниже, вывод нашего кода изменился:

p y t h o n w i k i . r u

А теперь перейдем к другому типу данных…

Перебор словаря Python с помощью цикла For

Интересно, как цикл for можно использовать со словарем?

Давайте узнаем!

user_details = {'name': 'Claudio', 'nationality': 'italian'}

for user_detail in user_details:
    print(user_detail)

При запуске вы получите следующее:

name
nationality

Мы получаем обратно только ключи словаря.

Отсюда мы можем распечатать ключи и значения словаря:

for user_detail in user_details:
    print(user_detail, ":", user_details[user_detail])


[output]
name: Claudio
nationality: italian

Давайте попробуем что-нибудь другое:

for key, value in user_details:
    print(name, nationality)

Хм… не работает…

Traceback (most recent call last):
   File "/opt/python/pythonwikiru/for_loop.py", line 55, in 
     for name, nationality in user_details:
ValueError: too many values to unpack (expected 2)

Мы получаем ошибку «too many values to unpack».

Чтобы это заработало, нам нужно использовать метод словарей items(). Вот что этот метод возвращает для нашего словаря:

print(user_details.items())
dict_items([('name', 'Claudio'), ('nationality', 'italian')])

Давайте применим его к нашему циклу for, чтобы получить ключи и значения из словаря:

for key, value in user_details.items():
    print(key, ":", value)

[output]
name: Claudio
nationality: italian

Отлично, работает!

Использование оператора else в цикле for: как это сделать?

Если вы пишете программу на Python, вы можете использовать оператор else вместе с циклом for.

Вот как…

animals = ['lion', 'tiger', 'giraffe']

for animal in animals:
    print(animal)
else:
    print("For loop executed")

При использовании с циклом for код в операторе else выполняется после завершения цикла for. Единственным исключением является случай, когда оператор break останавливает выполнение цикла.

lion
tiger
giraffe
For loop executed

Теперь посмотрим, как оператор break изменяет поведение оператора else при использовании с циклом for:

animal_to_find = 'tiger'

for animal in animals:
    if animal == animal_to_find:
        print(animal_to_find,"found")
        break
else:
    print("Animal not found")

Вывод:

tiger found

Код внутри предложения else не выполняется, когда оператор break останавливает выполнение цикла for.

Давайте подтвердим, что блок else выполняется, если оператор break не выполняется:

animal_to_find = 'elephant'

for animal in animals:
    if animal == animal_to_find:
        print(animal_to_find,"found")
        break
else:
    print("Animal not found")

Результат работы нашей программы подтверждает, что:

Animal not found

Подтверждено!

Цикл for с индексом

Цикл for, который мы рассмотрели до сих пор, сильно отличается от цикла for, используемого в других языках программирования, таких как C, где индекс присутствует в определении цикла.

Python также позволяет отслеживать индекс последовательностей при выполнении цикла for.

Один из способов сделать это — использовать встроенную функцию Python range() (которая, если быть точным, как объясняется здесь, не является строго функцией).

Прежде чем использовать range() с циклом for, давайте выясним, что возвращает range():

>>> print(range(10))
range(0, 10)
>>> print(list(range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print(list(range(1,10)))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print(list(range(1,10,2)))
[1, 3, 5, 7, 9] 

Первый оператор print не говорит нам многого, поэтому, чтобы узнать, что возвращает range(), мы можем преобразовать его в список, используя встроенную функцию Python list().

Вы можете видеть, что:

  • range(10) возвращает числа от 0 до 9 (10 исключается).
  • range(1,10) возвращает числа от 1 до 9.
  • range(1, 10, 2) возвращает только нечетные числа от 1 до 9, поскольку мы передаем третий аргумент (шаг между каждым числом).

Функция range возвращает последовательность чисел, начиная с 0 по умолчанию, увеличиваясь на 1 и заканчивая числом, переданным в функцию, минус 1. Начальное значение и приращение (шаг) можно настроить.

Учитывая, что range() генерирует последовательность чисел, мы можем использовать ее для генерации индексов списка (или кортежа, или набора и т. д.) как части цикла for.

Для этого мы используем функцию range с функцией len:

animals = ['lion', 'tiger', 'giraffe']

for index in range(len(animals)):
    print(animals[index])

Попробуйте!

Другой способ отслеживания индекса последовательности в цикле for — использование функции Python enumerate.

Изучите вложенные циклы For в Python

Могут быть ситуации, в которых вам потребуется использовать цикл for внутри другого цикла.

Цикл for внутри другого цикла for называется вложенным циклом for.

Чтобы объяснить это, мы определим матрицу (список списков, содержащий числа):

matrix = [[1,2,3],[4,5,6]]

for row in matrix:
    for value in row:
        if value == 2:
            print("Number 2 found in the matrix")

[output]
Number 2 found in the matrix

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

Другой вариант — использовать функцию range() для отслеживания строк и столбцов матрицы:

for row in range(len(matrix)):
    for column in range(len(matrix[row])):
        print("Row:",row,"Column:",column,"Value:",matrix[row][column])

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

Row: 0 Column: 0 Value: 1
Row: 0 Column: 1 Value: 2
Row: 0 Column: 2 Value: 3
Row: 1 Column: 0 Value: 4
Row: 1 Column: 1 Value: 5
Row: 1 Column: 2 Value: 6

Будьте осторожны при работе с индексами во вложенных циклах, очень легко по ошибке использовать недопустимые индексы, как в следующем случае. И эти ошибки не всегда легко обнаружить:

for row in range(len(matrix)):
    for column in range(len(row)):
        print("Row:",row,"Column:",column,"Value:",matrix[row][column])

Этот код возвращает следующую ошибку:

Traceback (most recent call last):
   File "/opt/python/codefathertech/for_loop.py", line 103, in 
     for column in range(len(row)):
 TypeError: object of type 'int' has no len()

Видите, где ошибка?

Я предоставлю вам возможность выяснить это самостоятельно… 🙂

Определенная и неопределенная итерация

Небольшое отступление перед завершением этого урока…

Python предоставляет различные типы циклов:

  • for loop: основан на определенной итерации. Мы используем термин определенный, потому что блок кода или набор инструкций повторяется фиксированное количество раз.
  • while loop: основан на бесконечной итерации. В этом случае блок кода повторяется до тех пор, пока выполняется логическое условие.

Итак, теперь вы знаете, что означают эти термины, если услышите их в будущем.

Заключение

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

Подводя итог, мы рассмотрели:

  • Как выполнить цикл по последовательности в Python (список, кортеж, набор, строка, словарь).
  • Использование операторов break и continue с циклами for.
  • Использование оператора else с циклом.
  • Отслеживание индексов в циклах for с использованием функций range() и len().
  • Вложенные циклы и определенная/неопределенная итерация.