Циклы for и while. Цикл for
Скачать 0.54 Mb.
|
Тема урока: цикл while Цикл while; Считывание данных до стоп значения; Бесконечный цикл; Решение задач. Аннотация. Урок посвящен циклу while. Мы научимся создавать программы, повторяющие определенные действия пока выполняется некоторое условие. Цикл while Как уже было сказано в предыдущем уроке существуют две основные разновидности цикла: циклы, повторяющиеся определенное количество раз (for, счетные циклы, counting loops); циклы, повторяющиеся до наступления определенного события (while, условные циклы, conditional loops) Мы уже рассмотрели работу цикла for, который является счетным циклом. Цикл for замечательно работает, если мы заранее знаем, сколько повторений (итераций) нам потребуется сделать. Но иногда нужно, чтобы цикл выполнялся до наступления некоторого события, и количество итераций в этом случае заранее оценить просто невозможно. И здесь на помощь приходит цикл while. Структура цикла while в Python выглядит так: while условие: блок кода Двоеточие (:) в конце строки с инструкцией while сообщает Python, что дальше находится блок команд. В блок входят все строки, расположенные с отступом от строки с инструкцией while, вплоть до следующей строки без отступа. Блок команд, который выполняется в цикле while, называется телом цикла. Рассмотрим код, использующий цикл while, который распечатает 10 раз слово Привет: i = 0 while i < 10: print('Привет') i += 1 Такой код можно легко заменить циклом for, поскольку мы заранее знаем сколько раз нужно выполнить тело цикла. Однако так бывает не всегда. Напишем программу, которая считывает числа и выводит их квадраты, пока не будет введено -1. При такой постановке задачи мы не можем воспользоваться циклом for, так как не знаем сколько чисел будет предшествовать числу -1. num = int(input()) while num != -1: print('Квадрат вашего числа равен:', num * num) num = int(input()) В качестве начального значения переменной num, мы используем первое из чисел. Далее пока выполняется условие цикла, а именно, пока введенное число не равно -1, мы исполняем тело цикла. В тело цикла входит две команды: напечатать квадрат введенного числа; считать следующее число. Важным являются два момента: правильная инициализация переменной num; изменение переменной num внутри цикла while. Важно: если не изменять переменную num внутри цикла, то можно получить так называемый бесконечный цикл, который будет выполняться бесконечно много раз. Цикл while очень похож на условный оператор if. Разница заключается в том, что в случае с условным оператором соответствующий блок кода будет выполняться только один раз, тогда как с циклом while блок кода будет выполнен многократно. Цикл for VS цикл while Мы всегда можем заменить цикл for с помощью цикла while. Следующие две программы выводят числа от 0 до 100: # используем for for i in range(101): print(i) # используем while i = 0 while i < 101: print(i) i += 1 В первом цикле переменная i последовательно принимает значения от 0 до 100. Для цикла while, нам пришлось завести самостоятельно переменную i и придать ей начальное значение. Тело цикла while содержит аналогичную инструкцию вывода print(i), однако помимо этого мы самостоятельно увеличиваем значение переменной i на 1, что делается автоматически в случае с циклом for. Напишем программу, выводящую все числа, кратные 3, используя цикл for и while: # используем for for i in range(0, 100, 3): print(i) # используем while i = 0 while i < 100: print(i) i += 3 Не всегда, однако удается заменить цикл while с помощью цикла for. Если заранее не известно количество итераций, то необходимо использовать цикл while и только его. Считывание данных до стоп значения Часто при решении задач на цикл while, мы считываем данные, до тех пор пока пользователь не введет некоторое значение, которое называют стоп значением. Напишем программу, которая считывает числа и находит их сумму, до тех пор пока пользователь не введет слово stop: text = input() total = 0 while text != 'stop': num = int(text) total += num text = input() print('Сумма чисел равна', total) Такой код будет часто использоваться при решении задач. Бесконечный цикл Всегда, кроме редких случаев, цикл while должен содержать возможность завершиться. То есть в цикле что-то должно сделать проверяемое условие ложным. Если цикл не имеет возможности завершиться, то он называется бесконечным циклом. Бесконечный цикл продолжает повторяться до тех пор, пока программа не будет прервана. Бесконечные циклы обычно появляются, когда программист забывает написать программный код внутри цикла, который делает проверяемое условие ложным. В большинстве случаев следует избегать применения бесконечных циклов. Пример бесконечного цикла: i = 0 total = 0 while i < 10: total += i Так как в теле цикла не происходит изменения переменной i, то условие i < 10 остается истинным и цикл выполняется бесконечно много раз. Бесконечные циклы можно использовать в связке с оператором прерывания break. Об этом будет рассказано в следующих уроках. Примечания Примечание 1. Цикл while получил свое название из-за характера своей работы: он выполняет некую задачу до тех пор, пока условие является истинным. Слово while на английском означает как раз "пока". Примечание 2. Цикл while называют циклом с предусловием, поскольку выполнению тела цикла предшествует проверка условия (сначала проверяется условие, а уже затем выполняется тело цикла). Примечание 3. Однократное выполнение тела цикла называется итерацией цикла. Примечание 4. Цикл while может не выполниться ни одного раза. Например, следующий код: i = -1 while i > 0: print('Hello world!') не выведет текст, поскольку условие i > 0 ложно с самого начала. Примечание 5. Графическое представление цикла while имеет вид: Примечание 6. Условие в цикле while, как и в условном операторе if, может содержать логические операции or, and, not. Вопросы: Когда цикл while проверяет свое условие: до или после того, как он выполнит итерацию? Сколько раз сообщение «Python awesome!» будет напечатано в приведенном ниже фрагменте кода? count = 10 while count < 1: print('Python awesome!') Сколько раз сообщение «Python awesome!» будет напечатано в приведенном ниже фрагменте кода? count = 1 while count < 10: print('Python awesome!') count += 1 Что покажет приведенный ниже фрагмент кода? i = 7 a = 5 while i < 11: a += i i += 2 print(a) Задачи Тема урока: цикл while Использование цикла while для обработки цифр числа; Решение задач. Аннотация. Урок посвящен обработке цифр натурального числа, с помощью цикла while. Обработка цифр числа При изучении целых чисел (тип данных int), мы говорили про операцию целочисленного деления // и операцию нахождения остатка от деления одного целого числа на другое %. Используя цикл while и две данных операции, можно обработать цифры числа с произвольным количеством разрядов (цифр). Пусть дано натуральное число n. Тогда: результатом операции n % 10 – является последняя цифра числа; результатом операции n // 10 – является число с удаленной последней цифрой. Напишем программу, которая считывает натуральное число (целое положительное) и обрабатывает его цифры. n = int(input()) while n != 0: # пока в числе есть цифры last_digit = n % 10 # получить последнюю цифру # код обработки последней цифры n = n // 10 # удалить последнюю цифру из числа Цикл while работает до тех пор пока в числе есть необработанные цифры. Тело цикла содержит: процедуру получения последней цифры last_digit = n % 10; код обработки последней цифры; процедуру удаления последней цифры из числа n = n // 10. В качестве процедуры обработки может быть все, что угодно: вывод цифр, нахождение суммы, произведения цифр, нахождение наибольшей или наименьшей цифры, подсчет цифр удовлетворяющих некоторому условию и т.д. Напишем программу, которая определяет есть ли в числе цифра 7. num = int(input()) has_seven = False # сигнальная метка while num != 0: last_digit = num % 10 if last_digit == 7: has_seven = True num = num // 10 if has_seven == True: print('YES') else: print('NO') Задачи Тема урока: break, continue, else Оператор break; Оператор continue; Бесконечные циклы; Ключевое слово else в циклах; Решение задач. Аннотация. Урок посвящен операторам break и continue, а также необязательному блоку else. Оператор прерывания цикла break Иногда бывает нужно прервать выполнение цикла преждевременно. Оператор break прерывает ближайший цикл for или while. Усовершенствуем программу, проверяющую число на простоту с помощью оператора break: Напишем программу, определяющую, что число является простым: num = int(input()) flag = True for i in range(2, num): if num % i == 0: # если исходное число делится на какое-либо отличное от 1 и самого себя flag = False break # останавливаем цикл если встретили делитель числа if flag == True: print('Число простое') else: print('Число составное') Как только мы встречаем делитель отличный от 1 и num, мы меняем значение сигнальной метки и прерываем цикл, поскольку дальнейшее его выполнение лишено смысла: число гарантированно не является простым. Оператор прерывания цикла break позволяет ускорять программы, так как мы избавляемся от лишних итераций. Напишем программу, использующую цикл for, которая считывает 10 чисел и суммирует их до тех пор, пока не обнаружит отрицательное число. В этом случае выполнение цикла прерывается командой break: result = 0 for i in range(10): num = int(input()) if num < 0: break result += num print(result) Оператор прерывания цикла break удобен в связке с сигнальными метками: когда после проверки некоторого условия нам нет смысла продолжать выполнение цикла. Напишем, программу, которая определяет, содержит ли введенное пользователем число, цифру 7. num = int(input()) number = num flag = False while num != 0: last_digit = num % 10 if last_digit == 7: flag = True break # прерываем цикл, так как число гарантированно содержит цифру 7 num //= 10 if flag == True: print('Число', number, 'содержит цифру 7') else: print('Число', number, 'не содержит цифру 7') Как только мы встретили цифру 7, мы меняем значение сигнальной метки и прерываем цикл с помощью оператора break. Мы можем и не прерывать цикл преждевременно, а дождаться его естественного завершения (условие num != 0, то есть все цифры числа обработаны), однако в таком случае мы будем совершать лишнюю работу, и в случае если число очень большое, то программа будет работать медленнее. Бесконечные циклы В предыдущих уроках мы говорили о цикле, который не имеет возможности завершиться и назвали его бесконечным циклом. Самый простой способ создать бесконечный цикл в Python – записать следующий код: while True: print('Python awesome!') Результатом выполнения такого кода будет бесконечное количество строчек текста: Python awesome! Python awesome! . . . Python awesome! Python awesome! Python awesome! Бесконечный цикл продолжает повторяться до тех пор, пока программа не будет прервана. Изучив оператор break, мы получили механизм прерывания бесконечных циклов. Возможно, вам может показаться, что бесконечные циклы лишены смысла, однако это не совсем так. Например, вы можете написать программу, которая запускается и работает, постоянно принимая запросы на обслуживание. Программный код такой программы может выглядеть так: while True: query = get_new_query() # получаем новый запрос на обработку query.process() # обрабатываем запрос Иногда с помощью бесконечного цикла удается сделать программный код более читабельным. Более простым может быть завершение цикла на основе условий внутри тела цикла, а не на основе условий в его заголовке: while True: if условие 1: # условие для остановки цикла break ... if условие 2: # еще одно условие для остановки цикла break ... if условие 3: # еще одно условие для остановки цикла break В подобных случаях, когда существует множество причин завершения цикла, часто их проще выделить из нескольких разных мест, чем пытаться указать все условия завершения в заголовке цикла. Важно: бесконечные циклы могут быть очень полезными. Просто помните, что вы должны убедиться, что цикл в какой-то момент будет прерван, чтобы он действительно не становился бесконечным. Оператор continue Другая стандартная идиома циклов — пропуск отдельных элементов при переборе. Оператор continue позволяет перейти к следующей итерации цикла for или while до завершения всех команд в теле цикла. Напишем программу, которая выводит все числа от 1 до 100, кроме чисел 7, 17, 29 и 78. for i in range(1, 101): if i == 7 or i == 17 or i == 29 or i == 78: continue # переходим на следующую итерацию print(i) Примечания Примечание 1. Оператор break прерывает выполнение ближайшего цикла, а не программы, то есть далее будет выполнена команда, следующая сразу за циклом. Примечание 2. Графическое представление операторов break и continue имеет вид: Вопросы Что покажет приведенный ниже фрагмент кода? for i in range(10): print(i, end='*') if i > 6: break Что покажет приведенный ниже фрагмент кода? n = 10 while n > 0: n -= 1 if n == 2: continue print(n, end='*') Что покажет приведенный ниже фрагмент кода? mult = 1 for i in range(1, 11): if i % 2 == 0: continue if i % 9 == 0: break mult *= i print(mult) |