Глава 12 · Множество увлекательных мини-проектов!
Проекты: консоль команд и проверка пароля
Два способа читать пользовательский ввод в цикле: команда за командой и символ за символом, накапливая состояние.
Используем
while Trueif/elif/elsebreakstringsboolУровень
★★★ интеграционный
Результат
текстовая консоль / проверка
Проект: консоль команд
Простое текстовое приложение с командами: help,
hello, status,
exit. Этот паттерн — «бесконечный цикл, читающий команды» —
встречается в меню, консолях, ботах, играх и утилитах командной строки.
konsol_komand.py
history = []
while True:
command = input("> ").strip().lower()
history.append(command)
if command == "exit":
print("До встречи!")
break
elif command == "help":
print("Команды: help, hello, status, exit")
elif command == "hello":
print("Привет!")
elif command == "status":
print(f"Команд выполнено: {len(history)}")
else:
print(f"Неизвестная команда: {command}")
> help
Команды: help, hello, status, exit
> hello
Привет!
> exit
До встречи!
history — обычный список
history копит все введённые команды в порядке поступления — ровно то, для чего создан список (глава 11): упорядоченная, изменяемая коллекция.Проект: проверка имени пользователя / пароля
Это учебное упражнение по строкам, а не защита данных
Ниже — тренировка работы со строками и булевыми флагами, а НЕ полноценная политика безопасности паролей. Настоящая защита учётных записей требует значительно большего (хеширование, соль, менеджеры паролей, лимиты попыток) — тем этого курса пока не касаемся.
Правила (учебные): минимум 8 символов, есть хотя бы одна цифра, есть хотя бы одна буква, нет пробелов.
validator_parolya.py
password = input("Придумайте пароль: ")
has_digit = False
has_letter = False
has_space = False
for ch in password:
if ch.isdigit():
has_digit = True
elif ch.isalpha():
has_letter = True
elif ch == " ":
has_space = True
dlinnyj_dostatochno = len(password) >= 8
if dlinnyj_dostatochno and has_digit and has_letter and not has_space:
print("Пароль подходит под учебные правила.")
else:
print("Пароль не подходит:")
if not dlinnyj_dostatochno:
print("- слишком короткий (нужно 8+ символов)")
if not has_digit:
print("- нет ни одной цифры")
if not has_letter:
print("- нет ни одной буквы")
if has_space:
print("- содержит пробел")
Накопление состояния через булевы флаги
has_digit, has_letter и has_space — это накопители (глава 10), только булевы: каждый символ может ПЕРЕКЛЮЧИТЬ флаг в True, и он остаётся True до конца перебора.Debug Lab
Если использовать elif вместо трёх отдельных
if при проверке символа — некоторые символы могут обрабатываться
неправильно. Например, что если правило было бы «есть спецсимвол»?
elif проверяет только одну ветку на символ
Пока правила взаимоисключающие (цифра/буква/пробел — символ не может быть сразу двумя из них),
elif работает верно. Но если добавить проверку ещё одного, НЕ взаимоисключающего свойства (например, «является заглавной буквой»), её нужно проверять отдельным if, а не веткой в той же цепочке elif.Практика: консоль команд с историей
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Практика: проверка пароля по учебным правилам
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки