避免计算过程中出现负数,可以设定题目长度,最大的数字。
""" Spyder Editor This is a temporary script file. """ import random import re import pprint def calc(s = '5+6-1'): ''' @s:'5+6-1' ''' #print 'calc : %s \n' % s numbers = re.findall(r'\d+' , s) symbols = re.findall(r'[+-]+', s) i = 1 j = 0 result = 0 result += int(numbers[0]) while i < len(numbers) and j < len(symbols): if symbols[j] == '+' : result += int(numbers[i]) elif symbols[j] == '-' : result -= int(numbers[i]) else: print symbols print 'Only + and - accept' return False i += 1 j += 1 if result < 0: #print 'negtive not accept' return False #print '%s = %d' %(s,result) return result def getOneExpression(problemMaxLength = 5 , maxNum = 15): problemLength = random.randint(2,problemMaxLength) expression = '' i = 0 num = random.randint(0 , maxNum) expression += str(num) while i < problemLength-1: tmp = expression expression += random.sample(['+','-'] , 1)[0] num = random.randint(0 , maxNum) expression += str(num) #print 'expression1 : ' ,expression if calc(expression): i += 1 else: expression = tmp #print 'expression2 : ' ,expression #import time #time.sleep(1) #print expression return expression def setProblems(problemNum = 10 , problemMaxLength = 5 , maxNum = 15): problem = {}#{'P1':{'problem':'5+6' , result = 11}} # set level #problemNum = 10 #problemMaxLength = 5 #maxNum = 15 for i in range(problemNum): problem.setdefault('P'+str(i) , {}) problem['P'+str(i)].setdefault('problem' , getOneExpression(problemMaxLength , maxNum)) problem['P'+str(i)].setdefault('result' , calc(problem['P'+str(i)]['problem'])) return problem #test ''' calc('1') getOneExpression() random.sample(['+','-'] , 1) ''' problems = setProblems() pprint.pprint(problems)