Python内置函数——eval

英文文档:

eval (expressionglobals=Nonelocals=None) The arguments are a string and optional globals and locals. If provided,  globals must be a dictionary. If provided,  locals can be any mapping object. The  expression argument is parsed and evaluated as a Python expression (technically speaking, a condition list) using the  globals and  locals dictionaries as global and local namespace. If the  globals dictionary is present and lacks ‘__builtins__’, the current globals are copied into  globals before  expression is parsed. This means that  expression normally has full access to the standard  builtins module and restricted environments are propagated. If the  locals dictionary is omitted it defaults to the  globals dictionary. If both dictionaries are omitted, the expression is executed in the environment where  eval() is called. The return value is the result of the evaluated expression. Syntax errors are reported as exceptions. Example:
>>> x = 1
>>> eval('x+1')
2

This function can also be used to execute arbitrary code objects (such as those created by compile()). In this case pass a code object instead of a string. If the code object has been compiled with 'exec' as the modeargument, eval()‘s return value will be None.

Hints: dynamic execution of statements is supported by the  exec() function. The  globals() and  locals() functions returns the current global and local dictionary, respectively, which may be useful to pass around for use by  eval() or  exec(). See  ast.literal_eval() for a function that can safely evaluate strings with expressions containing only literals. 说明:      1. 执行动态语句,返回语句执行的值。
>>> eval('1+2+3+4')
10

  2. 第一个参数为语句字符串,globals参数和locals参数为可选参数,如果提供,globals参数必需是字典,locals参数为mapping对象。

  3. globals参数用来指定代码执行时可以使用的全局变量以及收集代码执行后的全局变量。

复制代码
>>> g = {'num':2}

>>> eval('num + 2') #num未定义
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    eval('num + 2')
  File "<string>", line 1, in <module>
NameError: name 'num' is not defined

>>> eval('num + 2',g) #g中有定义num,可执行
4
复制代码

   4. locals参数用来指定代码执行时可以使用的局部变量以及收集代码执行后的局部变量

>>> g = {'num1':2}
>>> l = {'num2':4}
>>> eval('num1+num2',g,l)
6

   5. 为了保证代码成功运行,globals参数字典不包含 __builtins__ 这个 key 时,Python会自动添加一个key为 __builtins__ ,value为builtins模块的引用。如果确实要限制代码不使用builtins模块,需要在global添加一个key为__builtins__,value为{}的项即可(很少有人这么干吧)。

复制代码
>>> g = {}
>>> eval('abs(-1)',g)
1

>>> g = {'__builtins__':{}}
>>> eval('abs(-1)',g) #不能使用内置函数了
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    eval('abs(-1)',g)
  File "<string>", line 1, in <module>
NameError: name 'abs' is not defined
复制代码

   6. 当globals参数不提供是,Python默认使用globals()函数返回的字典去调用。当locals参数不提供时,默认使用globals参数去调用。

复制代码
>>> num = 1
>>> eval('num+2')
3

>>> globals() #返回字典中含有num的key
{'__doc__': None, 'num': 1, '__package__': None, '__name__': '__main__', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__builtins__': <module 'builtins' (built-in)>}

>>> eval('num+2',{}) #locals参数未提供,locals参数=globals参数
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    eval('num+2',{})
  File "<string>", line 1, in <module>
NameError: name 'num' is not defined

>>> l = locals() 
>>> eval('num+2',{},l) #locals参数含有num的key,能求值
3

>>> locals()
{'__doc__': None, 'l': {...}, 'num': 1, '__package__': None, '__name__': '__main__', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__builtins__': <module 'builtins' (built-in)>}
>>> 
复制代码

转载于:https://www.cnblogs.com/alexzu/p/9783402.html

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值