Rozdział 12 · Wiele fascynujących mini-projektów!

Projekt: Quiz

Najważniejsza lekcja architektoniczna rozdziału: pytania to dane, a nie kod, i algorytm nie powinien się zmieniać, gdy zmieniają się dane.

Zastosowanie
listdictforinputifсчётчик
Poziom
★★★★ challenge
Rezultat
Quiz tekstowy

Co tworzymy

quiz składający się z kilku pytań: program zadaje pytanie, akceptuje odpowiedź, porównuje przy poprawnym zliczeniu liczy się punkt i pokazuje końcowy wynik.

Вопрос 1: Столица Франции?
Ваш ответ: paris
 Верно!
Вопрос 2: 7 * 8?
Ваш ответ: 54
 Неверно. Правильный ответ: 56
Счёт: 1 из 2
Przykład deterministycznego wykonania

Algorytm vs danych to główna lekcja tego projektu

Kusi, by napisać taki quiz:

Trzy pytania: logika zakodowana na stałe → dane + pętla
Pytania są „wbudowane”
question1 = „Stolica Francji?”
answer1 = "paris"
user1 = input(question1 + " ").strip().lower()
if user1 == answer1:
    score += 1

question2 = "7 * 8?"
answer2 = "56"
user2 = input(question2 + " ").strip().lower()
if user2 == answer2:
    score += 1

# ... I tak dalej przy każdym kolejnym pytaniu
Pytania – dane, algorytm jeden
questions = [
    {"question": „Stolica Francji?”, "answer": "paris"},
    {"question": "7 * 8?", "answer": "56"},
]

score = 0
for q in questions:
    user_answer = input(q["question"] + " ").strip().lower()
    if user_answer == q["answer"]:
        score += 1
Co używać dzisiaj: przechowuje pytania jako DANE (lista słowników), a nie jako powtarzający się kod. Jeśli pytań będzie 20 zamiast 2, lewa wersja musiałaby być przepisana, a prawa — po prostu uzupełniona lista. Algorytm się nie zmienia, gdy zmieniają się dane — w tym rzecz data-driven programming.
Refaktoryzacja
Przejście z lewej do prawej opcji nazywa się refaktoryzacja — poprawiamy wewnętrzną strukturę programu, nie zmieniając tego, co ma robić. Program z dwoma pytaniami zachowuje się tak samo w obu wersjach — prawa jest po prostu lepiej uporządkowana i łatwiej ją rozszerzać.

Algorytm

STARTUzyskaj następnyelement z questionsquestionTAKzapytać, porównać,policztemuNIEKONIEC
for question in questions — ten sam algorytm dla każdej liczby pytań
programquestion['question']user_answer =input()znormalizować:.strip().lower()user_answer ==question['answer']?TAKscore += 1NIEpokaż prawidłowyodpowiedź
Jedna iteracja pętli – ten blok powtarza się przez for-loop od góry, dla każdego pytania

Ostateczny Kod

viktorina.py
questions = [
    {"question": „Stolica Francji?”, "answer": "paris"},
    {"question": "7 * 8?", "answer": "56"},
    {"question": „Języka, którego się uczymy?”, "answer": "python"},
]

score = 0
for q in questions:
    user_answer = input(q["question"] + " ").strip().lower()
    if user_answer == q["answer"]:
        print(„✅ Poprawnie!”)
        score += 1
    else:
        print(f"❌ Błędnie. Poprawna odpowiedź: {q['answer']}")

print(f"Ocena: {score} z {len(questions)}")

Poziom 4: Wskaźnik poprawnych odpowiedzi

viktorina_procent.py
procent = score / len(questions) * 100
print(f"Wynik: {procent:.0f}%")

Debug Lab

Co się stanie, jeśli usuniesz .strip().lower() podczas normalizacji Odpowiedź?

„Paris” i „paris” — różne łańcuch znaków
Bez normalizacji przypadki i dodatkowe space sprawiają, że poprawna odpowiedź jest „nieprawidłowa”
Praktyka: Quiz z listy pytań
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →
Praktyka (★★★★): procent poprawnych odpowiedzi
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →