Глава 12 · Множество увлекательных мини-проектов!

Проекты: консоль команд и проверка пароля

Два способа читать пользовательский ввод в цикле: команда за командой и символ за символом, накапливая состояние.

Используем
while Trueif/elif/elsebreakstringsbool
Уровень
★★★ интеграционный
Результат
текстовая консоль / проверка

Проект: консоль команд

Простое текстовое приложение с командами: help, hello, status, exit. Этот паттерн — «бесконечный цикл, читающий команды» — встречается в меню, консолях, ботах, играх и утилитах командной строки.

показать списоккомандcommand = input()нормализовать:.strip().lower()command =='exit'?ДАзавершить программуНЕТизвестнаякоманда?ДАвыполнить 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 символов, есть хотя бы одна цифра, есть хотя бы одна буква, нет пробелов.

символпо одномуcifra? / bukva?/ probel?проверкаобновить флагиhas_digit /has_letter /has_space
Перебираем строку посимвольно, накапливая три булевых флага
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, без установки
Открыть практику →