第6.4节 Python动态表达式计算:eval函数详述

本文深入解析Python中的eval函数,涵盖其语法、参数说明及返回值,并通过三种不同的加法实现示例,展示eval函数在不同场景下的应用,适合Python初学者及进阶者阅读。
部署运行你感兴趣的模型镜像

在Python动态执行的函数中,eval是用于执行表达式计算的函数,这个函数用于执行字符串中包含的一个表达式或其编译后对应的代码,不能适用于执行Python语句和完整的代码。

一、    语法
1、    语法:eval(expression, globals=None, locals=None)
2、    参数说明:
1)    expression实参是一个字符串或compile编译好的表达式代码,如果是编译的代码,必须编译时模式指定为‘eval’,否则函数执行后返回None;
2)    globals:全局名字空间,必须是一个字典,可选参数;
3)    locals:局部名字空间或称为本地名字空间,可以是任何映射对象如字典。
特别说明:
4)    前面已经介绍了名字空间的概念,名字空间用字典类型来定义,此时在名字空间中的变量名就是该字典的键,变量值则是该键对应的值;
5)    如果省略 locals 字典则其默认值为 globals 字典。 如果两个字典同时省略,表达式会在 eval() 被调用的环境中执行;
6)    如果执行eval时,表达式中存在变量,则该变量的查找步骤为:去局部名字空间中查找->去全局名字空间中查找->去当前执行代码的空间查找。如果有一个步骤找到,则直接取该变量参与运算,否则到下一个名字空间中查找,都找不到则报错
3、    返回值:
1)    当正常执行时返回表达式对应的计算结果,语法错误将作为异常处理。
二、    举例:三种加法实现
1、    第一种方式:字符串表达式执行,没有使用全局空间和局部空间,不编译

def add1(a,b):  # 
    s='a+b'
    return eval(s)
        此时执行调用add1(1,2)返回3


2、    第二种方式:字符串表达式编译后执行,没有使用全局空间和局部空间

def add2(a,b):
s='a+b'
    c=compile(s,'<expression string>','eval')
    return eval(c)    


此时执行调用add2(1,2)返回3
3、    第三种方式:带全局空间和局部空间的字符串表达式编译后执行

def add3(a,b):
    s='a+b'
    c=compile(s,'<expression string>','eval')
    gArea,lArea = {},{}
    gArea['a']=str(a*10)
    gArea['b']=str(b*10)
lArea['a']=str(a*100)
    return eval(c,gArea,lArea)    #指定全局名字空间和局部名字空间


此时执行调用add3(1,2)返回’10020’。为什么是’10020’?我们一步步来解释:
1)    首先函数定义了2个参数和一个局部变量加法字符串,他们在函数所在的名字空间,经调用传参时,a=1,b=2;
2)    编译表达式(不编译直接执行字符串效果相同);
3)    下面定义了执行字符串对应代码的全局名字空间和局部名字空间gArea,lArea;
4)    给全局空间的变量a赋值为a*10(a=1)结果对应字符串‘10’,变量b赋值为字符串’20’;
5)    给局部名字空间的变量a赋值为’100’;
6)    此时执行编译代码,就是执行变量a+变量b,按照上面介绍的查找变量的方法,在局部名字空间中找到变量a,在全局名字空间中找到变量b,二者都是字符串,相加变成了字符串’100’+’20’的拼接,返回字符串’10020’
三种方法执行截屏:
 
本节老猿详细介绍了动态执行的eval函数及各个参数,并结合例子介绍了相关方法的使用。

