发布时间:2022-08-19 12:58
刚学习了这个项目,有感生疏,故作;
阅读对象:掌握python基本语法,能够用python进行简单的文件操作;由于随机,所以还需要掌握一丢丢random模块的知识(这里下方会给出说明)
首先,给出题目:
假如你是一位地理老师,班上有 35 名学生,你希望进行美国各州首府的一个 小测验。不妙的是,班里有几个坏蛋,你无法确信学生不会作弊。你希望随机调整 问题的次序,这样每份试卷都是独一无二的,这让任何人都不能从其他人那里抄袭 答案。当然,手工完成这件事又费时又无聊。好在,你懂一些 Python。
步骤:
下面是程序所做的事:
• 创建 35 份不同的测验试卷。
• 为每份试卷创建 50 个多重选择题,次序随机。
• 为每个问题提供一个正确答案和 3 个随机的错误答案,次序随机。
• 将测验试卷写到 35 个文本文件中。
• 将答案写到 35 个文本文件中。
这意味着代码需要做下面的事:
• 将州和它们的首府保存在一个字典中。
• 针对测验文本文件和答案文本文件,调用 open()、write()和 close()。
• 利用 random.shuffle()随机调整问题和多重选项的次序。
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',
'NewMexico': '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'}
这是key为美国州名,value为美国州对应的府名(如果你需要实践该项目,该字典直接复制即可)
测验文件理应有测试试卷和测试试卷的答案.
这是代码以及注释:
# 创建key为美国州,value为美国州对应的府名的字典
import random
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',
'NewMexico': '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'}
# 创建35份测验文件
for quizNum in range(35):
# 创建试卷和答案文件
quizFile = open('CapitalsQuiz%s.txt' % (quizNum + 1), 'w') # 创建第quizNum份试卷文件
answerFile = open('CapitalAnswers%s.txt' % (quizNum + 1), 'w') # 创建第quizNum份答案件
'''这里需要注意几点
1.使用open()创建两个文件,应以写入模式w
2.文件路径未写,则默认当前路径,如果你使用pycharm,那么创建的文件应该当前py文件所在目录中,当然你也可以自己设定路径
3.文件类型应标明,此处是.txt文件
4.我们让每一份文件个性化,所以标有 % (quizNum + 1),如果你是新学python,那么你也许会使用这种方法, quizFile = open(f'capitalsQuiz{quizNum + 1}', 'w')'''
# 往试卷和答案文件写入试卷的基本信息
quizFile.write('Name:\nDate\nPeriod\n\n') # 往测验试卷写入姓名,日期,年龄,供学生填写
quizFile.write((' ' * 20) + 'StateCapitalsQuiz(Form %s)\n' % (quizNum + 1)) # 写入测验试卷标题
answerFile.write((' ' * 20) + 'State Capitals Answer of Quiz(Form %s)\n' % (quizNum + 1)) # 写入测验答案标题
# 创建美国州列表
statesList = list(capitals.keys()) # 由于列表的keys()返回可视对象只可读,所以为了后续操作,转化为列表
# 随机化列表
# 由于上方创建的美国州和府列表是固定顺序的,所以需要打乱,以确保每份测验试卷都不一样
# 使用random.shuffle(参数1) 参数1传入列表,功能:将传入的列表各值打乱,从而确保随机
random.shuffle(statesList)
# 一份试卷50道题目,故内嵌循环
for questionNum in range(50):
# 创建第questionNum个问题的正确答案
correctAnswer = capitals[statesList[questionNum]]
# 创建错误答案列表
wrongAnswers = list(capitals.values()) # 此处还包括一个正确答案,需要删除
wrongAnswers.remove(correctAnswer)
# 创建含三个错误答案的列表(随机)
wrongAnswers = random.sample(wrongAnswers, 3)
'''这里random.sample是将wrongAnswers
列表中随机选取三个值组成一个新的列表,重新赋值给wrongAnswers'''
# 一道题四个选项,其中一个选项是正确选项,故创建选项列表
questionOption = wrongAnswers + [correctAnswer] # 往错误答案列表加入一个正确选项并将该新列表赋值给questionOption,从而创建一个选项列表
# 此处也可以 wrongAnswers.append(correctAnswer) \n questionOption = wrongAnswers
# 上述两种方法都是在列表末端加入正确选项,所以为了避免D选项永远是正确选项,这里需要对选项列表随机化
random.shuffle(questionOption) # 将questionOption列表的值随机打乱
# 准备工作完成后,现在将问题和选项写入试卷中去
# 写入问题
quizFile.write(f' {questionNum + 1}. What is the capitals of {statesList[questionNum]}?\n')
# 写入四个选项
for i in range(4):
quizFile.write(' %s. %s\n' % ('ABCD'[i], questionOption[i]))
# 将答案写入answerFile文件中去
answerFile.write(' %s. %s\n' % (questionNum, 'ABCD'[questionOption.index(correctAnswer)]))
# 现在已经进行到一次外循环的结尾了,需要注意将文件关闭, 以便下一次循环open()的使用
quizFile.close()
answerFile.close()
完成后有以下几点需要注意
1. print('------%s--------' % (num)) 此处百分号前方,第二个单引号后面不需要,(逗号)
2.option = answers.append(correctAnswer) 我本意是将answer列表加入correctAnswer得到新的列表并赋值给option列表,但是append()方法并没有这种功能说返回一个新的列表,他只是在原有列表(这里给定的answers列表)的末端加入一个新的值correctAnswer。如果需要,可以这个样子
answers.append(correctAnswer) \n option = answers 但是它们用的是同一个列表,赋值只是复制的引用
也可以这个样子
option = answer + [correctAnswer] + (加号)可以连接两个列表