Жизнь циклична. Природа циклична. Зима сменяется весной, весна - летом, затем осень с дождями и слякотью, да снова зима, которую сменяет весна. Цикл. Время: час ночи, вот уже два, три... двенадцать дня, час, два, три... Сутки проходят и заново повторяется: час, два три. Циклы, циклы, циклы.
Даже наша ходьба циклична. Сначала правую ногу вперёд, опора, потом левую вперёд, опора. Повторить двадцать раз и дойти до холодильника. Всё циклично! Завтрак, обед, ужин; работа, работа, работа, зарплата, работа, работа, работа, зарплата, раз в год отпуск. Год, второй, третий.
Жизнь циклична. Пример из уже нами изученного: дни недели. Цикл. Понедельник, вторник, среда, четверг, пятница, суббота, воскресенье. Закончили? Заново! Если пометить дни числами, как мы с вами делали, то у нас постоянный, регулярно повторяющийся ряд чисел:
1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3...
Благодаря циклам и постоянству внутрицикловых событий мы можем планировать серьёзные алгоритмы обработки данных. Вода камень точит, а цикл приводит в порядок информацию. Как вода - капля за каплей, так и цикл - команда за командой, - изменяет данные, выводя из них новые формы, структуры, содержание.
Идея циклов: при многократном повторении одних и тех же действий прийти к нужному результату. Шаг за шагом к холодильнику. Небольшими шагами, без лишних усилий, но постоянно, ритмично, уверенно - к цели.
Повторение за повторением, повторение повторения и мы получаем отсортированные данные. Видим путь из А в Б на экране автомобильного навигатора. Считаем факториал.
Что такое умножение? Сложение числа самим с собой столько раз, сколько указано множителем: тоже цикл!
2 * 4 = 2 + 2 + 2 + 2
"Многократное повторение одного и того же действия с целью получения результата": для 2 * 4 повторяем по правилу "к результату прибавлять число два четыре раза".
Чтобы научиться планировать и реализовывать циклы на языке программирования, мы должны выработать в себе умение находить небольшие, одинаковые по смыслу части общего целого. В приведённом примере 2 * 4 такая осмысленно небольшая часть - это операция +2. Повторим 4 раза и получим результат. Или операция +4, повторённая два раза.
Мы должны выработать в себе привычку дробить данные на составляющие, как число можно разделить на цифры, слово - на символы. Видеть, понимать, догадываться, изобретать формулы и алгоритмы обработки каждой из частей, чтобы в конце вычислений, в конце цикла собирать разрозненное воедино и получать результат.
Мы должны научиться находить динамические закономерности. Попробуйте найти закономерность, ответьте на вопрос: какое правило объединяет этот ряд чисел? Какое число будет на месте точки?
8 4 9 3 10 2 11 1 . 0
Ответ
2. На месте точки будет число 12.
Вспомните сообщающую, нарушил ли водитель правила дорожного движения, программу. Что, если нам нужно проконтролировать скорость не одного автомобиля, а трёх? А десяти? Будем каждый раз заново запускать программу? Ну что вы, господа, это не совсем удобно.
Именно в этом случае нам на помощь придёт цикл. Повторить программу три раза. Или десять. А мы знай себе сиди и вводи скорость каждого следующего авто. Мммм, не работа, а мечта!
ТЕРМИНОЛОГИЯ |
Терминов будет немного, но они важны. Далее по тексту стану ими оперировать. Эдакий словарь, слова из которого для кого-то станут новыми терминами.
|
Например, с помощью цикла мы можем повторить сколь угодно много раз нашу программу о превышении скорости водителями.
Также блок команд цикла называется телом цикла. |
Блочность команд цикла аналогична блочности команд в условиях. Команда, записанная не по правилам блока, считается командой вне цикла. После неё текущий цикл не продолжается ни в коем случае, заканчиваясь последней командой блока:
Цикл for:
Команда 1
Команда 2
Команда 3
Последняя команда блока
Это строка, команда которой выполнится после завершения выполнения блока команд цикла.
|
Например, первую неделю месяца мы можем назвать первой итерацией: ряд дней от 1 до 7 включительно. Следующая неделя, следующие 1, 2, 3... 7 - вторая итерация. Количеством итераций измеряют количество выполнений всех команд цикла.
|
Счётчик цикла немного сложней, потому что он необычен своей автоматичностью. Ничего, разберёмся.
|
Например, ряд чисел 0, 1, 2, 3 является итерабельным (перечисляемым). Мы можем без проблем разбить множество 0, 1, 2, 3 на составляющие его данные: соответственно это 0, потом 1, следующее 2 и последнее 3 - четыре разных числа, образующих ряд.
Подумайте: является ли итерабельной строковая переменная? Например, хранящая слово "Привет"?
Ответ
СИНТАКСИС ЦИКЛА FOR |
Цикл for на языке Python записывается следующим образом:
for ПЕРЕМЕННАЯ СЧЁТЧИК in range(КОЛИЧЕСТВО ПОВТОРЕНИЙ):
Блок команд цикла
|
Следующие программы одинаковы. Без цикла:
print("Привет!")
print("Привет!")
print("Привет!")
print("Привет!")
print("Привет!")
С циклом:
for i in range(5):
print("Привет!")
Результат работы программы:
Привет!
Привет!
Привет!
Привет!
Привет!
Технически всё выглядит просто: мы задали количество повторений, взяли команду, повторили её и получили результат. Легко? Идём дальше.
Разберёмся, как работает счётчик цикла i. Как разберёмся? Просто выведем значения счётчика на экран:
for i in range(5):
print(i)
Результат:
0
1
2
3
4
Счётчику последовательно присваиваются значения range(5), то есть ряда 0, 1, 2, 3, 4 (до 5). После чего мы выводим эти значения на экран.
РАБОТАЕМ СО СЧЁТЧИКОМ |
Следует понять и запомнить, выгравировать в памяти, что счётчик цикла можно использовать как обычную переменную, значения которой задаются автоматически языком программирования. То же самое происходит и в других языках - Java, C++, Pascal.
Python допускает изменение значения счётчика цикла в теле цикла, но после выполнения текущей итерации счётчику вновь присвоится значение, полученное из ряда range().
Проанализируем:
for i in range(10):
print("Значение i =", i, end="")
i = i * 2
print(", изменённое значение i = i * 2 =", i)
Результат:
Значение i = 0, изменённое значение i = i * 2 = 0
Значение i = 1, изменённое значение i = i * 2 = 2
Значение i = 2, изменённое значение i = i * 2 = 4
Значение i = 3, изменённое значение i = i * 2 = 6
Значение i = 4, изменённое значение i = i * 2 = 8
Значение i = 5, изменённое значение i = i * 2 = 10
Значение i = 6, изменённое значение i = i * 2 = 12
Значение i = 7, изменённое значение i = i * 2 = 14
Значение i = 8, изменённое значение i = i * 2 = 16
Значение i = 9, изменённое значение i = i * 2 = 18
Нетрудно заметить, что первое значение счётчика цикла i всегда равно значению из ряда range(10), то есть последовательно 0, затем 1, потом 2, далее 3, 4, 5, 6, 7, 8, 9.
print("Значение i =", i, end="") устанавливает модификатор конца строки. Пустые кавычки говорят о том, что модификатор будет равен пустоте. Если не указываем end="", то Python выводит на экран знак переноса строки (равнозначен нажатию клавиши Enter в текстовых редакторах). В этом случае каждый новый print() будет выводить текст с новой строки в консоли Python. |
Значение модификатора end="" можно заменить любым символом или даже строкой. Например:
print("Это ", end="изменённый модификатор end")
Наберите команду и посмотрите, что получилось.
Но вернёмся к циклам.
|
Требование использования именно этих символов не является обязательным, но будет хорошо, если вы выработаете привычку пользоваться именно ими. Хотя бы на том основании, что все достойные учебники, разумные материалы, документация, в конце концов, используют именно эти имена переменных. Вам будет привычней.
Значения счётчика цикла задаёт функция range(). В случае необходимости можно изменять её параметры, тогда с каждой итерацией будет изменяться значение счётчика цикла.
ПАРАМЕТРЫ RANGE() |
Получение числовых рядов с помощью range() дело полезное, а ещё range() называется генератором чисел заданного диапазона. Синтаксис такой:
range(x, y, z)
Когда не указан x (начальное значение), началом считается 0. В случае, когда не указан шаг изменения z, значения изменяются с шагом +1. Параметр z обязательно указываем всегда, когда x > y и нам нужно получить нисходящий ряд, то есть от большего к меньшему. |
Вывод чисел от 10 до 20 с шагом 1 (параметр шага не указан):
for i in range(10, 20):
print(i)
Результат:
10
11
12
13
14
15
16
17
18
19
Почему последнее число 19, а не 20?
Ответ
Вывод чисел от 10 до 20 с шагом 3 (параметр шага указан):
for i in range(10, 20, 3):
print(i)
Результат:
10
13
16
19
Задача: сгенерируйте ряд чисел, в котором обязательно будут два числа - число и месяц вашего рождения в правильном порядке (сначала число, потом где-то в ряду встречается месяц). Например, если вы родились 15 мая (15.05), то программа может быть следующей:
for i in range(15, 0, -5):
print(i)
Ряд чисел, в котором есть и 15, и 5, результат работы кода:
15
10
5
Сделали? Попробуйте сгенерировать ряд чисел и записать его в строку, используя модификатор end="". Итак, "Задача на смекалку"!
ЗАДАЧА НА СМЕКАЛКУ |
Напишите программу, которая выводит состоящий из 20 чисел ряд со следующей закономерностью:
8 4 9 3 10 2 11 1 12 0...
for i in range(10):
print(8 + i, 4 - i, "", end="") 8 4 9 3 10 2 11 1 12 0 13 -1 14 -2 15 -3 16 -4 17 -5 Решение:
У вас могут быть и другие решения, отличные от представленного в подсказке. Это не возбраняется. Лишь бы результат сходился.
ПРОВЕРЯЕМ ВОДИТЕЛЕЙ |
В нашем цикле счётчик цикла может не использоваться совсем. Обязательным является лишь его определение в заголовке цикла for i in range(x), но не обработка его значений в теле цикла.
Вернёмся к бедным водителям и нашей компьютерной программе, определяющей штраф за превышение скорости. Добавим к условиям ещё одно требование: пусть в самом начале программы пользователь вводит данные о том, сколько автомобилей требуется проверить. Например, 5, 10 или 25. Или 1. Или 0. Получив значение, наша программа сама сделает всё по высшему классу, даже сильно изменять код не придётся.
|
Наша программа до изменения:
speed = int(input("Введите скорость автомобиля: "))
if (speed > 60 and speed <= 200):
print("Водитель нарушает! Штраф ему, штраф!")
elif (speed > 200):
print("Это не самолёт. Такой скорости не существует.")
elif (speed == 0):
print("Автомобиль стоит на месте.")
elif (speed < 0):
print("Отрицательной скорости не существует.")
else:
print("Водитель не нарушает.")
Ввожу для работы ещё одну переменную. Называю её countAuto и она будет содержать в себе количество автомобилей, скорость которых нам нужно проверить.
countAuto = int(input("Введите количество автомобилей: "))
Зададим цикл, которым обернём весь наш предыдущий код:
for i in range(countAuto):
Здесь для параметра range() используем то число, которое введёт пользователь. Соответственно, если он введёт число 3, то Python воспримет запись как range(3). Запишем весь наш предыдущий код в цикл. Не забываем про отступы в 4 пробела.
Вот что получилось:
countAuto = int(input("Введите количество автомобилей: "))
for i in range(countAuto):
speed = int(input("Введите скорость автомобиля: "))
if (speed > 60 and speed <= 200):
print("Водитель нарушает! Штраф ему, штраф!")
elif (speed > 200):
print("Это не самолёт. Такой скорости не существует.")
elif (speed == 0):
print("Автомобиль стоит на месте.")
elif (speed < 0):
print("Отрицательной скорости не существует.")
else:
print("Водитель не нарушает.")
Результат работы:
Введите количество автомобилей: 3
Введите скорость автомобиля: 210
Это не самолёт. Такой скорости не существует.
Введите скорость автомобиля: 70
Водитель нарушает! Штраф ему, штраф!
Введите скорость автомобиля: 35
Водитель не нарушает.
Видим, что предыдущий код программы выполнился столько раз, сколько указал пользователь в строке "Введите количество автомобилей". Получилось ровно так, как и планировалось! Кто молодцы? Мы молодцы. Сегодня вечером можем позволить себе попить чай с сахаром.
ТРЕНИРОВКА |
Напишите программу, которая выводит первые 20 степеней числа 2 (от 0 до 19 включительно). Не забывайте, что для возведения в степень используется знак **, например, 2 ** 3 посчитает, чему равна двойка в третьей степени (результатом будет 8).
for i in range(20):
print("Число 2 в степени", i, "равно", 2 ** i)Решение
Напишите программу, которая спрашивает у пользователя число и выводит остаток от деления этого числа на два. Оберните программу циклом так, чтобы программа спрашивала у пользователя и выводила результат для 10 чисел.
for i in range(10):
x = int(input("Введите целое число: "))
print("Остаток от деления числа на 2:", x % 2)Решение
Напишите программу, которая контролирует погоду за месяц (31 день). Если температура отрицательная, то выводит на экран "Холодно", если равна нулю, то выводит "Ноль", если положительная, то "Тепло". Учтите, что температура не может быть меньше абсолютного нуля (-173 -273 градуса по Цельсию. Юра, большое спасибо за указание на ошибку!), и выше, например, 50 градусов.
for i in range(31):
x = int(input("Введите температуру: "))
if (x < -273 or x > 50):
print("Ошибка. Диапазон температуры не верен!")
elif (x < 0):
print("Холодно")
elif (x > 0):
print("Тепло")
else:
print("Ноль")Решение
Справились? Едем дальше!
© 2019-2024 Виктор Трофимов
|