# Содержание
Цикл for и перебор объектов;Функция enumerate;
Функция range (повторы кода и числа от 0 до n-1);
Функция range (перебор членов арифметической прогрессии);
Функция range (в порядке убывания и с произвольным шагом);
Упражнения;
for и перебор объектовЦикл for в языке Питон позволяет перебирать... почти всё, что угодно: объекты из списка, числа из арифметической прогрессии, элементы списков, буквы слов и т.п.
В цикле for указывается переменная и множество значений, по которому будет пробегать переменная.
Множество значений может быть задано списком, кортежем, строкой или диапазоном.
Вот простейший пример использования цикла, где в качестве множества значений используется кортеж:
Эта программа выведет все цвета радуги:
В этом примере переменная color последовательно принимает значения 'красный', 'оранжевый' и т.д.
В теле цикла выводится сообщение, которое содержит название цвета, то есть значение переменной color,
а также номер итерации цикла — число, которое сначала равно 1,
а потом увеличивается на один (инструкцией i += 1 с каждым проходом цикла).
В списке значений могут быть выражения различных типов, например:
При первых трёх итерациях цикла переменная будет принимать значение типа int,
при последующих трёх — типа str.
enumerateВернёмся к первому примеру. В случаях, когда вместе с элементами нужны также и их индексы, идеоматический подход в питоне выглядит так:
Функция enumerate возвращает пары из порядкового номера элемента начиная с нуля и собственно самого элемента.
В данном примере ещё лучше воспользоваться параметром start, тогда нумерация начнётся не с нуля, а с указанного в параметре start значения:
range (повторы кода и числа от 0 до n-1)Очень часто циклы for используются либо для повторения какой-либо последовательности действий
заданное число раз, либо для прохода по нескольким последовательным числам.
Для повторения цикла некоторое заданное число раз n можно использовать цикл for
вместе с функцией range вот так:
А если нужно пройти по последовательным числам, то нужно просто использовать индексную переменную:
В качестве n в range(n) может использоваться числовая константа, переменная или произвольное арифметическое
выражение (например, 2 ** 10).
Если значение n равно нулю или отрицательное, то тело цикла не выполнится ни разу.
Короткий код выше эквивалентен такому:
range (перебор членов арифметической прогрессии)Вообще слово range означает дословно «диапазон» или «ряд».
Если написать её так:
то индексная переменная i будет принимать значения от a до ,
то есть числа от первого параметра до второго, но обязательно не включая второй.
Если же a ⩾ b, то цикл не будет выполнен ни разу.
Например, для того, чтобы просуммировать значения
чисел от 1 до n можно воспользоваться следующей программой:
В этом примере переменная i принимает значения 1, 2, ..., n, и значение переменной
sum последовательно увеличивается на указанные значения.
range (в порядке убывания и с произвольным шагом)Наконец, чтобы организовать цикл, в котором индексная переменная будет уменьшаться, необходимо использовать функцию range с тремя параметрами.
Первый параметр задаёт начальное значение индексной переменной, второй параметр — значение, до которого будет
изменяться индексная переменная (не включая его!), а третий параметр — величину изменения индексной переменной.
Например, сделать цикл по всем нечётным числам от 1 до 99 можно при помощи функции , а сделать цикл по всем числам от 100 до 1 можно при помощи .
Более формально, цикл при d > 0 задаёт значения
индексной переменной i = a, i = a + d, i = a + 2 * d и так
для всех значений, для которых i < b. Если же d < 0, то переменная
цикла принимает все значения i > b.
При написании программ очень часто оказывается, что программа работает неправильно. В ней нужно найти и исправить ошибку. Ошибки являются неотъемлемой частью написания кода, поэтому нужно уметь их искать и исправлять.
Рассмотрим пример программы с ошибкой:
Эта программа должна проверить, является ли число 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).