小项目:生成随机的测验试卷文件_python

发布时间:2022-09-18 20:00

刚学习了这个项目,有感生疏,故作;

阅读对象:掌握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]  + (加号)可以连接两个列表

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号