Quiz pobierający pytania z API

0

Hej, muszę napisać taki program,

Pobierać pytania z API Open Trivia DB: https://opentdb.com/api_config.php
Wyświetlać w konsoli pytania i możliwe odpowiedzi
Pobierać odpowiedź od użytkownika i sprawdzać jej poprawność
Zliczać czas potrzebny użytkownikowi na udzielenie odpowiedzi
Wyświetlać podsumowanie: liczba poprawnie udzielonych odpowiedzi, średni czas odpowiedzi na pytanie, sumaryczny czas odpowiedzi na pytanie
Nie mam pojęcia jak się do niego zabrać? Pomożecie?

0

Nie mam pojęcia jak się do niego zabrać? Pomożecie?

Masz jakiś konkretny problem, który nie wiesz jak rozwiązać, czy szukasz rekomendacji kursu do Pythona?

0

@Althorion: w wypadku tego zadania chyba kurs potrzebny, nie mam pojęcia jak zabrać się za obróbkę takich danych, w jaki sposób to wczytać, i operować na tych danych

0

Co to znaczy musisz napisać taki program? Kto Ci każe? Studia? Skoro tak to miałeś pewnie składowe tłumaczone na zajęciach. Jak nie studia to co, zadanie na rekrutacji? Tzn, że jeszcze za wcześnie. Sam sobie znalazłeś? Tzn, że też jest jeszcze za wcześnie skoro nawet nie wiesz jak się zabrać.

0

Studia, na zajęciach było o Pandas oraz Numpy oraz o obsłudze CSV

0

@mikko: u, to niedobrze. W zależności od tego, jak zaawansowana jest Twoja wiedza Pythonowa, może wystarczy Ci dokumentacja requests wsparta dokumentacją obsługi JSON-a… a jak nie, to na forum jest pewnie z temat czy dziesięć na temat źródeł do nauki Pythona od podstaw, poszukaj tam.

Służę też pomocą w konkretnych pytaniach, ale kursu od podstaw prowadzić nie mam czasu.

1
import random
import requests
import time

class Questions:
    def _raw_response(self) -> dict:
        return requests.get("https://opentdb.com/api.php?amount=10").json()

    def _shuffle_questions(self, question_set: list[dict]):
        for question in question_set:
            random.shuffle(question["answers"])

    def create_question_set(self) -> list[dict]:
        question_set: list[dict] = [
            {
                "question":result["question"],
                "answers":[*result["incorrect_answers"], result["correct_answer"]],
                "correct_answer":result["correct_answer"]
            }
            for result in self._raw_response().get("results")]
        self._shuffle_questions(question_set)
        return question_set

class Quiz:
    def __init__(self):
        self.questions = Questions()
        self.good_tries: int = 0
        self.bad_tries: int = 0
        self.average_time: float = 0

    def get_questions(self) -> list[dir]:
        return self.questions.create_question_set()

    def display_question_and_answers(self, question: str, answers: list[str]) -> None:
        print(question,
              "\n".join([f"{num}. {asnwer}" for num,asnwer in enumerate(answers, start=1)]), sep="\n")

    def user_answer(self, answers_number: int) -> int:
        start = time.time()
        answer = input("answer: ")
        while answer.isdecimal() is False or int(answer) not in range(1, answers_number+1):
            print(f"Accepts only numbers in range 1-{answers_number}")
            answer = input("answer: ")
        end = time.time()
        self.average_time += (end-start)
        return int(answer)

    def validate_user_answer(self, correct_answer: str, answer: str(int)) -> None:
        if answer == correct_answer:
            self.good_tries += 1
        else:
            self.bad_tries += 1

    def summary(self) -> None:
        all_tries: int = self.bad_tries + self.good_tries
        print(f"tries: {all_tries}",
              f"good tries: {self.good_tries}",
              f"bad tries: {self.bad_tries}",
              f"average time: {self.average_time / all_tries}",
              sep="\n",)

def main():
    quiz_instance = Quiz()

    for obj in quiz_instance.get_questions():
        question: str = obj.get("question")
        answers: list[str] = obj.get("answers")
        answers_number: int = len(answers)
        correct_answer: str = obj.get("correct_answer")

        quiz_instance.display_question_and_answers(question=question, answers=answers)
        user_answer_index: int = quiz_instance.user_answer(answers_number=answers_number) - 1
        quiz_instance.validate_user_answer(correct_answer=correct_answer, answer=answers[user_answer_index])

    quiz_instance.summary()

if __name__ == "__main__":
    main()

Klasa Questions strzela sobie getem w api, żeby wygenerować jsona z przykładowym setem pytań. Następnie filtruje potrzebne pola i tworzy listę dzienników z potrzebnymi informacjami jak pytanie, możliwe odpowiedzi, dobra odpowiedź. Struktura jsona wymaga manualnego stworzenia listy możliwych pytań, ponieważ mamy takie pola jak incorrect_answers i correct_answer. Najprościej więc jest je do siebie dodać a następnie przy pomocy shuffle, przemieszać (żeby za każdym razem kolejność była losowa. Inaczej ostatnia odpowiedź zawsze będzie tą prawidłową :D).

Klasa Quiz to już cała logika czyli wyświetlenie pytania i możliwych odpowiedzi, wczytanie odpowiedzi użytkownika (sprawdzenie, czy mieści się w odpowiednim zakresie ilości możliwych odpowiedzi), porównanie odpowiedzi użytkownika z poprawną odpowiedzią, wszystkie obliczenia o których wspomniałeś.

Za pewne można zrobić to lepiej niemniej sama logika powyższego powinna Ci trochę rozjaśnić jak można się za to zabrać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1