需求描述
假如你是一位地理老师,班上有35名学生,你希望进行美国各州首府的一个小测验。
不妙的是,班里有几个坏蛋,你无法确信学生不会作弊。你希望随机调整问题的次序,
这样每份试卷都是独一无二的,这让任何人都不能从其他人那里抄袭答案。
当然,手工完成这件事又费时又无聊。好在,你懂一些Python。
下面是程序所做的事:
- 创建35份不同的测验试卷。
- 为每份试卷创建50个多重选择题,次序随机。
- 为每个问题提供一个正确答案和3个随机的错误答案,次序随机。
- 将测验试卷写到35个文本文件中。
- 将答案写到35个文本文件中
- 将州和它们的首府保存在一个字典中。
- 针对测验文本文件和答案文本文件,调用open()、write()和close()。
- 利用random.shuffle()随机调整问题和多重选项的次序
代码实现
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',
'WestVirginia': 'Charleston',
'Wisconsin': 'Madison',
'Wyoming': 'Cheyenne'}
def main():
# 为 35 位同学生成试卷
for quizNum in range(35):
# 打开一个试卷文件
quizFile = open('cap/capitalsquiz%s.txt' % (quizNum + 1), 'w')
# 打开一个答案文件
answerKeyFile = open('cap/capitalsquiz_answers%s.txt' % (quizNum + 1), 'w')
# 在卷子开头打印出一些信息
quizFile.write('Name:\n\nDate:\n\nPeriod:\n\n')
quizFile.write((' ' * 20) + 'State Capitals Quiz (Form %s)' % (quizNum + 1))
quizFile.write('\n\n')
# 打乱洲名
states = list(capitals.keys())
random.shuffle(states)
# 每张试卷里面 50 道题目
for questionNum in range(50):
# 拿到正确的答案
correctAnswer = capitals[states[questionNum]]
# 生成排除正确答案之外的错误答案列表 错误的答案要从这里面随机生成
wrongAnswers = list(capitals.values())
del wrongAnswers[wrongAnswers.index(correctAnswer)]
wrongAnswers = random.sample(wrongAnswers, 3)
answerOptions = wrongAnswers + [correctAnswer]
# 随机一下选择列表
random.shuffle(answerOptions)
# 写题目
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')
# 写入答案
answerKeyFile.write('%s. %s\n' % (questionNum + 1, 'ABCD'[answerOptions.index(correctAnswer)]))
quizFile.close()
answerKeyFile.close()
if __name__ == "__main__":
main()
后记
来自: 《python 编程快速上手 让繁琐工作自动化》