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

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

首先,给出题目:


假如你是一位地理老师,班上有 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]  + (加号)可以连接两个列表


目录
相关文章
|
3天前
|
Python
Python代码扫描目录下的文件并获取路径
【5月更文挑战第12天】Python代码扫描目录下的文件并获取路径
20 1
|
3天前
|
存储 JSON 数据库
Python中列表数据的保存与读取:以txt文件为例
Python中列表数据的保存与读取:以txt文件为例
16 2
|
3天前
|
存储 NoSQL MongoDB
MongoDB数据库转换为表格文件的Python实现
MongoDB数据库转换为表格文件的Python实现
34 0
|
1天前
|
数据采集 Python
matlab疲劳驾驶检测项目,Python高级面试framework
matlab疲劳驾驶检测项目,Python高级面试framework
|
1天前
|
Python
Python办公自动化|自动整理文件,一键完成!
Python办公自动化|自动整理文件,一键完成!
|
3天前
|
Python
Python知识点——文件和数据格式化
Python知识点——文件和数据格式化
6 0
|
3天前
|
存储 JSON 安全
Python中的文件操作与文件IO操作
【5月更文挑战第14天】在Python中,文件操作是常见任务,包括读取、写入和处理文件内容。`open()`函数是核心,接受文件路径和模式(如'r'、'w'、'a'、'b'和'+')参数。本文详细讨论了文件操作基础,如读写模式,以及文件IO操作,如读取、写入和移动指针。异常处理是关键,使用`try-except`捕获`FileNotFoundError`和`PermissionError`等异常。进阶技巧涉及`with`语句、`readline()`、`os`和`shutil`模块。数据序列化与反序列化方面,介绍了
17 0
|
3天前
|
Python
python如何读取excel文件,并修改内容?
python如何读取excel文件,并修改内容?
8 0
|
3天前
|
Unix Linux 数据处理
使用Python批量复制文件夹及其子文件夹下的指定文件
使用Python批量复制文件夹及其子文件夹下的指定文件
14 1
|
3天前
|
Python
Python自动化办公实战案例:文件整理与邮件发送
Python自动化办公实战案例:文件整理与邮件发送
8 0