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
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
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
Praktyka (★★★★): procent poprawnych odpowiedzi
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji