概要
G検定の勉強をしようと思い、
ローカルで動く四択問題アプアリを作りました。
問題集としては、一般社団法人日本ディープラーニング協会が実施しているG検定を題材としました。
G検定について
Python入門者にとってはちょうどいい教材になると思います。
処理内容
ざっくりと次のようなステップです。
- csvから問題を読み込む(No, 問題文, 回答 の3列)
- 読み込んだ問題から1行目のヘッダ部分をのぞいてリストに入れる
- 問題文をランダム出力する
- 回答選択肢を4つ出す。一つは正解、残り3つは他の問題の正解からランダムに選択する
- ユーザーから回答を受け付ける。回答番号(1~4)以外はやり直しさせる
- 回答の都度、正解、不正解を出力する
- 最後の問題が終わったら、最終的な正答率を出力する
開発環境
- ローカルマシン(Mac)にて、Dockerを使ってLinux環境を構築
- エディタはVS Code。
- Python:3.8.5
問題集となるCSV
エクセルなどで、1行目をヘッダ行として、
1列目はNo、2列目は問題文、3列目は回答とするファイルを作り、csvで保存します。
保存する場所はプログラムと同じディレクトリとしています。
別の場所に保存する場合は、プログラムの方を修正する必要がありますのでご注意ください。
コード
# 必要なライブラリの読み込み
import csv
import random
# 問題集ファイル(csv)の読み込み。1行目はヘッダなので読み込まない。
test_file = open('gkentei.csv')
test_data = csv.reader(test_file)
questions = []
for row in test_data:
if test_data.line_num == 1:
continue
questions.append(row)
test_file.close()
# 純不同に出題するためにシャッフル
random.shuffle(questions)
# 正答率を計算するために、初期値として正答数に0をセット
correct_count = 0
# ループを回してランダムに出題しながら都度回答を表示
for quiz, question in enumerate(questions):
# 選択肢を作る (1)誤りの3つをいれる
answers = []
while len(answers) < 3:
choice = random.randint(1, len(questions))
if (choice != quiz + 1) and (questions[choice-1][2] not in answers): # 正解ではない、かつ既に含まれていない
answers.append(questions[choice-1][2])
# 選択肢を作る (2)正解を入れる
correct_ans = questions[quiz][2]
answers.append(correct_ans)
# 選択肢を作る (3)シャッフルする
random.shuffle(answers)
# 問題文を出力
print('\n問題{}'.format(quiz + 1))
print(questions[quiz][1])
# 回答選択肢を出力
print('\n---- 回答選択肢 -----')
for i, ans in enumerate(answers):
print('{}: {}'.format(i+1, ans))
# 回答の受付と入力された値のチェック
while True:
user_ans = input('\n回答選択肢を入力してください。\n')
if user_ans in ['1', '2', '3', '4']:
break
else:
continue
# 正解の表示
print('\n----- 正解は -----')
correct_num = answers.index(questions[quiz][2]) + 1
print('{}: {}'.format(correct_num, questions[quiz][2]))
# 結果
if correct_num == int(user_ans):
print('😀😀😀正解😀😀😀')
correct_count += 1
else:
print('☠️☠️☠️残念☠️☠️☠️')
print('\n\n■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ')
# 最終結果を出力
correct_rate = int(correct_count / len(questions) * 100)
print('\n⭐️⭐️⭐️最終結果⭐️⭐️⭐️')
print('正答率は {}%です。{}問中 {}問正解'.format(correct_rate, len(questions), correct_count))
何かの参考になれば幸いです。