For Python. Циклы For

Основы

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

Понятие циклов

Вы ежедневно сталкиваетесь с циклами в своей повседневной жизни. Это повторяющиеся однотипные события. К примеру, походы в школу. Весь цикл – это повторение походов в школу, один поход – это итерация. У итерации есть «тело»: проснуться, умыться, одеться, почистить зубы, позавтракать, собрать портфель, дойти до школы и т. д. Итерация может прерваться – ученик почувствовал себя плохо и ушёл с уроков. Весь цикл тоже может быть прерван: ученик перешёл на домашнее обучение. В цикл могут быть вложены другие циклы: внутри итерации «поход в школу» есть цикл «посещение уроков».
Всё это есть и в программировании, в частности, в языке 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 четверть
Поступаю в ВУЗ

Оцените статью
О Python на русском языке
Добавить комментарий

Adblock
detector