数据结构:基于list实现二元表达式(python版)
#!/usr/bin/env python
# -*- coding:utf-8 -*- def make_sum(a, b):
return ['+', a, b] def make_prod(a, b):
return ['*', a, b] def make_diff(a, b):
return ['-', a, b] def make_div(a, b):
return ['/', a, b] def is_basic_exp(a):
return not isinstance(a, list) def is_number(x):
return (isinstance(x, int) or isinstance(x, float) or isinstance(x, complex)) #表达式计算
def eval_exp(e, values):
if is_basic_exp(e):
#如果e位于字典里则返回键对应的值,否则直接返回e
if e in values.keys():
return values[e]
else:
return e
op, a, b = e[0], eval_exp(e[1], values), eval_exp(e[2], values)
if op=='+':
return eval_sum(a, b)
elif op=='-':
return eval_diff(a, b)
elif op=='*':
return eval_prod(a, b)
elif op=='/':
return eval_div(a, b)
else:
raise ValueError("Unknown operator:", op) #加法
def eval_sum(a, b):
if is_number(a) and is_number(b):
return a+b
if is_number(a) and a==0:
return b
if is_number(b) and b==0:
return a
return make_sum(a, b) #减法
def eval_diff(a, b):
if is_number(a) and is_number(b):
return a - b
if is_number(a) and a==0:
return -b
if is_number(b) and b==0:
return a
return make_diff(a, b) #乘法
def eval_prod(a, b):
if is_number(a) and is_number(b):
return a * b
if is_number(a) and a==0:
return 0
if is_number(b) and b==0:
return 0
return make_prod(a, b) #除法
def eval_div(a, b):
if is_number(a) and is_number(b):
return a / b
if is_number(a) and a==0:
return 0
if is_number(b) and b==1:
return a
if is_number(b) and b==0:
raise ZeroDivisionError
return make_div(a, b) #取出表达式里所有变量的集合
var_list = [] #这里使用全局变量
def varibles(exp):
for i in range(1,3):
if is_basic_exp(exp[i]):
var_list.append(exp[i])
else:
varibles(exp[i])
return var_list if __name__=='__main__':
e1 = make_prod(make_sum('a',3), make_sum('b',make_sum(4,6)))
print(e1)
print("变量集合:",varibles(e1))
values = {}
values['a'] = 3
values['b'] = 4
print(values)
print(eval_exp(e1, values))
数据结构:基于list实现二元表达式(python版)的更多相关文章
- 数据结构之 栈 (Python 版)
数据结构之 栈 (Python 版) -- 利用线性表实现栈 栈的特性: 后进先出 基于顺序表实现栈 class SStack(): ''' 基于顺序表 实现的 栈类 ''' def __init__ ...
- 数据结构之线性表(python版)
数据结构之线性表(python版) 单链表 1.1 定义表节点 # 定义表节点 class LNode(): def __init__(self,elem,next = None): self.el ...
- 数据结构之队列(Python 版)
数据结构之队列(Python 版) 队列的特点:先进先出(FIFO) 使用链表技术实现 使用单链表技术,在表首尾两端分别加入指针,就很容易实现队列类. 使用顺序表list实现 # 队列类的实现 cla ...
- 栈应用之 后缀表达式计算 (python 版)
栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1. 中缀表达式.前缀表达式.后缀表达式区别 中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...
- 北京大学公开课《数据结构与算法Python版》
之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...
- 基于股票大数据分析的Python入门实战(视频教学版)的精彩插图汇总
在我写的这本书,<基于股票大数据分析的Python入门实战(视频教学版)>里,用能吸引人的股票案例,带领大家入门Python的语法,数据分析和机器学习. 京东链接是这个:https://i ...
- 【数据结构与算法Python版学习笔记】引言
学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...
- 数据结构:顺序表(python版)
顺序表python版的实现(部分功能未实现) #!/usr/bin/env python # -*- coding:utf-8 -*- class SeqList(object): def __ini ...
- 【python】python的二元表达式和三元表达式
二元表达式 x,y=4,3if x>y: s = yelse: s= x print s x if x<y else y 三元表达式: >>> def f(x,y): ...
随机推荐
- Linux主机上使用交叉编译移植u-boot到树莓派
0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...
- 【干货分享】流程DEMO-合同会审表
流程名: 合同会审表 业务描述: 合同的审批及签订 流程相关文件: 流程包.xml 事务呈批表业务服务.xml 事务呈批表主数据.xml 流程说明: 1.此流程必须先进行事务呈批表流程的配置才可 ...
- [故障公告]受阿里云部分ECS服务器故障影响,目前无法上传图片与文件
抱歉!今天下午阿里云华东1可用区B的部分ECS服务器出现IO HANG问题,受此影响,我们的图片与文件上传服务器无法访问,由此给您带来麻烦,请您谅解. 16:30左右开始,我们发现图片与文件上传服务器 ...
- mono for android 读取网络远程图片
布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=& ...
- windows phone如何才能在中国翻身?
最近的新闻告诉我们,Android和IOS的系统继续保持市场领先,并且Android的市场份额达到了历史最高点. 做为windows phone的消费者,作为微软粉丝,我感到十分的不爽. 前几天MIU ...
- 我所理解的SOA和微服务
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5847441.html SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上 ...
- 将一句话里的单词进行倒置,标点符号不倒换。比如将“I come from Shanghai.”倒换后变为“Shanghai. from come I”
string str = "I come from Shanghai."; //根据空格切割 string[] strS = str.Split(' '); string temp ...
- Js删除数组重复元素的多种方法
js对数组元素去重有很多种处理的方法,本篇文章中为网络资源整理,当然每个方法我都去实现了:写下来的目的是希望自己活学活用,下次遇到问题后方便解决. 第一种 function oSort(arr){ v ...
- Redis之AOF备份
redis在进行备份的时候有2种方式:1.RDB:2.AOF:现在主要讲哈AOF的备份 1.找到redis.config配置文件,大部分下载下来和redis-service同目录: 2.打开redie ...
- JS原生第三篇 (帅哥)
1.1 数 组 1. 数组 看电影 电影院 座位 大的变量 里面可以放很多的值 var arr = [1,3,57]; var ar = new Array(); ...