[老猿Python,跟老猿学Python! 请大家多支持,包括阅读文章、关注、点赞、发表评论,谢谢!](https://blog.csdn.net/LaoYuanPython)
 

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

eval32 v3.2.6 Beta R1 ShellEval数学表达式动态解释计算扩展函数库 ========================================= 欢迎使用:ShellEval数学表达式动态解释计算扩展函数库。 当前最终发行版本:V3.2.6。最初作为一个实用的文本字符串解释器,可以帮助程序开发人员快 速地整合到自己的应用程序之中。随着版本的不断升级,功能也越发完善,现V3.2.6版本已包含字符串解释、数学计算、线性代数、动态编连等相关操作总计大约两百个导出接口函数,主要用于实现高级语言之间的动态解释计算与调用。 例如对MATLAB的不能实现的相关功能做了较大的扩充。关于V3.2.6以前各个旧版本的相关介绍在网上请自行下载。 ShellEvalV3.2.6不是对旧版本如EvalExprV1.4.4等的简单扩充,相反地,它在旧版本EvalExprV1.4.4 的基础上去掉了大部分与数动态编连解释计算无关的函数,只保留了原先版本的主要核心算法,同时对核心算法的相应函数另外增加了一个在原函数同名函数的基础上加M 结尾的版本, 例tsEvalExpr 对应的函数是:tsEvalExprM。这类以M 结尾的函数提供了基于MatCom核心的矩阵运 算功能。虽然本函数库是基于MatCom Version 4.5.1开发而成的,但是使用它时并不需要用户安装拥有MatCom,只需要使用本函数库提供的相应接口即可实现。 众所周知,MatLab、MatCom等数学软件提供了大约上千个矩阵数运算函数,但是对于表达式动态解释执行却是不能够实现的。例如: eval(TM(“[1,2;3,4]”)); MatCom可以实现,但是其功能也仅限于此。如下最基本的调用: eval(TM(“sin([1,2;3,4]))); 等皆不能实现。而MatLab 虽然可以利用计算引擎技术与DDE 动态数据交换技 术间接实现字符串表达式动态解释执行,但是效率低下,更重要的是,它要求用户机器上必须安装有匹配版本的体积庞大的MatLab,实际软件发布时是难以保证的。 本函数库主要用于对MATLAB、MatCom、MATFOR等矩阵运算软件表达式动态解释执行的扩展,利用它可以实现非常复杂的表达式计算,无论在表达式类 型种类还是矩阵运算方面都远非网络上的其他一些表达式计算控件可比。 例如计算上式,如下: #include “eval32.h” ... ... tsInitialize(NULL,NULL,NULL); tsMatrix * vValue = tsAllocM(1); INT nRetFlag = tsEvalExprM(_T(“sin([1,2;3,4])),vValue); if(nRetFlag >= 0){ tsDispM(vValue); }else{ _tprintf(_T(Eval Failed\n”)); } tsFreeM(vValue); vValue = NULL; tsTerminate(); 可以看出利用本函数库完全无需依赖于MatLab、MatCom或者其他第三方软件,当然你也可以结合它们使用,使得程序开发更加得心应手。 利用本工具你甚至可以只用四条语句即可编制一个迷你版的MatLab 软件。 如下: #include “eval32.h” int main(int argc, char* argv[]) { tsInitialize(NULL,NULL,NULL); atexit((void (*)())(tsTerminate)); tsShellEvalM(); tsTerminate(); return 0; } 怎样?够简单吧!但是生成的迷你版MatLab功能可不容小觑。为了运行之,需要将以下动态链接支持库复制到程序搜索目录下: eval32.dll 、ago4501.dll、v4501v.dll。 关于本函数库内核及具体使用方法以下将有介绍。 本函数库仿照Math Tools公司的MatCom与Math Works公司的MatLab制作开发,相信对于数计算与混合编程的各位程序爱好者与开发人员有所帮助。 ==========eval32 ver3.2.6 beta============= 在 V3.2.3 基础上进行了代码的重新规范化编写。此 版本除在原先的基础上增加了少量功能之外,实现 算法并未加以重大修改。此版本并不与原先任何版 本兼容。 ==========ShellEval Ver3.2.6 ============= 筆者按。 2010、09、18
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值