前言:
儿子大班了,但是算数不随我,太差了,所以之前用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固化模板即可