Одним из важнейших компонентов алгоритмического мышления, а значит, и языков программирования является цикл. Вы будете сталкиваться с ними множество раз в своей работе. С одним из видов циклов мы познакомим Вас в этом уроке.
Понятие циклов
Вы ежедневно сталкиваетесь с циклами в своей повседневной жизни. Это повторяющиеся однотипные события. К примеру, походы в школу. Весь цикл – это повторение походов в школу, один поход – это итерация. У итерации есть «тело»: проснуться, умыться, одеться, почистить зубы, позавтракать, собрать портфель, дойти до школы и т. д. Итерация может прерваться – ученик почувствовал себя плохо и ушёл с уроков. Весь цикл тоже может быть прерван: ученик перешёл на домашнее обучение. В цикл могут быть вложены другие циклы: внутри итерации «поход в школу» есть цикл «посещение уроков».
Всё это есть и в программировании, в частности, в языке Python. В Питоне есть два вида циклов: for и while.
Базовый синтаксис
Цикл for в Пайтон используется для работы с последовательностями или если число итераций известно заранее. Синтаксис выглядит следующим образом:
for [элемент] in [последовательность]:
[список операций]
Цикл for может принимать данные разных типов: int, str, bool и другие. Рассмотрим пример:
for i in 8, 3.14, 'PI', True:
print(i)
# Вывод:
8
3.14
PI
True
Как вывести отдельные буквы строки
Так как цикл for перебирает элементы какой-либо коллекции значений, Вы можете итерировать значения (символы) строки.
for i in 'Вы ведь помните, что строка – это тоже последовательность?':
print(i, end='_')
# Вывод:
В_ы_ _в_е_д_ь_ _п_о_м_н_и_т_е_,_ _ч_т_о_ _с_т_р_о_к_а_ _–_ _э_т_о_ _т_о_ж_е_ _п_о_с_л_е_д_о_в_а_т_е_л_ь_н_о_с_т_ь_?_
Использование цикла for для перебора списка или кортежа
Так же просто можно осуществлять перебор элементов других видов последовательностей:
# Список
for i in [1, 2.3, 'четыре']:
print(i,)
# Кортеж
for i in (1, 2.3, 'четыре'):
print(i,)
# Множество
for i in {1, 2.3, 'четыре'}:
print(i,)
# Словарь
for i in {1: 2, 3: 'четыре'}:
print(i,)
# Вывод:
1
2.3
четыре
1
2.3
четыре
1
2.3
четыре
1
3
Для этих целей можно даже использовать такие инструменты, как списковые включения:
for i in [i**2 for i in range(6)]:
print('*'*i)
# Вывод:
*
****
*********
****************
*************************
Использование с функцией range
Цикл for может перебирать любые последовательности, в том числе, сгенерированные функцией range(), что бывает крайне удобно. Напомню, данная функция возвращает коллекцию последовательных значений, а принимает начальное, конечное значение и размер шага между членами последовательности.
print(*range(5, 50, 5), sep=', ')
# Вывод:
5, 10, 15, 20, 25, 30, 35, 40, 45
for i in 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11:
print(f'Иду в {i}-й класс')
# Вывод:
Иду в 1-й класс
Иду в 2-й класс
Иду в 3-й класс
Иду в 4-й класс
Иду в 5-й класс
Иду в 6-й класс
Иду в 7-й класс
Иду в 8-й класс
Иду в 9-й класс
Иду в 10-й класс
Иду в 11-й класс
Уже догадались? Да, вместо того, чтоб перечислять все значения счётчика, можно использовать функцию range():
for i in range(1, 12):
print(f'Иду в {i}-й класс')
# Вывод:
Иду в 1-й класс
Иду в 2-й класс
Иду в 3-й класс
Иду в 4-й класс
Иду в 5-й класс
Иду в 6-й класс
Иду в 7-й класс
Иду в 8-й класс
Иду в 9-й класс
Иду в 10-й класс
Иду в 11-й класс
Вложенный цикл
Как уже говорилось, внутри цикла может быть вложен ещё один (и даже не один) цикл. И так, ходим в школу:
for i in range(1, 12):
for a in range(1, 5):
print(f'Иду в {i}-й класс, {a} четверть')
# Вывод:
Иду в 1-й класс, 1 четверть
Иду в 1-й класс, 2 четверть
Иду в 1-й класс, 3 четверть
Иду в 1-й класс, 4 четверть
Иду в 2-й класс, 1 четверть
Иду в 2-й класс, 2 четверть
Иду в 2-й класс, 3 четверть
Иду в 2-й класс, 4 четверть
Иду в 3-й класс, 1 четверть
…
и т. д.
Вложенность может быть сколь-угодно глубокой:
for год in range(1, 12):
for месяц in range(1, 13):
for день_недели in range(1, 13):
for час in range(1, 13):
print(f'Иду в {год}-й класс, {месяц} месяц, {день_недели} день недели, {час} час')
# Вывод:
Иду в 1-й класс, 1 месяц, 1 день недели, 1 час
Иду в 1-й класс, 1 месяц, 1 день недели, 2 час
Иду в 1-й класс, 1 месяц, 1 день недели, 3 час
Иду в 1-й класс, 1 месяц, 1 день недели, 4 час
Иду в 1-й класс, 1 месяц, 1 день недели, 5 час
Иду в 1-й класс, 1 месяц, 1 день недели, 6 час
Иду в 1-й класс, 1 месяц, 1 день недели, 7 час
Иду в 1-й класс, 1 месяц, 1 день недели, 8 час
Иду в 1-й класс, 1 месяц, 1 день недели, 9 час
…
и т. д.
Будьте осторожны с вложенностью циклов. Во-первых, чем больше уровень вложенности, тем сложнее алгоритм и хуже читаемость кода. Во-вторых, чем больше вложенных циклов, тем больше итераций надо пройти программе. Их всегда будет больше, чем Вы рассчитывали изначально )) Вот наглядный пример роста количества итераций с ростом количества вложенных циклов:
def my_loop(i):
for count in range(10):
my_loop.counter += 1
if i > 0:
my_loop(i-1)
return i - 1
for i in range(8):
my_loop.counter = 0
my_loop(i)
print('При вложенности =', i, 'получается', my_loop.counter, 'итераций')
# Вывод:
При вложенности = 0 получается 10 итераций
При вложенности = 1 получается 110 итераций
При вложенности = 2 получается 1110 итераций
При вложенности = 3 получается 11110 итераций
При вложенности = 4 получается 111110 итераций
При вложенности = 5 получается 1111110 итераций
При вложенности = 6 получается 11111110 итераций
При вложенности = 7 получается 111111110 итераций
Добавляя всего один уровень вложенности (восьмой) я отправляю свой ПК в очень долгое раздумье.
Существует модуль, встроенный в стандартную библиотеку, который упрощает многие задачи, связанные с циклами (и с большой вложенностью циклов тоже). Называется он itertools.
Оператор break
А как же нам обработать ситуацию, когда надо досрочно прервать цикл? К примеру, ученик решил выпуститься из школы не в одиннадцатом, а в девятом классе. Для этого нам пригодится оператор break. Этот оператор прерывает цикл, в котором интерпретатор его встречает.
PTU = True
for i in range(1, 12):
if PTU == True and i == 10:
break
print(f'Иду в {i}-й класс')
print('Выпускной')
# Вывод:
Иду в 1-й класс
Иду в 2-й класс
Иду в 3-й класс
Иду в 4-й класс
Иду в 5-й класс
Иду в 6-й класс
Иду в 7-й класс
Иду в 8-й класс
Иду в 9-й класс
Выпускной
Обращаю ваше внимание, что break прерывает только один цикл. Если этот цикл является вложенным, то внешний цикл прерван не будет.
Оператор continue
Бывает и такая ситуация, что при каких-то условиях необходимо пропустить итерацию. К примеру, если в нумерации классов нет четвёртого, как его пропустить? На помощь приходит оператор continue:
for i in range(1, 12):
if i == 4:
continue
print(f'Иду в {i}-й класс')
print('Выпускной')
# Вывод:
Иду в 1-й класс
Иду в 2-й класс
Иду в 3-й класс
Иду в 5-й класс
Иду в 6-й класс
Иду в 7-й класс
Иду в 8-й класс
Иду в 9-й класс
Иду в 10-й класс
Иду в 11-й класс
Выпускной
Как Вы можете увидеть в последних двух примерах, и continue, и break почти всегда используются в паре с условным оператором.
Блок else
Блок else выполняется только в том случае, если цикл не завершается оператором break. К примеру, ученик может поступить в ВУЗ сразу после школы только если не прервал обучение до одиннадцатого класса:
PTU = False
for i in range(1, 12):
if PTU == True and i == 10:
break
print(f'Иду в {i}-й класс')
else:
print('Поступаю в ВУЗ')
# Вывод:
Иду в 1-й класс
Иду в 2-й класс
Иду в 3-й класс
Иду в 4-й класс
Иду в 5-й класс
Иду в 6-й класс
Иду в 7-й класс
Иду в 8-й класс
Иду в 9-й класс
Иду в 10-й класс
Иду в 11-й класс
Поступаю в ВУЗ
Заключение
Циклы в программировании, как и в обычной жизни, встречаются на каждом шагу. К счастью, работа с ними в Python очень комфортная. Для более углублённого овладения циклами рекомендую изучить модуль itertools. И, напоследок, давайте соберём нашу маленькую программу, к которой мы постепенно продвигались на протяжении всего урока:
PTU = False
for i in range(1, 12):
if PTU == True and i == 10:
break
if i == 4:
continue
for a in range(1, 5):
print(f'Иду в {i}-й класс, {a} четверть')
else:
print('Поступаю в ВУЗ')
# Вывод:
Иду в 1-й класс, 1 четверть
Иду в 1-й класс, 2 четверть
Иду в 1-й класс, 3 четверть
Иду в 1-й класс, 4 четверть
Иду в 2-й класс, 1 четверть
Иду в 2-й класс, 2 четверть
Иду в 2-й класс, 3 четверть
Иду в 2-й класс, 4 четверть
Иду в 3-й класс, 1 четверть
Иду в 3-й класс, 2 четверть
Иду в 3-й класс, 3 четверть
Иду в 3-й класс, 4 четверть
Иду в 5-й класс, 1 четверть
Иду в 5-й класс, 2 четверть
Иду в 5-й класс, 3 четверть
Иду в 5-й класс, 4 четверть
…
Иду в 8-й класс, 4 четверть
Иду в 9-й класс, 1 четверть
Иду в 9-й класс, 2 четверть
Иду в 9-й класс, 3 четверть
Иду в 9-й класс, 4 четверть
Иду в 10-й класс, 1 четверть
Иду в 10-й класс, 2 четверть
Иду в 10-й класс, 3 четверть
Иду в 10-й класс, 4 четверть
Иду в 11-й класс, 1 четверть
Иду в 11-й класс, 2 четверть
Иду в 11-й класс, 3 четверть
Иду в 11-й класс, 4 четверть
Поступаю в ВУЗ