1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 def make_sum(a, b): 5 return ['+', a, b] 6 7 def make_prod(a, b): 8 return ['*', a, b] 9 10 def make_diff(a, b): 11 return ['-', a, b] 12 13 def make_div(a, b): 14 return ['/', a, b] 15 16 def is_basic_exp(a): 17 return not isinstance(a, list) 18 19 def is_number(x): 20 return (isinstance(x, int) or isinstance(x, float) or isinstance(x, complex)) 21 22 #表达式计算 23 def eval_exp(e, values): 24 if is_basic_exp(e): 25 #如果e位于字典里则返回键对应的值,否则直接返回e 26 if e in values.keys(): 27 return values[e] 28 else: 29 return e 30 op, a, b = e[0], eval_exp(e[1], values), eval_exp(e[2], values) 31 if op=='+': 32 return eval_sum(a, b) 33 elif op=='-': 34 return eval_diff(a, b) 35 elif op=='*': 36 return eval_prod(a, b) 37 elif op=='/': 38 return eval_div(a, b) 39 else: 40 raise ValueError("Unknown operator:", op) 41 42 #加法 43 def eval_sum(a, b): 44 if is_number(a) and is_number(b): 45 return a+b 46 if is_number(a) and a==0: 47 return b 48 if is_number(b) and b==0: 49 return a 50 return make_sum(a, b) 51 52 #减法 53 def eval_diff(a, b): 54 if is_number(a) and is_number(b): 55 return a - b 56 if is_number(a) and a==0: 57 return -b 58 if is_number(b) and b==0: 59 return a 60 return make_diff(a, b) 61 62 #乘法 63 def eval_prod(a, b): 64 if is_number(a) and is_number(b): 65 return a * b 66 if is_number(a) and a==0: 67 return 0 68 if is_number(b) and b==0: 69 return 0 70 return make_prod(a, b) 71 72 #除法 73 def eval_div(a, b): 74 if is_number(a) and is_number(b): 75 return a / b 76 if is_number(a) and a==0: 77 return 0 78 if is_number(b) and b==1: 79 return a 80 if is_number(b) and b==0: 81 raise ZeroDivisionError 82 return make_div(a, b) 83 84 #取出表达式里所有变量的集合 85 var_list = [] #这里使用全局变量 86 def varibles(exp): 87 for i in range(1,3): 88 if is_basic_exp(exp[i]): 89 var_list.append(exp[i]) 90 else: 91 varibles(exp[i]) 92 return var_list 93 94 95 if __name__=='__main__': 96 e1 = make_prod(make_sum('a',3), make_sum('b',make_sum(4,6))) 97 print(e1) 98 print("变量集合:",varibles(e1)) 99 values = {} 100 values['a'] = 3 101 values['b'] = 4 102 print(values) 103 print(eval_exp(e1, values))