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))