§6 Инструкция цикла while

Инструкции циклов

Циклы предназначены для реализации повторяющихся действий. Иными словами, циклы применяются в тех случаях, когда требуется выполнить одни и те же инструкции несколько раз. В python имеется две разновидности инструкций циклов:

  • Цикл while
  • Цикл итераций по последовательности for

Цикл while является универсальным; в python эта инструкция реализует алгоритмическую структуру «цикл с предусловием». Блок-схема:
15
Однократное выполнение инструкций цикла (шаг) называется итерацией.

Инструкция while

Инструкция цикла while в языке python имеет следующий синтаксис:

while логическое выражение:
    инструкции1
else:
    инструкции2

Пока логическое выражение истинно, будут выполняются инструкции в теле цикла. Если логическое выражение приобретает ложное значение, то будет выполнен необязательный блок после else.
Примечание. Блок else не будет выполняться, если цикл прерывается инструкцией break или continue (см. ниже). Обратите внимание, что блок else будет выполнятся и в том случае, если условие ложно изначально!
Программа 1.

i = 0
while i < 10:
    i+=1
    print(i, end=" ")
else:
    print("\nЦикл звершил свою работу!\nКоличество итераций -", i)
1 2 3 4 5 6 7 8 9 10 
Цикл звершил свою работу!
Количество итераций 10

В некоторых случаях требуется реализация «бесконечного цикла». Это можно сделать, например, таким образом:

while True:
	Инструкции

Выход из «бесконечного» цикла можно реализовать с помощью инструкций if и break (см. ниже).
В более общем случае (когда используется некоторое логическое выражение), разработчик алгоритма должен так предусмотреть изменение параметров в теле цикла, чтобы их изменение, в итоге, привело к завершению цикла (иначе говоря, к ложному условию в логическом выражении). Неверно составленный программный код может привести к «зацикливанию» (т. е. невозможности выхода из цикла).
В циклах часто приходится выполнять действия получения (накопления) суммы или произведения. Для этих целей используются накопители. Примером такого накопителя является счетчик, который увеличивает значение (считает шаги цикла) на единицу с каждой итерацией. Для использования таких накопителей переменная (целого или вещественного типа) с начальным значением "0" для накопления суммы и с начальным значением "1" для накопления произведения. Пример использования счетчика и накопителя произведения в следующей задаче.
Постановка задачи: Вывести на экран все целые степени числа 2 от 1 до 10.
Программа 2.

i = 0
p = 1
while(i < 10):
	i+=1
	p*=2
	print('{:d} ^ {:2d} = {:d}'.format(2, i, p))
2 ^  1 = 2    
2 ^  2 = 4    
2 ^  3 = 8    
2 ^  4 = 16   
2 ^  5 = 32   
2 ^  6 = 64   
2 ^  7 = 128  
2 ^  8 = 256  
2 ^  9 = 512  
2 ^ 10 = 1024 

Эту программу можно переписать с использованием операции побитового сдвига влево на 1 (количество сдвигов будет равносильно возведению в соответствующую степень числа 2). Тогда инструкцию в строке 5 нужно переписать так:

p = p << 1 # или p <<= 1

Данная операция низкоуровневая и, следовательно, выполняется гораздо быстрее. При побитовом сдвиге происходит сдвиг битов исходного числа.
Примечание: В данном примере используется форматированный вывод. Для указания того, что выводится числовой объект используется символ d - (Decimal Integer). Обратите внимание, что спецификация формата поддерживает указание символов вне фигурных скобок, которые будут выводиться вместе с указанными объектами в методе format (^ и =).
Условие выхода из цикла должно быть скалярным выражением. Все, что сказано относительно условия в инструкции if, будет справедливо и для условия цикла.
Реализации алгоритмической структуры "цикл с постусловием" в python не существует. Однако, не стоит забывать, что эти структуры вполне взаимозаменяемы.
Циклы, возможно, не были столь полезны, если бы отсутствовала возможность обработки потока данных. В следующем классе задач в теле цикла используется инструкция if. Например.
Постановка задачи. Найти сумму двузначных чисел, сумма разрядов которых кратна 3. Выведите ряд этих чисел.
Программа 3.

