(파이썬 OOP 이해도 높이기 )퀴즈 프로그램 만들기
오늘의 복습 내용은 퀴즈 프로그램을 만드는 것이다. 문제와 정답이 담긴 데이터를 활용하여 반복적으로 문제를 푸는 프로그램인데 객체에 익숙해지도록 한 번더 과제를 준 것 같다. 정말 헷갈리는 건 객체에 메소드 혹은 속성 이름을 쓰는 게 가끔 뭐라고 써야하는지 모르겠는데 참 어렵다.
1. 데이터 확인
- 굳이 코드로 적지 않아도 될 것 같다. 데이터는 question_data라는 변수에 리스트 형식으로 담겨 있고 리스트 안에 12개의 문제와 답이 담긴 딕셔너리가 있다.
2. 데이터 끌어오기(question_model.py)
class Question:
def __init__(self, q_text, q_answer)
self.text = q_text
self.answer = q_answer
- 각 개체에 접근할 수 있는 함수 모델링
3. main.py에 데이터 끌어오기
from data import question_data
from question_model import Question
question_bank = []
for question in question_data:
question_text = question["text"]
question_answer = question["answer"]
new_question = Question(question_text, question_answer)
question_bank.append(new_question)
- 이전에 만든 class를 활용하여 각 개체를 새로운 리스트에 추가해 추후 편하게 활용하도록 만듬
4. 퀴즈 프로세스에 필요한 함수 구성 1차 (quiz_brain.py)
class QuizBrain:
def __init__(self, q_list):
self.question_number = 0
self.question_list = q_list
def next_question(self):
current_question = self.question_list[self.question_number]
self.question_number += 1
input(f"Q.{self.question_number}: {current_question.text} (True/False): ")
- Quiz 프로세스에서 question_bank 리스트를 활용하기 위해 속성으로 추가하고 숫자 번호도 추가함. 다음으로 문제를 맞추고 다음 문제로 넘어가는 프로세스를 구성.
5. main.py에서 반복 구문을 통해 계속해서 다음 문제로 자동으로 넘어가도록 함
from question_model import Question
from data import question_data
from quiz_brain import QuizBrain
question_bank = []
for question in question_data:
question_text = question["question"]
question_answer = question["correct_answer"]
new_question = Question(question_text, question_answer)
question_bank.append(new_question)
quiz = QuizBrain(question_bank)
next_question = True
while next_question:
quiz.next_question()
- quiz 객체를 만들어주고 while 구문에 넣어주면 된다.
6. 정답 판별 및 반복 구문 종료를 위함 함수 구성
class QuizBrain:
def __init__(self, q_list):
self.question_number = 0
self.question_list = q_list
self.score = 0
def still_has_question(self):
if self.question_number < len(self.question_list):
return True
else:
return False
def next_question(self):
current_question = self.question_list[self.question_number]
self.question_number += 1
user_answer = input(f"Q.{self.question_number}: {current_question.text} (True/False): ")
self.check_answer(user_answer, current_question.answer)
def check_answer(self, user_answer, correct_answer):
if user_answer.lower() == correct_answer.lower():
print("You got it right!")
self.score += 1
else:
print("That's wrong.")
print(f"The correct answer was: {correct_answer}.")
print(f"Your current score is: {self.score}/{self.question_number}.")
print("\n")
- 실상 내가 check_answer까지는 짠다고 쳐도 next_question 함수에 넣어서 활욯하는 걸 할 수 있을지 모르겠다. 그리고 2번째 함수는 return self.question_number < len(self.question_list)로 바꿀 수 있으나 파이참에서 안되는지 모르겠다.
7. main.py에 정답 판별 및 종료 함수 적용
from question_model import Question
from data import question_data
from quiz_brain import QuizBrain
question_bank = []
for question in question_data:
question_text = question["question"]
question_answer = question["correct_answer"]
new_question = Question(question_text, question_answer)
question_bank.append(new_question)
quiz = QuizBrain(question_bank)
while quiz.still_has_question():
quiz.next_question()
print("You've completed the quiz")
print(f"Your final score was: {quiz.score}/{quiz.question_number}")
- 정말 뇌가 깨지는 줄 알았던 객체 공부였다. 사실 아직 __init__ 속성을 만들어서 활용하는게 100퍼센트로 이해되지는 않는다. 다시 강의를 봐야할듯...