# Содержание

Цикл for и перебор объектов;
Функция enumerate;
Функция range (повторы кода и числа от 0 до n-1);
Функция range (перебор членов арифметической прогрессии);
Функция range (в порядке убывания и с произвольным шагом);
Упражнения;

# Цикл for и перебор объектов

Цикл for в языке Питон позволяет перебирать... почти всё, что угодно: объекты из списка, числа из арифметической прогрессии, элементы списков, буквы слов и т.п. В цикле for указывается переменная и множество значений, по которому будет пробегать переменная. Множество значений может быть задано списком, кортежем, строкой или диапазоном.

Вот простейший пример использования цикла, где в качестве множества значений используется кортеж:

i = 1 for color in 'красный', 'оранжевый', 'жёлтый', 'зелёный', 'голубой', 'синий', 'фиолетовый': print(i,'-й цвет радуги — это ', color, sep='') i += 1

Эта программа выведет все цвета радуги:

1-й цвет радуги — это красный 2-й цвет радуги — это оранжевый 3-й цвет радуги — это жёлтый 4-й цвет радуги — это зелёный 5-й цвет радуги — это голубой 6-й цвет радуги — это синий 7-й цвет радуги — это фиолетовый

В этом примере переменная color последовательно принимает значения 'красный', 'оранжевый' и т.д. В теле цикла выводится сообщение, которое содержит название цвета, то есть значение переменной color, а также номер итерации цикла — число, которое сначала равно 1, а потом увеличивается на один (инструкцией i += 1 с каждым проходом цикла).

В списке значений могут быть выражения различных типов, например:

for obj in 1, 2, 3, 'one', 'two', 'three': print(obj)

При первых трёх итерациях цикла переменная будет принимать значение типа int, при последующих трёх — типа str.

# Функция enumerate

Вернёмся к первому примеру. В случаях, когда вместе с элементами нужны также и их индексы, идеоматический подход в питоне выглядит так:

for i, color in enumerate(('красный', 'оранжевый', 'жёлтый', 'зелёный', 'голубой', 'синий', 'фиолетовый')): print(i + 1, '-й цвет радуги — это ', color, sep='')

Функция enumerate возвращает пары из порядкового номера элемента начиная с нуля и собственно самого элемента. В данном примере ещё лучше воспользоваться параметром start, тогда нумерация начнётся не с нуля, а с указанного в параметре start значения:

for i, color in enumerate(('красный', 'оранжевый', 'жёлтый', 'зелёный', 'голубой', 'синий', 'фиолетовый'), start=1): print(i, '-й цвет радуги — это ', color, sep='')

# Функция range (повторы кода и числа от 0 до n-1)

Очень часто циклы for используются либо для повторения какой-либо последовательности действий заданное число раз, либо для прохода по нескольким последовательным числам.

Для повторения цикла некоторое заданное число раз n можно использовать цикл for вместе с функцией range вот так:

for i in range(5): print('Привет, цикл!')
Привет, цикл! Привет, цикл! Привет, цикл! Привет, цикл! Привет, цикл!

А если нужно пройти по последовательным числам, то нужно просто использовать индексную переменную:

s = 0 for i in range(5): print('i =', i, 'i² =', i * i) s += i * i print('0² + 1² + ... + 4² =', s)
i = 0 i² = 0 i = 1 i² = 1 i = 2 i² = 4 i = 3 i² = 9 i = 4 i² = 16 0² + 1² + ... + 4² = 30

В качестве n в range(n) может использоваться числовая константа, переменная или произвольное арифметическое выражение (например, 2 ** 10). Если значение n равно нулю или отрицательное, то тело цикла не выполнится ни разу.

Короткий код выше эквивалентен такому:

s = 0 # начало цикла i = 0 print('i =', i, 'i² =', i * i) s += i * i i = 1 print('i =', i, 'i² =', i * i) s += i * i i = 2 print('i =', i, 'i² =', i * i) s += i * i i = 3 print('i =', i, 'i² =', i * i) s += i * i i = 4 print('i =', i, 'i² =', i * i) s += i * i # цикл окончен print('0² + 1² + ... + 4² =', s)

# Функция range (перебор членов арифметической прогрессии)

От a до b-1

Вообще слово range означает дословно «диапазон» или «ряд». Если написать её так:

for i in range(a, b): # Тело цикла

то индексная переменная i будет принимать значения от a до b - 1, то есть числа от первого параметра до второго, но обязательно не включая второй. Если же a ⩾ b, то цикл не будет выполнен ни разу.

Например, для того, чтобы просуммировать значения чисел от 1 до n можно воспользоваться следующей программой:

sum = 0 for i in range(1, n + 1): sum += i

В этом примере переменная i принимает значения 1, 2, ..., n, и значение переменной sum последовательно увеличивается на указанные значения.

# Функция range (в порядке убывания и с произвольным шагом)

Наконец, чтобы организовать цикл, в котором индексная переменная будет уменьшаться, необходимо использовать функцию range с тремя параметрами. Первый параметр задаёт начальное значение индексной переменной, второй параметр — значение, до которого будет изменяться индексная переменная (не включая его!), а третий параметр — величину изменения индексной переменной. Например, сделать цикл по всем нечётным числам от 1 до 99 можно при помощи функции range(1, 100, 2), а сделать цикл по всем числам от 100 до 1 можно при помощи range(100, 0, -1).

Более формально, цикл for i in range(a, b, d) при d > 0 задаёт значения индексной переменной i = a, i = a + d, i = a + 2 * d и так для всех значений, для которых i < b. Если же d < 0, то переменная цикла принимает все значения i > b.

# Упражнения

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

Рассмотрим пример программы с ошибкой:

n = 25 divisor = -1 for i in range(2, int(n ** 0.5)): if n % i == 0: divisor = i break if divisor < 0: print('prime') else: print('divisor', divisor) # prime

Эта программа должна проверить, является ли число 25 простым. Но результат показывает, что 25 — простое, хотя это не так. Подумайте, в чём может быть ошибка. Обратите внимание на то, что в range(a,b) правый конец диапазона не включается. В данном случае int(25**0.5) = int(5.0) = 5, поэтому цикл range(2,5) перебирает значения 2,3 и не проверяет делитель 5. Исправьте диапазон, чтобы он включал значение int(n**0.5).

Подсказка

Исправленный вариант: range(2, int(n ** 0.5) + 1).