数据结构:基于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): ...
随机推荐
- ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器
原文:Filters 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:何镇汐 ASP.NET MVC 过滤器 可在执行管道的前后特定阶段执行代码.过滤器可以配置为全局有效.仅对控 ...
- 将DataTable中的某列转换成数组或者List
string[] arrRate = dtRate.AsEnumerable().Select(d => d.Field<string>("arry")).ToA ...
- 【夯实PHP基础】UML序列图总结
原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...
- webpack学习总结
前言 在还未接触webpack,就有几个疑问: 1. webpack本质上是什么? 2. 跟异步模块加载有关系吗? 3. 可否生成多个文件,一定是一个? 4. 被引用的文件有其他异步加载模块怎么办? ...
- v14.0\AspNet\Microsoft.Web.AspNet.Props 找不到
错误 E:\Github\AutoMapper\src\AutoMapper\AutoMapper.CoreCLR.kproj : error : 未找到导入的项目"C:\Program ...
- 瞬间记住Javascript中apply与call的区别
关于Javascript函数的apply与call方法的用法,网上的文章很多,我就不多话了.apply和call的作用很相似,但使用方式有区别 apply与call的第一个参数都是一个对象,这个对象就 ...
- 【腾讯优测干货分享】如何降低App的待机内存(三)——探索内存增长的原因
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/8BiKIt3frq9Yv9KV5FXlGw 1.3新问题的进一步挖 ...
- Angular2学习笔记——路由器模型(Router)
Angular2以组件化的视角来看待web应用,使用Angular2开发的web应用,就是一棵组件树.组件大致分为两类:一类是如list.table这种通放之四海而皆准的通用组件,一类是专为业务开发的 ...
- linux shell 中的sleep命令
开始还以为是这样的语法: sleep(1), 后面发现是: linux shell 中的sleep命令 分类: LINUX 在有的shell(比如linux中的bash)中sleep还支持睡眠(分,小 ...
- Redis系列之key操作命令与Redis中的事务详解(六)
序言 本篇主要目的有二: 1.展示所有数据类型中key的所有操作命令,以供大家学习,查阅,更深入的挖掘redis潜力. 2.掌握redis中的事务,让你的数据完整性一致性拥有更优的保障. redis命 ...