Python DayDayUp —— 小项目实现(二)
项目:随机生成测试试卷
假设语文老师给学生最近学习的古诗进行一次小测验,但是为了防止作弊,每个人的试卷出题顺序各不相同。
程序:
- 创建20份不同的试卷
- 每份数据创建10个选择题,次序随机。
- 每个问题有四个选项,其中只有一个正确的选项。
- 将20份文件写到20个文本文件中。
- 将20份答案写到20个文本文件中。
程序设计:
- 字典保存选择题的正确匹配。
- 调用open() ,write() ,和close()方法写入写出文件。
- 利用random.shuffle()随机调整问题和多重选项的次序。
第一步:将测验数据保存在一个字典中
#!python3 #test.py - 随机生成测试试卷 import random #问题的数据保存在字典中,诗歌名称作为键,作者作为值。 poems = {'《水调歌头·明月几时有》':'苏轼', '《将进酒》':'李白', '《桃花源记》':'陶渊明', '《陋室铭》':'刘禹锡', '《爱莲说》':'周敦颐','《元日》':'王安石', '《满江红·写怀》':'岳飞','《春望》':'杜甫', '《岳阳楼记》':'范仲淹', '《长恨歌》':'白居易', '《醉翁亭记》':'欧阳修', '《小石潭记》':'柳宗元', '《清明》':'杜牧', '《春江花月夜》':'张若虚', '《春日》':'朱熹', '《天净沙·秋思》':'马致远', '《过零丁洋》':'文天祥', '《白雪歌送武判官归京》':'岑参' }
第二步:有了上面的字典,我们就可以随机生成20份不同的试卷了。
#我们可以用上面的字典随机的出20份试卷 for num in range(20): #创建试卷和答案文本文件 testFile = open('poem_test%s.txt' % (num + 1),'w') answerFile = open('poem_answer%s.txt' % (num + 1),'w') #创建试卷的头部格式 testFile.write('姓名:\n\n日期:\n\n年级:\n\n') testFile.write('试卷号:%s' %(num + 1)) testFile.write('\n\n\n') #随机获取诗歌名称 names = list(poems.keys()) random.shuffle(names)
第三步:创建答案选项
这个for循环是要包含在上面一个for循环中的,因为哦们需要为每一个文件创建选项。
--snip-- for questionNum in range(10): #试卷的正确的选项,就是names列表中的值在字典中对应的作者 correctAnswer = poems[names[questionNum]] #试卷的错误的选项,就是字典中所有的值 #然后在每次循环过程中去掉其中的正确的那一项, wrongAnswers = list(poems.values()) del wrongAnswers[wrongAnswers.index(correctAnswer)] #随机选择三个错误的答案 #random中sample(seq, n)函数:从序列seq中选择n个随机且独立的元素; wrongAnswers = random.sample(wrongAnswers,3) #问题单包含的四个选项 answerOptions = wrongAnswers + [correctAnswer] #打乱答案顺序 random.shuffle(answerOptions)
第四步:将内容写入测验试卷和答案文件
这段代码后面的close()方法是包含在第一个for循环中的。
--snip-- #将问题和答案写入文件中,\表示一行代码写不下可以换多行 testFile.write('%s,%s的作者是:\n' % \ (questionNum + 1,names[questionNum])) for i in range(4): testFile.write('%s. %s\n'%('ABCD'[i],answerOptions[i])) testFile.write('\n') #写入答案 answerFile.write('%s.%s\n' % (questionNum + 1,'ABCD'\ [answerOptions.index(correctAnswer)])) testFile.close() answerFile.close()
完整代码:
#!python3 #test.py - 随机生成测试试卷 import random #问题的数据保存在字典中 poems = {'《水调歌头·明月几时有》':'苏轼', '《将进酒》':'李白', '《桃花源记》':'陶渊明', '《陋室铭》':'刘禹锡', '《爱莲说》':'周敦颐','《元日》':'王安石', '《满江红·写怀》':'岳飞','《春望》':'杜甫', '《岳阳楼记》':'范仲淹', '《长恨歌》':'白居易', '《醉翁亭记》':'欧阳修', '《小石潭记》':'柳宗元', '《清明》':'杜牧', '《春江花月夜》':'张若虚', '《春日》':'朱熹', '《天净沙·秋思》':'马致远', '《过零丁洋》':'文天祥', '《白雪歌送武判官归京》':'岑参' } #我们可以用上面的字典随机的出20份试卷 for num in range(20): #创建试卷和答案文本文件 testFile = open('poem_test%s.txt' % (num + 1),'w') answerFile = open('poem_answer%s.txt' % (num + 1),'w') #创建试卷的头部格式 testFile.write('姓名:\n\n日期:\n\n年级:\n\n') testFile.write('试卷号:%s' %(num + 1)) testFile.write('\n\n') #根据诗词名字随机生成题目 names = list(poems.keys()) #random.shuffle()随机打乱一个序列中的元素 random.shuffle(names) for questionNum in range(10): #试卷的正确的选项,就是names列表中的值在字典中对应的作者 correctAnswer = poems[names[questionNum]] #试卷的错误的选项,就是字典中所有的值 #然后在每次循环过程中去掉其中的正确的那一项, wrongAnswers = list(poems.values()) del wrongAnswers[wrongAnswers.index(correctAnswer)] #随机选择三个错误的答案 #random中sample(seq, n)函数:从序列seq中选择n个随机且独立的元素; wrongAnswers = random.sample(wrongAnswers,3) #问题单包含的四个选项 answerOptions = wrongAnswers + [correctAnswer] #打乱答案顺序 random.shuffle(answerOptions) #将问题和答案写入文件中,\表示一行代码写不下可以换多行 testFile.write('%s,%s的作者是:\n' % \ (questionNum + 1,names[questionNum])) for i in range(4): testFile.write('%s. %s\n'%('ABCD'[i],answerOptions[i])) testFile.write('\n') #写入答案 answerFile.write('%s.%s\n' % (questionNum + 1,'ABCD'\ [answerOptions.index(correctAnswer)])) testFile.close() answerFile.close()
运行结果如下:
生成了20份试卷和20份答案,每份试卷和答案如下:
answerFile1.txt 1.C 2.C 3.A 4.D 5.A 6.B 7.C 8.B 9.D 10.C testFile1.txt 姓名: 日期: 年级: 试卷号:1 1,《水调歌头·明月几时有》的作者是: A. 范仲淹 B. 岳飞 C. 苏轼 D. 杜甫 2,《清明》的作者是: A. 李白 B. 范仲淹 C. 杜牧 D. 陶渊明 3,《天净沙·秋思》的作者是: A. 马致远 B. 李白 C. 朱熹 D. 苏轼 #这里只展示了前面3道题,每套试卷都有10道题目。 ...