i = 10
s = 0
while(i < 100):
	if (i // 10 + i % 10) % 3 == 0:
		print(i, "", end = "")
		s += i
	i+=1
print("\ns =", s)
12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 
s = 1665

Рассмотрим пример с более сложным форматированием и применением логической переменной.
Постановка задачи. Вводится последовательность чисел, 0 - конец последовательности. Определить, содержит ли последовательность хотя бы два равных соседних числа. В последовательности должно быть больше 2-х чисел.
Программа 4.

i = 2
f = False
print("Введите числа последовательности:")
a = int(input("[1] => "))
b = int(input("[2] => "))
while b != 0:
	if a == b: f = True
	a = b
	i += 1
	print('[{:d}]{:^4s}' .format(i, '=>'), end='')
	b = int(input())
if f: print("Найдены равные соседи.")
else: print("Равных соседей нет.")
Введите числа последовательности:
[1] => 10 
[2] => 55
[3] => 17
[4] => 21
[5] => 60
[6] => 60
[7] => 4
[8] => 100
[9] => 0
Найдены равные соседи.

Примечание. Логические переменные применяются в качестве флагов, фиксирующих некоторое состояние объектов в программе. Их использование не обязательно, но выглядят они более элегантно и делают код более понятным.
В некоторых задачах, в качестве "источника" данных, удобно применять генератор псевдо-случайных чисел. Реализация этого генератора находится в модуле random. Этот модуль содержит довольно много различных функций. В программе 5 используется функция randint. Эта функция имеет два аргумента randint(a, b), которые, собственно, определяют отрезок из которого будут получены случайные числа: [a, b].
Разработаем с помощью цикла while и модуля random небольшую игровую программу "Угадай число!". Суть игры в том, чтобы за n-е число попыток пользователь смог угадать, какое число загадал компьютер. Если игрок не уложится в необходимое число попыток, то выиграл компьютер, иначе победил игрок.
Программа 5.

from random import randint
n = 10
k = randint(1, 100)
print("У вас", n, "попыток")
while True:
	print("Попытка", 11 - n) 
	print("Какое число загадал компьютер? -> ", end='')
	a = int(input())
	if a > k:
		print("много")
	else:
		if a < k:
			print("мало")
		else:
			print("Вы выиграли!")
			break
	n = n - 1
	if n == 0: 
		print("Вы проиграли!")
		break
У вас 10 попыток
Попытка 1
Какое число загадал компьютер? -> 50
мало
Попытка 2
Какое число загадал компьютер? -> 70
мало
...
Попытка 5
Какое число загадал компьютер? -> 99
Вы выиграли!

Инструкции break и continue

В программе 5, чтобы прервать игру, дважды используется инструкция break. Инструкция break прерывает выполнение цикла while и for и передает управление программой инструкции, следующей за блоком цикла. Пример.
Постановка задачи: Дано натуральное число n. Определить, является ли оно простым.
Программа 6.

i = 2
k = True
n = int(input("n = "))
while i <= n / 2:
	if n % i == 0:
		k = False
		break
	i+=1
print("Число", n, ("простое" if k else "не является простым"))
n = 23
Число 23 простое

Примечание. Если найден делитель числа, то нет необходимости просматривать все возможные делители числа, вплоть до граничного условия. Нужно немедленно прервать выполнение цикла.
В отличие от break - continue прерывает выполнение только текущей итерации и передает выполнение на вычисление условия. При этом инструкции, следующие за continue до конца блока, игнорируются. Данная инструкция применяется не часто, но может быть использована, например, для контроля допустимости значений в выражениях тела цикла. Требуется вывести значения функции f(x) = 1 / x с шагом 1 на отрезке от -20 до 20. Значение x == 0, в котором функция неопределена, должно быть пропущено.
Программа 7

i = -20
while i <= 20:
	if i == 0:
		i+=1
		continue
	print("{:+7.4f}".format(1/i))
	i+=1
...
-0.1667
-0.2000
-0.2500
-0.3333
-0.5000
-1.0000
+1.0000
+0.5000
+0.3333
+0.2500
+0.2000
+0.1667
...

Следует сказать, что многие разработчики стараются не использовать в циклах инструкции break и continue, так как вполне можно обойтись и без них. Однако, последние повышают читаемость программы.

Домашняя работа

  1. Зад. 3 учебника (прил.). Напишите программу, которая вводит натуральное число N и находит сумму всех натуральных чисел от 1 до N
  2. Зад. 5 учебника (прил.). Напишите программу, которая вводит натуральные числа a и b, и выводит квадраты натуральных чисел в интервале от a до b. Например, если ввести 4 и 5, программа должна вывести
    4*4=16
    5*5=25

Учебник

§58

Презентация к уроку

lesson-5 (python)-2

Добавить комментарий