Цикл 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.- r
ange(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()
. - Вложенные циклы и определенная/неопределенная итерация.