数据结构:基于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 MVC原理
仅此一文让你明白ASP.NET MVC原理 ASP.NET MVC由以下两个核心组成部分构成: 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与 ...
- Java 程序优化 (读书笔记)
--From : JAVA程序性能优化 (葛一鸣,清华大学出版社,2012/10第一版) 1. java性能调优概述 1.1 性能概述 程序性能: 执行速度,内存分配,启动时间, 负载承受能力. 性能 ...
- javaScript中的小细节-script标签中的预解析
首先介绍预解析,虽然预解析字面意思很好理解,但是却是出坑出的最多的地方,也是bug经常会有的地方,利用好预解析的特性可以解决很多问题,并且提高代码的质量及数量,浏览器在解析代码前会把变量的声明和函数( ...
- JavaScript知识结构图
画的一个知识结构图,方便理解.
- (jms)ActiveMQ 安装配置.
前言 ActiveMQ他是Apache出品的一个JMS提供者,管理会话和队列,运行在JVM下,支持多种语言,如JAVA,C++,C#,应用协议: OpenWire,Stomp REST,WS Noti ...
- mono for android 获取手机照片或拍照并裁剪保存
axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...
- ASP.NET Core "完整发布,自带运行时" 到jexus
一.阅读前须知 1.使用 jexus整合asp.net core的优点: 1)支持多站点,同一端口可以同时支持任何多的asp.net core应用程序: 2)应用程序启动.停 ...
- ecshop 模板开发总结
ecshop 模板开发总结 模板标签 1.{$articleTitle|escape:"html"} 描述:用于html转码,url转码,在没有转码的变量上转换单引号,十六进制转码 ...
- ajax-异步JavaScript和XML
什么是ajax? ajax是异步的javascript和XML ( Asynchronous Javascript And XML ) 优点:节省用户操作时间,提高用户体验.减少数据请求次数. 什么是 ...
- 给 Android 研发的一些的建议
作为应用程序开发人员,我们需要注意在开发应用程序时的一些问题. 这些问题的安全级别是取决于应用程序的类型和使用域. 在这里列举了一些我们在开发中需要注意的一些问题: 开发日志输出相关: 1. 不要在 ...