在这里,我有一个程序可以对学生进行测验并保存他们的分数,供老师查看。但是现在我被要求保存每个学生最后三个分数,这意味着该程序必须识别人名,我该怎么做?
import random
import sys
def get_input_or_quit(prompt, quit="Q"):
prompt += " (Press '{}' to exit) : ".format(quit)
val = input(prompt).strip()
if val.upper() == quit:
sys.exit("Goodbye")
return val
def prompt_bool(prompt):
while True:
val = get_input_or_quit(prompt).lower()
if val == 'yes':
return True
elif val == 'no':
return False
else:
print ("Invalid input '{}', please try again".format(val))
def prompt_int_small(prompt='', choices=(1,2)):
while True:
val = get_input_or_quit(prompt)
try:
val = int(val)
if choices and val not in choices:
raise ValueError("{} is not in {}".format(val, choices))
return val
except (TypeError, ValueError) as e:
print(
"Not a valid number ({}), please try again".format(e)
)
def prompt_int_big(prompt='', choices=(1,2,3)):
while True:
val = get_input_or_quit(prompt)
try:
val = int(val)
if choices and val not in choices:
raise ValueError("{} is not in {}".format(val, choices))
return val
except (TypeError, ValueError) as e:
print(
"Not a valid number ({}), please try again".format(e)
)
role = prompt_int_small("Are you a teacher or student? Press 1 if you are a student or 2 if you are a teacher")
if role == 1:
score=0
name=input("What is your name?")
print ("Alright",name,"welcome to your maths quiz."
" Remember to round all answers to 5 decimal places.")
level_of_difficulty = prompt_int_big("What level of difficulty are you working at?\n"
"Press 1 for low, 2 for intermediate "
"or 3 for high\n")
if level_of_difficulty == 3:
ops = ['+', '-', '*', '/']
else:
ops = ['+', '-', '*']
for question_num in range(1, 11):
if level_of_difficulty == 1:
max_number = 10
else:
max_number = 20
number_1 = random.randrange(1, max_number)
number_2 = random.randrange(1, max_number)
operation = random.choice(ops)
maths = round(eval(str(number_1) + operation + str(number_2)),5)
print('\nQuestion number: {}'.format(question_num))
print ("The question is",number_1,operation,number_2)
answer = float(input("What is your answer: "))
if answer == maths:
print("Correct")
score = score + 1
else:
print ("Incorrect. The actual answer is",maths)
if score >5:
print("Well done you scored",score,"out of 10")
else:
print("Unfortunately you only scored",score,"out of 10. Better luck next time")
class_number = prompt_int_big("Before your score is saved ,are you in class 1, 2 or 3? Press the matching number")
filename = (str(class_number) + "txt")
with open(filename, 'a') as f:
f.write("\n" + str(name) + " scored " + str(score) + " on difficulty level " + str(level_of_difficulty) + "\n")
with open(filename) as f:
lines = [line for line in f if line.strip()]
lines.sort()
if prompt_bool("Do you wish to view previous results for your class"):
for line in lines:
print (line)
else:
sys.exit("Thanks for taking part in the quiz, your teacher should discuss your score with you later")
if role == 2:
class_number = prompt_int_big("Which class' scores would you like to see? Press 1 for class 1, 2 for class 2 or 3 for class 3")
filename = (str(class_number) + "txt")
f = open(filename, "r")
lines = [line for line in f if line.strip()]
lines.sort()
for line in lines:
print (line)
答案 0 :(得分:0)
您可以使用字典。关键是学生姓名,价值可以是最后3个分数的列表。在测试结束时,您将更新字典,如下所示:
try:
scoresDict[name][2] = score
except KeyError:
scoresDict[name] = [None, None, score]
在上面的示例中,最新得分始终是列表中的最后得分。
scoresDict
需要初始化为空字典(或从文件中读取 - 见下文)。您首先尝试将分数添加到现有name
,如果失败,则在dict中创建一个新条目。
程序关闭后,您需要保留数据。您可以使用pickle
模块执行此操作。
当程序启动时,您将尝试从文件加载现有数据,或者如果文件不存在则创建新的scoresDict
:
scoresDict = {}
fpath = os.path.join(os.path.dirname(__file__), "scores.pickle")
if os.path.exists(fpath):
with open(fpath, "r") as f:
scoresDict = pickle.load(f)
当程序关闭时,在更新得分dict之后,将其转储回磁盘:
with open(fpath, "w") as f:
pickle.dump(scoresDict, f)
这将非常适合简单的需求。对于更复杂的数据,或者如果您计划存储大量数据,则应该考虑使用数据库。 Python在其标准库中附带了一个SQLite模块,可以使用它。