Python
Цикл while в Python
Цикл while в Python повторяет код до тех пор, пока условие остается истинным. Его выбирают не тогда, когда просто хочется повторения, а когда заранее неизвестно точное количество шагов: пользователь может ввести данные с третьей попытки, файл может читаться до конца, меню должно работать до команды выхода, а игра может продолжаться, пока не выполнено условие
Если количество повторений известно заранее, чаще удобнее for. Если повторение зависит от события, ответа пользователя, состояния программы или результата проверки, чаще нужен while
По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы
Синтаксис while
Минимальная форма выглядит так:
while условие:
действие
Python сначала проверяет условие. Если оно истинное, выполняется блок с отступом. Потом условие проверяется снова. Как только условие становится ложным, цикл заканчивается и программа идет дальше
Пример со счетчиком:
count = 1
while count <= 5:
print(count)
count += 1
print('Цикл завершен')
Результат:
1
2
3
4
5
Цикл завершен
Здесь важны три части. Сначала создается переменная count, потом условие count <= 5 решает, продолжать ли цикл, затем строка count += 1 меняет значение счетчика. Если убрать последнюю строку, count навсегда останется равным 1, а цикл не закончится
Как читать while пошагово
Возьмем тот же пример и проговорим его как Python:
countравен1- Проверяем
count <= 5, это правда - Печатаем
1 - Увеличиваем
countдо2 - Возвращаемся к условию
- Повторяем до тех пор, пока
countне станет6
Когда count становится 6, условие 6 <= 5 уже ложное, поэтому блок цикла пропускается. Программа выводит Цикл завершен
Новичку полезно временно добавить строку с промежуточным выводом:
count = 1
while count <= 5:
print(f'Сейчас count = {count}')
count += 1
Так сразу видно, как меняется состояние программы. Это проще, чем пытаться держать все шаги в голове
Чем while отличается от for
for обычно идет по готовой последовательности: списку, строке, диапазону чисел, строкам файла. while работает до тех пор, пока истинно условие
Пример с for:
for number in range(1, 6):
print(number)
Пример с while:
number = 1
while number <= 5:
print(number)
number += 1
Оба примера выведут числа от 1 до 5. Но во втором варианте вы сами отвечаете за начальное значение, условие и изменение переменной. Поэтому while гибче, но с ним легче ошибиться
Практическое правило простое: если вы можете сказать «пройти по каждому элементу», используйте for. Если вы говорите «повторять, пока не случится условие», используйте while
Пример: ввод числа до правильного значения
Один из самых понятных сценариев для while — повторный запрос данных. Например, пользователь должен ввести положительное число
number = int(input('Введите положительное число: '))
while number <= 0:
print('Число должно быть больше нуля')
number = int(input('Попробуйте еще раз: '))
print(f'Принято число: {number}')
Если пользователь сразу введет 10, цикл не выполнится ни разу. Если введет 0 или -5, программа будет повторять запрос, пока значение не станет подходящим
В таком коде условие читается почти как обычная фраза: пока число меньше или равно нулю, просим повторить ввод
Пример: ограничение количества попыток
Иногда повторять бесконечно нельзя. Например, у пользователя есть только три попытки ввести пароль
password = ''
attempts = 0
while password != 'python' and attempts < 3:
password = input('Пароль: ')
attempts += 1
if password == 'python':
print('Вход выполнен')
else:
print('Попытки закончились')
В условии сразу две части:
- пароль еще неправильный
- попыток меньше трех
Цикл работает, пока обе части истинны. Как только пароль введен правильно или попытки закончились, программа выходит из цикла
Такой прием полезен в формах, консольных утилитах, тестах, маленьких ботах и учебных проектах
Бесконечный цикл и безопасный выход
Бесконечный цикл не всегда ошибка. Иногда программа должна работать постоянно, пока пользователь не выберет выход. Для этого используют while True и break
while True:
command = input('Введите команду: ')
if command == 'exit':
print('Выход')
break
print(f'Выполняю команду: {command}')
while True означает «повторять всегда». Выход происходит внутри цикла, когда команда равна exit
Такой подход подходит для меню, чатов, простых игр, обработчиков команд и задач, где действие должно повторяться до явной остановки
Главное правило: если пишете while True, рядом должен быть понятный break. Иначе программа может зависнуть в бесконечном повторении
Пример: простое меню
Меню — хороший пример, где количество повторений заранее неизвестно. Пользователь может посмотреть баланс один раз, пять раз или сразу выйти
balance = 1200
while True:
print('1 - показать баланс')
print('2 - пополнить на 100')
print('0 - выйти')
choice = input('Выбор: ')
if choice == '1':
print(f'Баланс: {balance}')
elif choice == '2':
balance += 100
print('Баланс пополнен')
elif choice == '0':
print('До свидания')
break
else:
print('Неизвестная команда')
В этом примере while держит программу живой. Каждая команда меняет состояние или выводит результат. break завершает меню только при выборе 0
while со списком и индексом
Иногда while используют для ручного движения по списку. В обычных задачах лучше взять for, но индексный while полезен, когда шаг меняется по условию
tasks = ['заявка', 'оплата', 'доставка']
index = 0
while index < len(tasks):
print(f'{index + 1}. {tasks[index]}')
index += 1
Результат:
1. заявка
2. оплата
3. доставка
Здесь условие index < len(tasks) защищает от выхода за границу списка. Если забыть index += 1, цикл будет постоянно печатать первый элемент
Частые ошибки с while
Первая ошибка — забыть изменить переменную, которая участвует в условии
count = 1
while count <= 5:
print(count)
Этот цикл бесконечный, потому что count не меняется
Вторая ошибка — поставить условие, которое с самого начала ложно
count = 10
while count <= 5:
print(count)
Такой цикл не выполнится ни разу. Это не ошибка Python, а ошибка логики
Третья ошибка — сделать условие слишком сложным. Если в while три-четыре проверки сразу, лучше вынести часть логики в отдельные переменные с понятными именами
has_attempts = attempts < 3
wrong_password = password != 'python'
while has_attempts and wrong_password:
..
Такой фрагмент нужно обновлять аккуратно, но идея полезная: сложное условие должно читаться как обычный текст
Когда while лучше не использовать
Не стоит писать while, если задача естественно решается через for
Плохо:
items = ['a', 'b', 'c']
index = 0
while index < len(items):
print(items[index])
index += 1
Проще:
items = ['a', 'b', 'c']
for item in items:
print(item)
while нужен не для того, чтобы заменить for, а для задач с условием продолжения. Чем проще код читается, тем меньше шансов ошибиться
Практические задачи
Сделайте обратный отсчет от 10 до 1, а после цикла выведите Старт
Запрашивайте имя пользователя, пока он не введет непустую строку
Напишите проверку PIN-кода с тремя попытками
Сделайте меню из трех команд: показать список задач, добавить задачу, выйти
Напишите цикл, который суммирует числа пользователя, пока он не введет 0
Для каждой задачи сначала словами опишите условие выхода. Если условие выхода не получается сформулировать, код почти наверняка получится запутанным
while нужен, когда программа должна повторять действие до выполнения условия. В нем всегда важно видеть три вещи: начальное состояние, условие продолжения и изменение состояния внутри цикла
Если цикл не заканчивается, ищите переменную, которая не меняется. Если цикл не запускается, проверяйте начальное значение и условие. Если код трудно читать, возможно, задачу лучше решить через for, функцию или более простое условие