一、问题描述
班上有35名学生,希望进行中国各省会的一个小测试(不包括自治区,直辖市和特别行政区)。希望随机调整问题的次序,这样每份试卷都是独一无二的。
二、问题分析
程序所需要做的事情:
- 创建35份不同的测试试卷。
- 为每份试卷创建23个多重选择题,次序随机。
- 为每个问题提供一个正确答案和3个随机的错误答案,次序随机。
- 将测验试卷写到35个文本文件中。
- 将答案写到35个文本文件中。
分析可得代码需要做的事情:
- 将省和省会保存在一个字典中。
- 针对测验文本文件和答案文本文件,调用open(),write()和close()。
- 利用random和shuffle随机调整问题和多重选项的次序。
三、解决问题
第一步:将测验数据保存在字典中
第一步是创建一个脚本框架,并填入测验数据。创建一个randomQuizGenerator.py文件,如下:
import random
# The quiz data,Keys are states and values are their capitals.
capitals = {'江苏':'南京','黑龙江':'哈尔滨','吉林省':'长春','辽宁省':'沈阳','河北省':'石家庄','甘肃省':'兰州',
'青海省':'西宁','陕西省':'西安','河南省':'郑州','山东省':'济南','山西省':'太原','安徽省':'合肥',
'湖北省':'武汉','湖南省':'长沙','四川省':'成都','贵州省':'贵阳','云南省':'昆明','浙江省':'杭州',
'江西省':'南昌','广东省':'广州','福建省':'福州','台湾省':'台北','海南省':'海口'}
# Generate 35 quiz files.
for quizNum in range(35):
#TODO :Create the quiz and answer key files.
#TODO :Write out the header for the quiz.
#TODO :Shuffle the order of the states.
#TODO :Loop through all 23 states,making a question for each.
该程序将随机安排问题和答案的次序,capitals变量含一个字典,以省作为键,省会作为值。因为希望创建35份测验试卷,所以实际生成测验试卷和答案文件的代码(暂时用TODO注释标注)会放到一个for循环中,循环35次。
第二步:创建测试文件,并打乱问题的次序
现在是完善上面的TODO部分。
循环中的代码重复执行35次(每次生成一份测验试卷),所以在循环中,只需要考虑一份测验试卷。首先需要创建一个实际的测验试卷文件,它需要有唯一的文件名,并且有某种标准的标题部分,留出位置,让学生填写姓名,日期和班级。然后需要随机排列省的列表,之后让它来创建测试试卷的问题和答案。代码如下:
#TODO :Create the quiz and answer key files.
quizFile = open('capitalsquiz%s.txt'%(quizNum+1),'w')
answerKeyFile = open('capitalsquiz_answers%s.txt'%(quizNum+1),'w')
#TODO :Write out the header for the quiz.
quizFile.write('Name:'+(' '*20)+'Number: \n'+(' '*20)+'State capitals Quiz (Form %s)'%(quizNum+1))
quizFile.write('\n\n')
#TODO :Shuffle the order of the states.
states =list(capitals.keys())
random.shuffle(states)
测试试卷的文件名是capitalsquiz<N>.txt,其中N是该测试试卷的唯一编号,来自于quizNum,即for循环的计数器。针对capitalsquiz<N>.txt的答案将保存在capitalsquiz_answers<N>.txt文本文件中。每次执行循环,占位符%s会被(quizNum+1)取代,open()函数调用会创建这些文件,以写模式打开它们。利用random.shuffle()函数,创建了省和省会的随机列表,该函数重新随机排列传递给它的列表中的值。
第三步:创建答案选项
现在需要为每个问题生成答案选项,这是A到D的多重选择,需要创建一个for循环,该循环生成测试试卷的23个问题的内容。然后里面会嵌套第三个for循环,为每个问题生成多重选项,代码如下:
#TODO: Loop through all 23 states,making a question for each.
for questionNum in range(23):
#Get right and wrong answers.
correctAnswer =capitals[states[questionNum]]
wrongAnswers = list(capitals.values())
del wrongAnswers[wrongAnswers.index(correctAnswer)]
wrongAnswers = random.sample(wrongAnswers,3)
answerOptions = wrongAnswers+[correctAnswer]
random.shuffle(answerOptions)
#TODO: Write the question and answer options to the quiz file.
#TODO: Write the answer key to a file.
正确的答案作为值保存在capitals字典中,这个循环将遍历打乱过的states列表中的省,在capitals中找到每个省,将该省对应的省会保存在correctAnswer中。可能的错误答案列表需要一点技巧。你可以从capitals字典中复制所有的值,删除正确的答案,然后从该列表中随机选择3个值,random.sample()函数,第一个参数是你希望选择的列表,第二个参数是你希望选择的值的个数。完整的答案选项列表是这三个错误答案和正确答案的组合。最后答案需要随机排列。
第四步:将内容写入测试试卷和答案文件
接下来需要将问题写入测试试卷文件,将答案写入答案文件。代码如下:
#TODO: Write the question and answer options to the quiz file.
quizFile.write('%s. %s的省会是?\n'%(questionNum+1,states[questionNum]))
for i in range(4):
quizFile.write(' %s. %s\n'%('ABCD'[i],answerOptions[i]))
quizFile.write('\n')
#TODO: Write the answer key to a file.
answerKeyFile.write('%s. %s\n'%(questionNum+1,'ABCD'[answerOptions.index(correctAnswer)]))
quizFile.close()
answerKeyFile.close()
一个遍历0到3的for循环,将答案选项写入answerOptions列表,表达式answerOptions.index(correctAnswer)将在随机排序的答案选项中,找到正确答案的整数下标。运行代码后,capitalsquiz1.txt和对应的答案文本如下,由于random.shuffle()调用,所以每次看到的结果都不一样:
总结
这就是生成随机的测验试卷文件全部步骤,是不是觉得既简单又有趣呢,快去尝试一下吧!