zoukankan      html  css  js  c++  java
  • 数据结构:基于list实现二元表达式(python版)

      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))
  • 相关阅读:
    22.渐进式框架的理解
    21、Vue组件间通信6种方式(网上找视频看)
    20、vue中如何使用event对象
    19.vue组件中data为什么必须是一个函数
    18、Vue.js中this.$nextTick()的使用
    17.v-on可以监听多个方法吗
    16.分别简述computed和watch的使用场景
    15. 请说出vue.cli项目中src目录每个文件夹和文件的用法
    13、vue中v-model的应用及使用详解(看链接)
    eclipse编码问题
  • 原文地址:https://www.cnblogs.com/xautxuqiang/p/6125902.html
Copyright © 2011-2022 走看看