Храним вопросы: список словарей

Угадайка позади, и ты уже умеешь главное: бот помнит и считает. Соберём из этого квиз. Бот задаёт вопросы с вариантами, проверяет ответ и ведёт счёт. Таким ботом реально хочется поделиться: сделай квиз по любимой игре, по своему классу, по фильму.

После урока сможешь: объяснить тему «Храним вопросы: список словарей» и выполнить связанный с ней учебный шаг без подсказки.

Большой бот пишется по кусочкам. Сегодня первый кусок: как красиво хранить вопросы и показать один из них с кнопками.

Один вопрос это словарь

У каждого вопроса три части: текст, варианты ответа и какой из них верный. Это просится в словарь, пары «ключ значение»:

{"text": "Сколько бит в одном байте?", "varianty": ["4", "8", "16"], "otvet": "8"}

Читается как анкета. Поле text это сам вопрос, varianty это список ответов, otvet это правильный.

Много вопросов это список словарей

Вопрос не один, значит сложим их в список. Получится список словарей: каждый элемент это один вопрос-анкета.

voprosy = [
    {"text": "Какой тег задаёт заголовок в HTML?", "varianty": ["<h1>", "<p>", "<a>"], "otvet": "<h1>"},
    {"text": "Сколько бит в одном байте?", "varianty": ["4", "8", "16"], "otvet": "8"},
    {"text": "На каком языке мы пишем ботов?", "varianty": ["Python", "Java", "C++"], "otvet": "Python"},
]

Красота в том, что добавить вопрос проще простого: дописал ещё один словарь в список, и всё. Код трогать не надо. Достать нужное легко: voprosy[0] это первый вопрос, voprosy[0]["text"] это его текст, voprosy[0]["varianty"] это список его вариантов.

Показываем вопрос с кнопками

Покажем первый вопрос, а варианты сделаем inline-кнопками из Модуля 2. Каждая кнопка это один вариант:

import telebot
from telebot import types
from config import TOKEN

bot = telebot.TeleBot(TOKEN)

voprosy = [
    {"text": "Какой тег задаёт заголовок в HTML?", "varianty": ["<h1>", "<p>", "<a>"], "otvet": "<h1>"},
    {"text": "Сколько бит в одном байте?", "varianty": ["4", "8", "16"], "otvet": "8"},
    {"text": "На каком языке мы пишем ботов?", "varianty": ["Python", "Java", "C++"], "otvet": "Python"},
]

@bot.message_handler(commands=['start'])
def start(message):
    vopros = voprosy[0]
    keyboard = types.InlineKeyboardMarkup()
    for variant in vopros["varianty"]:
        keyboard.add(types.InlineKeyboardButton(variant, callback_data=variant))
    bot.send_message(message.chat.id, vopros["text"], reply_markup=keyboard)

bot.infinity_polling()

Главное тут цикл for variant in vopros["varianty"]. Он проходит по списку вариантов и на каждый делает кнопку. Три варианта, три кнопки. callback_data=variant кладёт в метку сам текст варианта, чтобы потом понять, что нажали.

Контрольный вопрос. Один вопрос квиза хранят в словаре с ключами text, varianty и ещё одним — с правильным ответом. Напиши этот третий ключ.

Подсказка: {«text»:…, «varianty»:…, «____»:…}

Онлайн-проверка ответа появится позже

Задание. Сделай список voprosy из 3-5 своих вопросов на свою тему и покажи первый вопрос с вариантами-кнопками на /start. Пришли скриншот, где бот показывает вопрос и кнопки.

Подсказка: Каждый вопрос — словарь с полями text, varianty, otvet. Кнопки строй циклом по varianty.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Зачёт, если:
✅ список voprosy из 3-5 своих вопросов готов;
✅ на /start бот показывает первый вопрос с кнопками-вариантами;
✅ прислан скриншот вопроса и кнопок.

Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева