需求描述
假如你是一位地理老师,班上有 35 名学生,你希望进行全国的一个小测验。不妙的是,班里有几个坏蛋,你无法确信学生不会作弊。你希望随机调整问题的次序,这样每份试卷都是独一无二的,这让任何人都不能从其他人那里抄袭答案。当然,手工完成这件事又费时又无聊。好在,你懂一些 Python。
需求分析
程序用到了文件的操作:打开、写入、关闭,和随机数模块以及随机打乱的方法。
- 首先要有一个字典,包含所有省份和对应的省会。
- 创建 35 份不同的测验试卷。
- 为每份试卷创建所有包含所有省份的多重选择题,次序随机。
- 为每个问题提供一个正确答案和 3 个随机的错误答案,次序随机。
- 将测验试卷写到 35 个文本文件中。
- 将答案写到 35 个文本文件中。
代码展示
import random#创建35份试卷,问下列省份的省会是哪里,每份试卷的问题的顺序都不一样,防止抄袭。#包含省份和省会的字典capitals = {'湖南':'长沙', '湖北':'武汉', '广东':'广州', '广西':'南宁', '河北':'石家庄', '河南':'郑州', '山东':'济南', '山西':'太原', '江苏':'南京', '浙江':'杭州', '江西':'南昌', '黑龙江':'哈尔滨', '新疆':'乌鲁木齐', '内蒙古':'呼和浩特', '云南':'昆明', '贵州':'贵阳', '福建':'福州', '吉林':'长春', '安徽':'合肥', '四川':'成都', '西藏':'拉萨', '宁夏':'银川', '辽宁':'长春', '青海':'西宁', '甘肃':'兰州', '陕西':'西安', '台湾':'台北', '北京':'北京', '上海':'上海', '天津':'天津', '重庆':'重庆', '香港':'香港', '澳门':'澳门'}#创建35份试卷,每次循环就会生成一份试卷。for quizNum in range(35): # 创建问卷文件和答案文件 quizFile = open('试卷%s.txt' % (quizNum + 1), 'w', encoding='utf-8') answerFile = open('答案%s.txt' % (quizNum + 1), 'w') #写入试卷的头部 quizFile.write('姓名:日期:') quizFile.write('') #随机打乱省份的顺序,使每份试卷的问题顺序都不一样 allProvinces = list(capitals.keys()) random.shuffle(allProvinces) #开始循环设置答案选项,多少个省份就有多少道问题。 for questionNum in range(len(capitals)): #获取正确答案和其他三个错误答案 #这里的正确答案就是此次循环到的省份对应的省会。 correctAnswer = capitals[allProvinces[questionNum]] #这里的错误答案就是随机获取除此次循环对应省份的省会之外的3个省会即可。 allCapitalList = list(capitals.values()) #删除本次循环省份的省会 del allCapitalList[allCapitalList.index(correctAnswer)] #在已经删除掉正确省会的列表中随机选取三个省会 wrongAnswers = random.sample(allCapitalList, 3) #将错误答案和正确答案的列表相加获得本次循环(本题)的4个回答选项的一个列表。 answerOptions = wrongAnswers + [correctAnswer] #随机打乱生成的回答选项的顺序,否则正确答案都是第四个选项(D) random.shuffle(answerOptions) #写入问题到试卷文件 quizFile.write('{}. {}的省会是哪里?'.format(questionNum + 1, allProvinces[questionNum])) #开始写入每题的四个选项,每题循环4次 for i in range(4): quizFile.write(' {}. {}'.format('ABCD'[i], answerOptions[i])) quizFile.write('') # 将正确回答写入答案文件 answerFile.write('{}. {}'.format(questionNum + 1, 'ABCD'[answerOptions.index(correctAnswer)])) #设置为每个试卷的问题和答案就可以关闭这个试卷文件和答案文件 quizFile.close() answerFile.close()
执行结果
生成的试卷和答案。
结果检查: