一、问题描述

班上有35名学生,希望进行中国各省会的一个小测试(不包括自治区,直辖市和特别行政区)。希望随机调整问题的次序,这样每份试卷都是独一无二的。


二、问题分析

程序所需要做的事情:

  1. 创建35份不同的测试试卷。
  2. 为每份试卷创建23个多重选择题,次序随机。
  3. 为每个问题提供一个正确答案和3个随机的错误答案,次序随机。
  4. 将测验试卷写到35个文本文件中。
  5. 将答案写到35个文本文件中。

分析可得代码需要做的事情:

  1. 将省和省会保存在一个字典中。
  2. 针对测验文本文件和答案文本文件,调用open(),write()和close()。
  3. 利用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()调用,所以每次看到的结果都不一样:

python 随机出题 python随机出题并且不重复_经验分享

python 随机出题 python随机出题并且不重复_python 随机出题_02


总结

这就是生成随机的测验试卷文件全部步骤,是不是觉得既简单又有趣呢,快去尝试一下吧!