РАЗБИРАЕМ ПО ШАГАМ
От идеи к работающему коду
Когда записей несколько, удобно хранить список словарей. Построим викторину, где вопросы, правильные ответы и очки лежат в данных, а правила проверки написаны один раз.
Сразу к запуску примера ↓
- 1Список записей
- 2Общий алгоритм
- 3Суммарные очки
1. Список словарей
Внешний список хранит вопросы в порядке игры, каждый внутренний словарь описывает один вопрос. У всех записей одинаковые ключи: text, answer и points.
Чтобы прочитать поле первого вопроса, сначала выбираем запись questions[0], затем поле ["text"]. Это две последовательные операции, поэтому тип данных на каждом шаге важно понимать.
questions = [ {"text": "2 + 2?", "answer": "4", "points": 1}, {"text": "Столица Франции?", "answer": "париж", "points": 2},]print(questions[0]["text"])2. Общий проход по записям
Цикл for question in questions берёт словарь целиком. Один и тот же блок подходит любому вопросу с согласованными ключами. Новая запись не требует новой ветки if для номера вопроса.
Это разделение данных и правил. Названия полей составляют внутренний договор программы. Опечатка в одном словаре может нарушить его, поэтому проверяем форму записей.
questions = [{"text": "2 + 2?", "answer": "4", "points": 1}]for question in questions: print(question["text"], "Цена:", question["points"])3. Нормализация ответа и пустой ввод
Сравниваем очищенные строки: strip удаляет случайные пробелы по краям, casefold позволяет не учитывать регистр. Правильный ответ очищаем по тем же правилам.
Пустой ответ не должен случайно совпасть с пустым «правильным». Для этой викторины пустой ввод считаем пропуском и не начисляем очки. Проверка answer and ... делает это правило явным.
question = {"text": "Столица Франции?", "answer": "париж", "points": 2}answer = input(question["text"]).strip().casefold()if answer and answer == question["answer"].strip().casefold(): print("Верно!")else: print("Неверно или пропуск")4. Начисление баллов
Итоговый score хранится вне цикла. За верный ответ прибавляем цену текущего вопроса, а не всегда единицу. Максимум — сумма цен всех вопросов.
Для проверки можно временно использовать готовый список ответов вместо input. Это позволяет повторять сценарий одинаково и замечать ошибки после изменений.
questions = [ {"answer": "4", "points": 1}, {"answer": "париж", "points": 2},]answers = ["4", "ПАРИЖ"]score = 0for index in range(len(questions)): question = questions[index] if answers[index].strip().casefold() == question["answer"]: score += question["points"]print("Очки:", score)Где легко ошибиться
- Перепутать индекс записи с ключом её поля.
- Начислять 1 вместо стоимости текущего вопроса.
- Нормализовать только пользовательский или только правильный ответ.
Проверь понимание: Что возвращает questions[0]: текст вопроса или словарь?
Весь первый словарь. Для текста нужно ещё обратиться к ключу text.
