Код БарсикОсновы Python
Основы Python›C17 · Теория

Теория · C17

Вложенные данные и викторина

Разберись в теме, запусти пример и переходи к самостоятельным задачам.

РАЗБИРАЕМ ПО ШАГАМ

От идеи к работающему коду

Когда записей несколько, удобно хранить список словарей. Построим викторину, где вопросы, правильные ответы и очки лежат в данных, а правила проверки написаны один раз.

Сразу к запуску примера ↓
Барсик организует карточки вопросов в набор записей с одинаковыми полями.
Барсик организует карточки вопросов в набор записей с одинаковыми полями.
  1. 1Список записей
  2. 2Общий алгоритм
  3. 3Суммарные очки

1. Список словарей

Внешний список хранит вопросы в порядке игры, каждый внутренний словарь описывает один вопрос. У всех записей одинаковые ключи: text, answer и points.

Чтобы прочитать поле первого вопроса, сначала выбираем запись questions[0], затем поле ["text"]. Это две последовательные операции, поэтому тип данных на каждом шаге важно понимать.

Python
questions = [    {"text": "2 + 2?", "answer": "4", "points": 1},    {"text": "Столица Франции?", "answer": "париж", "points": 2},]print(questions[0]["text"])

2. Общий проход по записям

Цикл for question in questions берёт словарь целиком. Один и тот же блок подходит любому вопросу с согласованными ключами. Новая запись не требует новой ветки if для номера вопроса.

Это разделение данных и правил. Названия полей составляют внутренний договор программы. Опечатка в одном словаре может нарушить его, поэтому проверяем форму записей.

Python
questions = [{"text": "2 + 2?", "answer": "4", "points": 1}]for question in questions:    print(question["text"], "Цена:", question["points"])

3. Нормализация ответа и пустой ввод

Сравниваем очищенные строки: strip удаляет случайные пробелы по краям, casefold позволяет не учитывать регистр. Правильный ответ очищаем по тем же правилам.

Пустой ответ не должен случайно совпасть с пустым «правильным». Для этой викторины пустой ввод считаем пропуском и не начисляем очки. Проверка answer and ... делает это правило явным.

Python
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. Это позволяет повторять сценарий одинаково и замечать ошибки после изменений.

Python
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.

Один вопрос викторины

Запусти пример. Затем измени код или входные данные и проверь, как меняется вывод.

Пример входных данных

5

Ожидаемый вывод

Сколько будет 2 + 3?
Очки: 1
main.pyPython · можно менять код

Подготавливаем редактор…

Загрузка Python…

Каждый ответ — с новой строки.

Твой вывод

Здесь появится результат запуска.

Дальше — самостоятельные задачи

  1. Получить все имена из списка записей
  2. Сопоставить ответ и правильный вариант
  3. Подсчитать очки, включая пустой ответ