while
¶С циклом for
мы уже знакомы. Сейчас мы познакомимся с циклом while
, логика которого отличается от for
. Конструкции с циклом while
устроены следующим образом: действия, которые указаны в теле цикла, должны выполняться до тех пор, пока верно условие, прописанное после while
(отсюда и название). Если в цикле for
мы указывали некоторый промежуток, по которому в ходе цикла мы будем "пробегаться", то в случае с циклом while
мы просто фиксируем стартовую точку, а конечную точку никак не указываем: программа сама остановится, когда условие в цикле перестанет выполняться.
nums = [1, 0, 9, 10, -1, 8]
Давайте, используя цикл while
, будем выводить на экран элементы списка nums
до тех пор, пока не столкнемся с отрицательным значением.
i = 0 # начинаем с индекса i=0
while nums[i] >= 0: # пока элемент nums[i] >= 0
print(nums[i]) # выводим элемент на экран
i = i + 1 # переходим к следующему элементу
1 0 9 10
На значении 10 мы остановились: за ним идет значение -1, для которого условие nums[i] > = 0
не выполняется.
Давайте теперь попробуем переписать код так, чтобы он работал точно так же, но только чтобы в нем использовался цикл for
, а не while
. Вообще почти любой код с while
можно переписать через for
, и иногда это полезно: код с циклом while
обычно более медленный, плюс, склонен к зацикливанию.
for n in nums:
if n >= 0:
print(n)
else:
break # выходим из цикла
1 0 9 10
В коде выше мы использовали оператор break
, который позволяет выйти из цикла, то есть закончить исполнение строк кода в теле цикла и перейти к коду дальше.
А теперь напишем маленькую игру-угадайку. Программа будет загадывать целое число от 1 до 100, а пользователь его угадывать. Как программа будет загадывать число? Выбирать случайным образом из интервала [1, 100] (на самом деле псевдослучайным образом, так как абсолютной случайности не получится, генерирование чисел происходит по фиксированным алгоритмам).
from random import randrange # импортируем функию randrange
n = randrange(1, 101) # n и есть загаданное число
Осталось написать цикл. До тех пор, пока пользователь не угадает число, программа не будет останавливаться, но зато она будет давать подсказки: если введенное пользователем число больше загаданного, то будет выводиться сообщение "Вы ввели слишком большое число.", если меньше – "Вы ввели слишком маленькое число."
while True:
guess = int(input("Ваша попытка: "))
if guess == n:
print("Вы выиграли!")
break
elif guess > n:
print("Вы ввели слишком большое число.")
else:
print("Вы ввели слишком маленькое число.")
Ваша попытка:53 Вы ввели слишком большое число. Ваша попытка:32 Вы ввели слишком маленькое число. Ваша попытка:44 Вы ввели слишком маленькое число. Ваша попытка:47 Вы ввели слишком маленькое число. Ваша попытка:52 Вы ввели слишком большое число. Ваша попытка:51 Вы ввели слишком большое число. Ваша попытка:49 Вы ввели слишком маленькое число. Ваша попытка:50 Вы выиграли!
В коде выше в while
мы не написали никакого условия явно, вместо этого мы написали while True
. Это выражение означает «до тех пор, пока мы не вышли из цикла». В нашем случае это равносильно «до тех пор, пока не столкнулись с break
», то есть пока наш ответ не совпал с загаданным числом.