Python:大班数学自动生成器

前言:
儿子大班了,但是算数不随我,太差了,所以之前用Excel做了一个简易的20以内加减法自动生成器,但是有诸如范围不好确定、容易出现重复题目等问题,所以这次用Python遍了一个,以后还能扩展成乘法和除法,嗯,够用到小学一年级结束了~~

12月9日更新:今天在考虑如何能够自定义扩充题目里的数字个数,如果按照常规方法的话要一直写“+”、“-”,同时增加运算过程,这样太麻烦了,思考了下python里有eval()这个函数,所以就简单了。

i = 10 #这是最大考题数
while i:
    j = 5 #这是最大数字个数
    question = str(random.randint(1, 10)) #这里选择单个数字的取数范围
    while j-1:
        question = question + random.choice(['+', '-']) #这里选择运算符的范围
        question = question + str(random.randint(1, 10))
        j = j - 1
    answer = eval(question)
    if 1 <= answer <=10: #这里选择答案的取数范围
        print(question)
        print(answer)
        i = i - 1
    else:
        continue
import random
import os
import traceback
from win32com.client import Dispatch
from win32com.client import GetObject

def excel_pre():
    '''启动excel和路径设置'''
    global xl
    xl = Dispatch("Excel.Application")
    xl.Visible = False #True是显示, False是隐藏
    xl.DisplayAlerts = 0

def check_exsit(process_name):
    '''判断系统进程是否存在'''
    WMI = GetObject('winmgmts:')
    processCodeCov = WMI.ExecQuery("select * from Win32_Process where Name='%s'" % process_name)
    return len(processCodeCov)

def math_question(sign_list, min_range, max_range, min_answer, max_answer):
    '''数学题目生成器'''
    question_list = []
    question_num = 0
    while True:
        if question_num >= max_question_num :
            break
        else:
            question = str(random.randint(min_range, max_range))  # 这里选择单个数字的取数范围
            j = int(max_num)
            while j - 1:
                question = question + random.choice(sign_list)  # 这里选择运算符的范围
                question = question + str(random.randint(min_range, max_range))
                j = j - 1
            answer = eval(question)
            if min_answer <= answer <= max_answer:  # 这里选择答案的取数范围
                this_question = question + '='
                if '*' in this_question:
                    this_question = this_question.replace('*', '×')
                if this_question not in question_list:
                    question_list.append(this_question)
                    question_num = question_num + 1
    return question_list

def make_paper(paper_info, sign_list, min_range, max_range, min_answer, max_answer):
    '''生成试卷'''
    path_this_file = os.path.abspath('.') + "\\"
    muban_path = path_this_file + '大班数学格式.xlsx'
    excel_pre()
    muban = xl.Workbooks.Open(muban_path)
    muban_sheet = muban.Sheets('大班数学')
    question_list = math_question(sign_list, min_range, max_range, min_answer, max_answer)
    n = 0
    for j in range(2, 7): #column
        for k in range(4, 24): #row
            muban_sheet.Cells(k, j).Value = question_list[n]
            n = n + 1
    new_path = path_this_file + '大班数学考卷' + str(paper_info) + '.xlsx'
    muban.SaveAs(new_path)
    print('>>>已完成第{}份试卷!'.format(paper_info))

if __name__ =="__main__":
    try:
        if check_exsit('EXCEL.EXE'):
            os.system('taskkill /F /IM EXCEL.EXE')  # 关闭Excel.exe
        print('''
        #######################################################
        说明:
        1、支持自定义试卷数量,默认10份
        2、支持自定义单个数字的取值范围,默认1-10
        3、支持自定义结果的取值范围,默认1-20
        4、支持自定义模式(加减法或加减乘法),默认加减法
        4、单张试卷的题目数量为100
        5、可以修改模板文字内容和单元格格式,但不能增加/减少单元格
        #######################################################
        ''')
        #1、考卷数量
        paper_number = input('请输入试卷数量:(直接回车默认10份)')
        if not paper_number:
            paper_number = 10
        else:
            paper_number = int(paper_number)
        #2、模式选择
        sign_mode = input('请选择考试模式(1:加减法,2:加减乘法,直接回车默认模式1)')
        if sign_mode == '2':
            sign_list = ['+', '-', '*']
        else:
            sign_list = ['+', '-']
        max_question_num = 100 #算术题总数
        # 3、单个数字的取值范围
        num_range = input('请输入单个数字的取值范围(如1,20):(直接回车默认1-20)')
        if not num_range:
            min_range, max_range = 1, 20
        else:
            min_range, max_range = num_range.split(',')
        # 4、答案的取值范围
        answer_range = input('请输入答案的取值范围(如1,20):(直接回车默认1-20)')
        if not answer_range:
            min_answer, max_answer = 1, 20
        else:
            min_answer, max_answer = num_range.split(',')
        # 5、单道题目中数字的最大数量(比如1+2+3就是3个数字)
        max_num = input('请输入单道题目中数字的最大数量(如3):(直接回车默认3)')
        if not max_num:
            max_num = 3
        #程序运行:
        min_range, max_range, min_answer, max_answer = int(min_range), int(max_range), int(min_answer), int(max_answer)
        # print(sign_list, min_range, max_range, min_answer, max_answer)
        for i in range(1, paper_number+1):
            make_paper(i, sign_list, min_range, max_range, min_answer, max_answer)
        xl.quit()
    except:
        os.system('taskkill /F /IM EXCEL.EXE')  # 关闭Excel.exe
        traceback.print_exc()
    finally:
        a = input("按回车键退出!")

再用Excel固化模板即可
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值