在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(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

第6.4节 Python动态表达式计算:eval函数详述的更多相关文章

  1. C#动态表达式计算

    C#动态表达式计算 应该有不少人开发过程中遇到过这样的需求,我们直接看图说话: 如上图所示,其中Entity为实体类,其中包括五个属性,该五个属性的值分别来自于数据库查询结果: 用户通过可视化界面进行 ...

  2. C#动态表达式计算(续2)

    上两篇废话太多,这一次我就不多说了,由于代码比较简单,可以直接从https://github.com/scottshare/DynamicExpress.git地址下载. 以下说明一下使用方法: Dy ...

  3. 第6.6节 Python动态执行小结

    一.    Python动态执行支持通过输入数据流或文件传入Python源代码串,进行编译后执行,可以通过这种方式扩展Python程序的功能: 二.    动态执行方法可能导致恶意攻击,因此使用时需要 ...

  4. [Python] 动态函数调用(通过函数名)

    2018-04-09 update 利用python中的内置函数 eval() ,函数说明: def eval(*args, **kwargs): # real signature unknown & ...

  5. 第6.3节 Python动态执行之动态编译的compile函数

    Python支持动态代码主要三个函数,分别是compile.eval和exec.本节介绍compile函数的语法和相关使用.compile函数用来编译一段字符串的源码,将其编译为字节码或者AST(抽像 ...

  6. C#动态表达式计算(续1)

    距上一帖近五天时间,让大家久等了,没想到关注这个话题的也不少人,正如有同志所说的想解决该问题其实是有太多的解决方法,比如动态构造类编译.调用vbscript或者可以采用javascript解析引擎或者 ...

  7. 表达式计算-----------eval()运算符

    1.java的eval()方法(或称之为运算符)可以将字符串解析成可以运行的javaScript代码,例如 eval()只有一个参数.如果传入的参数不是一个字符串,那么它会直接返回这个参数.如果传入的 ...

  8. [转]动态管理视图和函数 (Transact-SQL)

    动态管理视图和函数返回可用于监视服务器实例的运行状况.诊断故障以及优化性能的服务器状态信息. 重要提示 动态管理视图和函数返回特定于实现的内部状态数据. 在未来的 SQL Server 版本中,它们的 ...

  9. 第6.5节 exec函数:一个自说自话的强大Python动态编译器

    在Python动态执行的函数中,exec是用于执行一个字符串内包含的Python源码或其编译后对应的字节码. 一.    语法 1.    exec(Code, globals=None, local ...

随机推荐

  1. netstat与ss

    netstat -t:tcp协议的连接 -u:udp协议的链接 -l:监听状态的连接 -a:所有状态的连接 -p:连接相关的进程 -n:数字格式显示 -r:显示路由表,类似于route或ip rout ...

  2. c语言博客作业——顺序结构,分支结构

    1.PTA截图 2.本章学习总结 2.1学习内容总结 数据的输入和输出:%d表示输入输出整数 %.lf表示输入浮点数 %.nf表示输出结果保留n位小数 if-else的分支结构可以有限个分类情况进行处 ...

  3. OJ-1:时钟问题【九度1553】

    题目描述: 如图,给定任意时刻,求时针和分针的夹角(劣弧所对应的角). 输入: 输入包含多组测试数据,每组测试数据由一个按hh:mm表示的时刻组成. 输出: 对于每组测试数据,输出一个浮点数,代表时针 ...

  4. 5.MVCC

    5 MVCC ​ 全称是Multi-Version Concurrent Control,即多版本并发控制,在MVCC协议下,每个读操作会看到一个一致性的snapshot,并且可以实现非阻塞的读.MV ...

  5. Reactor中的Thread和Scheduler

    目录 简介 Thread多线程 Schedule定时器 Schedulers工具类 publishOn 和 subscribeOn publishOn subscribeOn 简介 今天我们要介绍的是 ...

  6. 虚拟DOM与diff算法

    虚拟DOM与diff算法 虚拟DOM 在DOM操作中哪怕我们的数据,发生了一丢丢的变化,也会被强制重建整预DOM树.这么做,涉及到很多元素的重绘和重排,导致性能浪费严重 只要实现按需更新页面上的元素即 ...

  7. CPU相关的学习

    我理解的CPU 目前对cpu的了解停留在这个水平 查看CPU型号: cat /proc/cpuinfo |grep model |tail -n 1 model name : Intel(R) Xeo ...

  8. cnblog markdown 模式下调整图片大小

    流程 上传图片,获得图片链接,例如 ![](https://img2020.cnblogs.com/blog/2163507/202010/2163507-20201030205035211-7968 ...

  9. inotify+rsync实时同步备份nfs

    学习教程总结: 1.主机1:172.16.1.41,安装rsync并运行rsync --daemon 配置好/etc/rsyncd.conf 和密码文件rscync.password并设置chomd ...

  10. nginx的403权限问题

    修改访问目录的权限为755 找到Nginx的配置文件nginx.conf,做如下改变: (1)将user nobody; 改为user root; (2)找到 autoindex  off 更改为on ...