Циклы

Очень часто случается, что нам надо повторить некоторые действия определенное число раз. Для этого в Python есть разные типы циклов.

Цикл for

Стандартный цикл со счётчиком выглядит так: for переменная in range(start, end, step), где значение переменной будет проходить от start(включительно) до end(не включительно) с шагом step.

for переменная in range(start, end, step) переводится с английского как: для переменной в диапазоне(начало, конец, шаг)

По умолчанию на каждой итерации цикла к значению переменной прибавляется 1, а счёт начинается c 0. Можно указать только до какого числа считать:


In [1]:
for i in range(5):  # Обратите внимание на двоеточие и отступ
    print(i)


0
1
2
3
4

Можно указать диапазон чисел (как и везде в Python, левая граница включительно, правая — не включительно):


In [2]:
for i in range(2, 5):
    print(i)


2
3
4

Пример, в котором задаётся шаг, т.е. сколько прибавлять к переменной после каждой итерации цикла:


In [3]:
for i in range(2, 10, 3):
    print(i)


2
5
8

А что будет, если левая граница больше либо равна правой?


In [4]:
for i in range(5, 2):
    print(i)

for i in range(2, 2):
    print(i)
    
# В выводе ничего нет

А если задать отрицательный шаг?


In [5]:
for i in range(5, 2, -1):
    print(i)


5
4
3

Обратите внимание, тут всё ещё левая граница включительно, правая — не включительно.

Цикл while

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


In [6]:
i = 0
while i < 5:
    i += 1
    print(i)


1
2
3
4
5

while в переводе с английского — пока

Естественно, после while может стоять любое условие.

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


In [7]:
n = int(input())

current_power, i = 1, 0
while n >= current_power:
    current_power *= 2
    i += 1

print(n, "<", current_power, "= 2 **", i)


29
29 < 32 = 2 ** 5

Операторы break, continue

Оператор break прерывает выполнение тела цикла и прерывает сам цикл:


In [8]:
i = 0
while True:
    print("before", i)
    if i == 2:
        break
    print("after", i)
    i += 1
print("after while")


before 0
after 0
before 1
after 1
before 2
after while

Оператор continue прерывает выполнение тела цикла, но сам цикл продолжает выполняться:


In [9]:
i = 0
while True:
    print("before", i)
    if i == 1:
        i += 2  # i должно поменяться, иначе цикл будет выполняться вечно
        continue
    if i == 4:
        break
    print("after", i)
    i += 1
print("after while")


before 0
after 0
before 1
before 3
after 3
before 4
after while

continue в переводе с английского — продолжить, breakпрервать

Те же самые операторы работают и для цикла for:


In [10]:
for i in range(10):
    print("before", i)
    if i == 1:
        continue
    if i == 2:
        break
    print("after", i)


before 0
after 0
before 1
before 2

В Python у цикла for также есть возможность написать ветку else. Это будет работать так: если цикл был завершен при помощи break, то ветка else выполнена не будет, в противном случае, после выполнения цикла она будет выполнена.


In [11]:
a = int(input())
for i in range(11):
    if a <= 2 ** i:
        print("a не больше чем 2 в степени", i)
        break
else:
    print("a больше чем 1024")


1025
a больше чем 1024

Такая реализация иногда заметно проще, чем заводить отдельную переменную для флага или писать if ... else.