- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
8.5 项目:生成随机的测验试卷文件
假如你是一位地理老师,班上有35名学生,你希望进行美国各州首府的一个小测验。不妙的是,班里有几个坏蛋,你无法确信学生不会作弊。你希望随机调整问题的次序,这样每份试卷都是独一无二的,这让任何人都不能从其他人那里抄袭答案。当然,手工完成这件事又费时又无聊。好在,你懂一些Python。
下面是程序所做的事:
· 创建35份不同的测验试卷。
· 为每份试卷创建50个多重选择题,次序随机。
· 为每个问题提供一个正确答案和3个随机的错误答案,次序随机。
· 将测验试卷写到35个文本文件中。
· 将答案写到35个文本文件中。
这意味着代码需要做下面的事:
· 将州和它们的首府保存在一个字典中。
· 针对测验文本文件和答案文本文件,调用open()、write()和close()。
· 利用random.shuffle()随机调整问题和多重选项的次序。
第1步:将测验数据保存在一个字典中
第一步是创建一个脚本框架,并填入测验数据。创建一个名为randomQuiz Generator.py的文件,让它看起来像这样:
#! python3 # randomQuizGenerator.py - Creates quizzes with questions and answers in # random order, along with the answer key. ❶ import random # The quiz data. Keys are states and values are their capitals. ❷ capitals = {'Alabama': 'Montgomery', 'Alaska': 'Juneau', 'Arizona': 'Phoenix', 'Arkansas': 'Little Rock', 'California': 'Sacramento', 'Colorado': 'Denver', 'Connecticut': 'Hartford', 'Delaware': 'Dover', 'Florida': 'Tallahassee', 'Georgia': 'Atlanta', 'Hawaii': 'Honolulu', 'Idaho': 'Boise', 'Illinois': 'Springfield', 'Indiana': 'Indianapolis', 'Iowa': 'Des Moines', 'Kansas': 'Topeka', 'Kentucky': 'Frankfort', 'Louisiana': 'Baton Rouge', 'Maine': 'Augusta', 'Maryland': 'Annapolis', 'Massachusetts': 'Boston', 'Michigan': 'Lansing', 'Minnesota': 'Saint Paul', 'Mississippi': 'Jackson', 'Missouri': 'Jefferson City', 'Montana': 'Helena', 'Nebraska': 'Lincoln', 'Nevada': 'Carson City', 'New Hampshire': 'Concord', 'New Jersey': 'Trenton', 'New Mexico': 'Santa Fe', 'New York': 'Albany', 'North Carolina': 'Raleigh', 'North Dakota': 'Bismarck', 'Ohio': 'Columbus', 'Oklahoma': 'Oklahoma City', 'Oregon': 'Salem', 'Pennsylvania': 'Harrisburg', 'Rhode Island': 'Providence', 'South Carolina': 'Columbia', 'South Dakota': 'Pierre', 'Tennessee': 'Nashville', 'Texas': 'Austin', 'Utah': 'Salt Lake City', 'Vermont': 'Montpelier', 'Virginia': 'Richmond', 'Washington': 'Olympia', 'West Virginia': 'Charleston', 'Wisconsin': 'Madison', 'Wyoming': 'Cheyenne'} # 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 50 states, making a question for each.
因为这个程序将随机安排问题和答案的次序,所以需要导入random模块❶,以便利用其中的函数。capitals变量❷含一个字典,以美国州名作为键,以州首府作为值。因为你希望创建35份测验试卷,所以实际生成测验试卷和答案文件的代码(暂时用TODO注释标注)会放在一个for循环中,循环35次❸(这个数字可以改变,生成任何数目的测验试卷文件)。
第2步:创建测验文件,并打乱问题的次序
现在是时候填入那些TODO了。
循环中的代码将重复执行35次(每次生成一份测验试卷),所以在循环中,你只需要考虑一份测验试卷。首先你要创建一个实际的测验试卷文件,它需要有唯一的文件名,并且有某种标准的标题部分,留出位置,让学生填写姓名、日期和班级。然后需要得到随机排列的州的列表,稍后将用它来创建测验试卷的问题和答案。
在randomQuizGenerator.py中添加以下代码行:
#! python3 # randomQuizGenerator.py - Creates quizzes with questions and answers in # random order, along with the answer key. --_snip_-- # Generate 35 quiz files. for quizNum in range(35): # Create the quiz and answer key files. ❶ quizFile = open('capitalsquiz%s.txt' % (quizNum + 1), 'w') ❷ answerKeyFile = open('capitalsquiz_answers%s.txt' % (quizNum + 1), 'w') # Write out the header for the quiz. ❸ quizFile.write('Name:\n\nDate:\n\nPeriod:\n\n') quizFile.write((' ' * 20) + 'State Capitals Quiz (Form %s)' % (quizNum + 1)) quizFile.write('\n\n') # Shuffle the order of the states. states = list(capitals.keys()) ❹ random.shuffle(states) # TODO: Loop through all 50 states, making a question for each.
测验试卷的文件名将是capitalsquiz<N>.txt,其中<N>是该测验试卷的唯一编号,来自于quizNum,即for循环的计数器。针对capitalsquiz<N>.txt的答案将保存在一个文本文件中,名为capitalsquiz_answers<N>.txt。每次执行循环,'capitalsquiz%s.txt'和'capitalsquiz_answers%s.txt'中的占位符%s都将被(quizNum + 1)取代,所以第一个测验试卷和答案将是capitalsquiz1.txt和capitalsquiz_answers1.txt。在❶和❷的open()函数调用将创建这些文件,以'w'作为第二个参数,以写模式打开它们。
❸处write()语句创建了测验标题,让学生填写。最后,利用random.shuffle()函数❹,创建了美国州名的随机列表。该函数重新随机排列传递给它的列表中的值。
第3步:创建答案选项
现在需要为每个问题生成答案选项,这将是A到D的多重选择。你需要创建另一个for循环,该循环生成测验试卷的50个问题的内容。然后里面会嵌套第三个for循环,为每个问题生成多重选项。让你的代码看起来像这样:
#! python3 # randomQuizGenerator.py - Creates quizzes with questions and answers in # random order, along with the answer key. --_snip_-- # Loop through all 50 states, making a question for each. for questionNum in range(50): # 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列表中的州,从states[0]到states[49],在capitals中找到每个州,将该州对应的首府保存在correctAnswer中。
可能的错误答案列表需要一点技巧。你可以从capitals字典中复制所有的值❷,删除正确的答案❸,然后从该列表中选择3个随机的值❹。random.sample()函数使得这种选择很容易,它的第一个参数是你希望选择的列表,第二个参数是你希望选择的值的个数。完整的答案选项列表是这3个错误答案与正确答案的组合❺。最后,答案需要随机排列❻,这样正确的答案就不会总是选项D。
第4步:将内容写入测验试卷和答案文件
剩下来就是将问题写入测验试卷文件,将答案写入答案文件。让你的代码看起来像这样:
#! python3 # randomQuizGenerator.py - Creates quizzes with questions and answers in # random order, along with the answer key. --_snip_-- # Loop through all 50 states, making a question for each. for questionNum in range(50): --_snip_-- # Write the question and the answer options to the quiz file. quizFile.write('%s. What is the capital of %s?\n' % (questionNum + 1, states[questionNum])) ❶ for i in range(4): ❷ quizFile.write(' %s. %s\n' % ('ABCD'[i], answerOptions[i])) quizFile.write('\n') # 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列表❶。❷处的表达式'ABCD'[i]将字符串'ABCD'看成是一个数组,它在循环的每次迭代中,将分别求值为'A'、'B'、'C'和'D'。
在最后一行❸,表达式answerOptions.index(correctAnswer)将在随机排序的答案选项中,找到正确答案的整数下标,并且'ABCD'[answerOptions.index(correctAnswer)]将求值为正确答案的字母,写入到答案文件中。
在运行该程序后,下面就是capitalsquiz1.txt文件看起来的样子。但是,你的问题和答案选项当然与这里显示的可能会不同。这取决于random.shuffle()调用的结果:
Name: Date: Period: State Capitals Quiz (Form 1) 1. What is the capital of West Virginia? A. Hartford B. Santa Fe C. Harrisburg D. Charleston 2. What is the capital of Colorado? A. Raleigh B. Harrisburg C. Denver D. Lincoln --snip--
对应的capitalsquiz_answers1.txt文本文件看起来像这样:
1. D 2. C 3. A 4. C --snip--
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论