В прошлый раз мы рассказывали, зачем в программировании нужны циклы. На циклах в программировании держится очень много и они есть практически во всех языках, поэтому с циклами хорошо бы разобраться уже в самом начале. Вот и разберёмся, а начнём с самого сложного вида — цикла с известным числом повторений. Если освоить его, с остальными проблем не будет. Получилось много, зато с примерами из жизни и картинками.
Вкратце о циклах
Цикл — это повторение определённых действий несколько раз, когда мы снова и снова делаем одно и то же. Например, если мы моем тарелки, то повторяем по кругу такие действия:
- Взять тарелку.
- Намылить.
- Ополоснуть.
- Поставить сушиться.
Циклы в программировании устроены так же — они заставляют программу сколько-то раз совершать одни и те же действия: производить расчёты, что-то искать или генерировать и так далее. Пока цикл работает, программа повторяет нужные нам действия, сколько бы их ни было.
В любом цикле обязательно есть два компонента:
- Условие, по которому цикл начинается, продолжается и заканчивается.
- Тело цикла — неизменный набор инструкций что-то делать.
Наши действия при мытье посуды — это тело цикла: взять тарелку → намылить → ополоснуть → поставить сушиться. И мы будем повторять их, пока выполняется какое-то условие:
- или пока мы не вымоем заданное количество тарелок;
- или пока будет оставаться грязная посуда.
Действия и условие связаны. Например, если нам нужно вымыть четыре тарелки, мы будем повторять тело цикла четыре раза. При этом каждый повтор будет приближать нас к выполнению условия. Когда условие будет выполнено, цикл закончится, а значит, мы прекратим повторять эти действия.
В упрощённом виде это работает так:
- Программа начинает работу.
- Доходит до цикла.
- Выполняет указанные действия нужное количество раз.
- Выходит из цикла и идёт выполнять дальнейший код.
Как используются циклы в программировании
Представим, что нам нужно вымыть четыре тарелки. Если бы мы не пользовались циклами, описание выглядело бы примерно так:
Взять тарелку, намылить, ополоснуть, поставить сушиться.
Взять тарелку, намылить, ополоснуть, поставить сушиться.
Взять тарелку, намылить, ополоснуть, поставить сушиться.
Взять тарелку, намылить, ополоснуть, поставить сушиться.
Теперь представим, что действий намного больше и их описание более многословное, а повторить цикл нужно не четыре, а сто раз. Получился бы очень объёмный и громоздкий код, который занимал бы много места и его было бы сложно менять и проверять. Например, если бы нам понадобилось заменить действие «поставить сушиться» на «вытереть насухо», пришлось бы вносить столько изменений, сколько раз написаны повторы.
Но если превратить это в цикл, получится более простая и лёгкая конструкция:
Повторять 4 раза:
взять тарелку, намылить, ополоснуть, поставить сушиться.
Сила циклов в том, что они помогают автоматизировать повторяющиеся задачи и упростить код. Вместо того, чтобы вручную прописывать одни и те же действия, можно описать их в виде цикла и задать ему правило для многократного выполнения. Это даёт невероятно много вариантов использования, например:
- Перебрать элементы списка или набора данных и вывести значения по указанным параметрам.
- Сложить числа — все, в заданном диапазоне, только чётные или только нечётные.
- Найти элемент в списке — минимальный, максимальный или какой-то конкретный.
- Сгенерировать последовательность чисел.
- Сравнить пары элементов из разных списков.
- Прочитать данные построчно.
Эти и другие циклы лежат в основе обработки данных, моделирования, управления интерфейсом, взаимодействия с пользователем и так далее. Вот что происходит благодаря циклам:
- Эксель создаёт сводную таблицу из нескольких, перебирая нужные ячейки по очереди.
- Игра обновляет состояние объектов на каждом кадре.
- Календарь напоминает о встрече всем её участникам.
- Сервер рассылает письма списку адресатов.
- Интернет-магазин отображает товары по критериям.
- Навигатор рассчитывает маршрут до адреса.
На циклах строится работа компьютеров, смартфонов, спутников, программ и нейросетей. Чтобы использовать циклы максимально эффективно, достаточно определить, какая логика связи условия и тела цикла больше всего подходит для конкретной задачи.
Что такое цикл с известным числом повторений
Когда нужно, чтобы программа выполнила какое-то действие конкретное количество раз, используют цикл с известным числом повторений. Допустим, у нас есть шесть грязных тарелок, которые нужно вымыть. Тогда наш цикл будет таким:
Повторять 6 раз:
взять тарелку, намылить, ополоснуть, поставить сушиться.
Если мы ошиблись с количеством и тарелок семь, последняя останется грязной, потому что мы указали недостаточно повторов. Если тарелок окажется пять, то, возможно, случится ошибка: нам нужно что-то помыть, а мыть нечего. Что делать в такой ситуации — непонятно.
Представим, как мы будем выполнять такой цикл. Начинаем отсчёт: раз — взяли первую тарелку и вымыли, два — взяли вторую тарелку и вымыли, моем так дальше, потом шесть — взяли шестую тарелку и вымыли, а после этого закончили мыть посуду.
Чтобы запрограммировать цикл с известным числом повторений, нам нужно сообщить программе, сколько раз она должна повторить указанные действия. Для этого программе нужно объяснить, с чего начать отсчёт и как его вести. А ещё после каждого повтора действий программа проверит, остались ли ещё повторения из заданного количества, и если да, цикл будет продолжаться. Если не остались — цикл закончится и программа будет выполняться дальше.
В большинстве языков программирования для циклов с известным числом повторений используют ключевое слово for
. В общем виде за ним следует такая структура:
Теперь переведём это на более понятный язык.
- С чего начать отсчёт — тут мы указываем, с какого числа будет начинаться счёт в цикле. Переменную, которая тут используется, называют переменной цикла. Если нужно, чтобы компьютер считал с единицы, указываем единицу. Крутые программисты начинают с нуля.
- Проверка: повторы остались? — Здесь мы должны объяснить циклу, как ему понять, что нужно остановиться. Для этого используют операторы сравнения: больше, меньше, равно и так далее. Пока условие верное, цикл работает. Как только условие станет ложным, цикл остановится. Ниже на примерах покажем, как это выглядит в жизни, а пока просто запоминаем.
- Как менять счётчик после повтора — мы привыкли, что во время счёта всё постоянно увеличивается на единицу, но компьютер об этом не знает. Нам нужно указать, на какое значение нужно изменять переменную цикла на каждом шаге.
Чтобы было понятнее, рассмотрим несколько примеров.
Простой цикл от меньшего к большему
Классический цикл for
— цикл с известным числом повторений с увеличением счётчика на единицу.
Представим, что нам нужно вывести на экран фразу «Привет, это журнал „Код”!» 5 раз. Дадим программе инструкции:
- Начать отсчёт с 1.
- Повторять, пока счётчик не увеличится до 6 (это значит, что цикл будет работать, пока переменная цикла меньше шести).
- Каждый раз увеличивать счётчик на единицу.
На JavaScript получится такой код:
/*
* let i = 1 — начать отсчёт с 1,
* i < 6 — условие повторения до 6 (не включая),
* i++ — увеличение i на 1 после каждого повтора
*/
for (let i = 1; i < 6; i++) {
// тело цикла
console.log("Привет, это журнал «Код»!");
}
Цикл будет работать, пока переменная i
меньше 6 — то есть будет равна сначала 1 (начало отсчёта), затем 2, затем 3, затем 4, затем 5. А вот после того, как она стала равна 5, цикл увеличит её значение на единицу (потому что мы так написали в цикле), и она станет равна 6. Перед очередным выполнением цикл проверит условие (6 < 6), поймёт, что оно не выполняется, потому что шесть не меньше шести, и в этот момент цикл закончит свою работу.
На Python всё немного проще, но на то он и Python — один из самых простых для освоения языков. Чтобы программа вывела фразу «Привет, это журнал „Код”!» 5 раз, условием станет не проверка переменной i
, а функция range()
, которая сразу даст нам нужную последовательность чисел по очереди. Например, range(5)
перебирает числа от 0 до 5 (не включая 5).
Мы привыкли вести счёт с единицы: раз, два, три и так далее. У машин иначе: они начинают с 0, потому что так можно хранить больше данных и это технически удобнее. Но при необходимости можно сказать программе начать отсчёт повторов с любого числа.
# начало отсчёта не указано явно, но подразумевается 0,
# продолжать до 5 (не включая)
# значение i последовательно увеличивается на единицу
for i in range(5):
# тело цикла
print("Привет, это журнал «Код»!")
Цикл будет работать, пока переменная i
не примет значение до 5: 0 (начало отсчёта), затем 1, затем 2, затем 3, а затем 4. После этого цикл завершится, потому что функция range(5)
после четвёрки закончит отдавать нам числа.
Цикл с обратным отсчётом
Бывает, нужно, чтобы после каждого повтора тела цикла счётчик повторений не увеличивался, а уменьшался на заданное значение. Цикл с уменьшением счётчика полезен, например, если нужно пройти по данным с конца к началу.
Допустим, мы хотим вывести на экран обратный отсчёт от 5 до 1. Нам нужно дать программе такую инструкцию:
- Начать отсчёт с 5.
- Повторять, пока счётчик не уменьшится до 1.
- Каждый раз уменьшать счётчик на единицу.
На JavaScript получится такой код:
/*
* let i = 5 — начать отсчёт с 5,
* i > 0 — повторяем до тех пор, пока переменная цикла больше нуля
* i-- — уменьшение i на 1 после каждого повтора
*/
for (let i = 5; i > 0; i--) {
// тело цикла
console.log(`Осталось: ${i}`);
}
Чтобы получить такой же результат на Python, воспользуемся функцией range(), но уточним правила её работы:
# функция range() начнёт отсчёт с 5,
# а закончит, когда дойдёт до 0 (не включая)
for i in range(5, 0, -1):
# тело цикла
print(f"Осталось: {i}")
А как считать с шагом больше 1?
Если нужно работать не с каждым нумерованным элементом подряд, а, например, только с каждым вторым, используют циклы с известным числом повторений с заданным шагом больше 1. Шаг может быть положительным (счётчик станет увеличиваться) или отрицательным (уменьшаться).
Выведем на экран каждое второе число в диапазоне от 0 до 10. На JavaScript код будет таким:
/*
* let i = 0 — начать отсчёт с 0,
* i <= 10 — условие повторения до 10 включительно,
* i += 2 — увеличение i на 2 после каждого повтора
*/
for (let i = 0; i <= 10; i += 2) {
// тело цикла
// выводим текущее значение i
console.log(`Число: ${i}`);
}
А на Python — таким:
# начало отсчёта с 0,
# продолжать до 11 (не включая),
# функция range() на каждом шаге увеличивает значение i на 2
for i in range(0, 11, 2):
# тело цикла
print(f"Число: {i}")
Как работать с конкретными элементами
Заданный шаг позволяет отбирать элементы по какой-то системе: каждый второй, пятый и так далее. Если системы нет, указывают номера элементов, над которыми нужно совершить действия цикла.
Представим, что у нас есть кратные десяти числа от 10 до 160, и мы хотим узнать, какие числа соответствуют третьему, восьмому и пятнадцатому по счёту из этого массива. Массив — это набор элементов, которые хранятся в памяти компьютера последовательно. За счёт этой особенности каждый элемент массива можно идентифицировать по его индексу, то есть номеру. Если что — нумерация в массивах начинается с 0, и третий элемент в массиве с точки зрения компьютера — это четвёртый с точки зрения обычного человека.
Чтобы было проще, напишем код на Python. Можно, конечно, сделать это и на JavaScript, но Python в этом плане более наглядный:
# наш массив чисел
arr = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]
# индексы, с которыми нужно работать
indices = [3, 8, 15]
# выбираем элементы массива с указанными индексами
for index in indices:
# тело цикла
print(f"Элемент на индексе {index}: {arr[index]}")
Что важно помнить
Подытожим основные особенности цикла с известным числом повторений:
- Количество повторений заранее известно и фиксировано.
- Такой цикл позволяет задать начальное значение, условие продолжения и изменение счётчика.
Цикл с известным числом повторений зависит от того, насколько правильно определено условие. Если оно указано неверно, цикл может выполниться больше или меньше раз, чем нужно. Например, когда мы указываем условие i < 5
, нужно понимать, что это не будет включать 5.
👉 Счёт и нумерация элементов начинаются с 0.
Индекс не должен выходить за пределы того, с чем мы работаем, иначе это приведёт к ошибке программы. Например, если мы задаём семь повторов цикла, но у нас всего шесть элементов, программа не сможет обратиться к седьмому из них, выдаст ошибку и сразу остановится.
При создании цикла нужно прописать условие прекращения — момент, на котором цикл остановится. Если этого не сделать, цикл будет выполняться бесконечно. Правда, иногда бывает так, что это нужно специально, например если программа должна постоянно отслеживать температуру или статус датчиков. В наших проектах мы тоже пару раз делали бесконечный цикл, когда писали игры: в них программа постоянно отрисовывала новые кадры для вывода на экран.
Что дальше
В следующий раз продолжим знакомиться с самыми распространёнными видами циклов в программировании: циклом с предусловием и циклом с постусловием. Подпишитесь, чтобы не пропустить.