Python eval()和exec()函数详解

eval() 和 exec() 函数都属于 Python 的内置函数,由于这两个函数在功能和用法方面都有相似之处,所以将它们放到一节进行介绍。

eval() 和 exec() 函数的功能是相似的,都可以执行一个字符串形式的 Python 代码(代码以字符串的形式提供),相当于一个 Python 的解释器。二者不同之处在于,eval() 执行完要返回结果,而 exec() 执行完不返回结果(文章后续会给出详细示例)。

eval()和exec()的用法

eval() 函数的语法格式为:

eval(expression, globals=None, locals=None, /)

而 exec() 函数的语法格式如下:

exec(expression, globals=None, locals=None, /)

可以看到,二者的语法格式除了函数名,其他都相同,其中各个参数的具体含义如下:

expression:这个参数是一个字符串,代表要执行的语句 。该语句受后面两个字典类型参数 globals 和 locals 的限制,只有在 globals 字典和 locals 字典作用域内的函数和变量才能被执行。

globals:这个参数管控的是一个全局的命名空间,即 expression 可以使用全局命名空间中的函数。如果只是提供了 globals 参数,而没有提供自定义的 __builtins__,则系统会将当前环境中的 __builtins__ 复制到自己提供的 globals 中,然后才会进行计算;如果连 globals 这个参数都没有被提供,则使用 Python 的全局命名空间。

locals:这个参数管控的是一个局部的命名空间,和 globals 类似,当它和 globals 中有重复或冲突时,以 locals 的为准。如果 locals 没有被提供,则默认为 globals。

注意,__builtins__ 是 Python 的内建模块,平时使用的 int、str、abs 都在这个模块中。通过 print(dic["__builtins__"]) 语句可以查看 __builtins__ 所对应的 value。

首先,通过如下的例子来演示参数 globals 作用域的作用,注意观察它是何时将 builtins 复制 globals 字典中去的:

dic={} #定义一个字典
dic['b'] = 3 #在 dic 中加一条元素,key 为 b
print (dic.keys()) #先将 dic 的 key 打印出来,有一个元素 b
exec("a = 4", dic) #在 exec 执行的语句后面跟一个作用域 dic
print(dic.keys()) #exec 后,dic 的 key 多了一个

运行结果为:

dict_keys(['b'])
dict_keys(['b', '__builtins__', 'a'])

上面的代码是在作用域 dic 下执行了一句 a = 4 的代码。可以看出,exec() 之前 dic 中的 key 只有一个 b。执行完 exec() 之后,系统在 dic 中生成了两个新的 key,分别是 a 和 __builtins__。其中,a 为执行语句生成的变量,系统将其放到指定的作用域字典里;
__builtins__ 是系统加入的内置 key。

locals参数的用法就很简单了,举个例子:

a=10
b=20
c=30
g={'a':6, 'b':8} #定义一个字典
t={'b':100, 'c':10} #定义一个字典
print(eval('a+b+c', g, t)) #定义一个字典 116

输出结果为:

116

exec()和eval()的区别

前面已经讲过,它们的区别在于,eval() 执行完会返回结果,而 exec() 执行完不返回结果。举个例子:

a = 1
exec("a = 2") #相当于直接执行 a=2
print(a)
a = exec("2+3") #相当于直接执行 2+3,但是并没有返回值,a 应为 None
print(a)
a = eval('2+3') #执行 2+3,并把结果返回给 a
print(a)

运行结果为:

2
None
5

可以看出,exec() 中最适合放置运行后没有结果的语句,而 eval() 中适合放置有结果返回的语句。

如果 eval() 里放置一个没有结果返回的语句会怎样呢?例如下面代码:

a= eval("a = 2")

这时 Python 解释器会报 SyntaxError 错误,提示 eval() 中不识别等号语法。

eval() 和 exec() 函数的应用场景

在使用 Python 开发服务端程序时,这两个函数应用得非常广泛。例如,客户端向服务端发送一段字符串代码,服务端无需关心具体的内容,直接跳过 eval() 或 exec() 来执行,这样的设计会使服务端与客户端的耦合度更低,系统更易扩展。

另外,如果读者以后接触 TensorFlow 框架,就会发现该框架中的静态图就是类似这个原理实现的:

TensorFlow 中先将张量定义在一个静态图里,这就相当将键值对添加到字典里一样;

TensorFlow 中通过 session 和张量的 eval() 函数来进行具体值的运算,就当于使用 eval() 函数进行具体值的运算一样。

需要注意的是,在使用 eval() 或是 exec() 来处理请求代码时,函数 eval() 和 exec() 常常会被黑客利用,成为可以执行系统级命令的入口点,进而来攻击网站。解决方法是:通过设置其命名空间里的可执行函数,来限制 eval() 和 exec() 的执行范围。

Python eval()和exec()函数详解相关推荐

  1. Python eval 与 exec 函数的区别 - Python零基础入门教程

    目录 一.Python eval 与 exec 函数的区别 二.价值 10 个亿的智能机器人核心代码 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Py ...

  2. Python eval 与 exec 函数区别 - Python零基础入门教程

    目录 一.Python eval 与 exec 函数的区别 二.价值 10 个亿的智能机器人核心代码 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Py ...

  3. Python eval 与 exec 函数 - Python零基础入门教程

    目录 一.前言 二.Python eval 与 exec 函数简介 三.Python eval 与 exec 函数使用 1.exec 函数执行代码段 2.exec 函数执行 py 文件 四.猜你喜欢 ...

  4. Python seek()和tell()函数详解

    Python seek()和tell()函数详解 在讲解 seek() 函数和 tell() 函数之前,首先来了解一下什么是文件指针. 我们知道,使用 open() 函数打开文件并读取文件中的内容时, ...

  5. Python中的bbox_overlaps()函数详解

    Python中的bbox_overlaps()函数详解 想要编写自己的目标检测算法,就需要掌握bounding box(边界框)之间的关系.在这之中,bbox_overlaps()函数是一个非常实用的 ...

  6. 【Python基础】reduce函数详解

    转载请注明出处:[Python基础]reduce函数详解 reduce函数原本在python2中也是个内置函数,不过在python3中被移到functools模块中. reduce函数先从列表(或序列 ...

  7. python中的zip函数详解_python中的 zip函数详解

    python中zip()函数用法举例 定义:zip([iterable, ...]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple ...

  8. python读取数据的函数详解_python如何从文件读取数据及解析

    python如何从文件读取数据及解析 读取整个文件: 首先创建一个文件,例如我创建了一个t x t文件了. 然后我想读取这个文件了,我首先将上面的这个文件保存在我即将要创建的Python的文件目录下, ...

  9. python夯实基础日记-函数详解

    函数也是对象_内存分析 Python中,"一切都是对象".实际上,执行def定义函数后,系统就创建了相应的函数对象. 在定义时就已经创建好了函数对象,调用时无需创建,只是反复调用 ...

  10. python读取数据的函数详解_你了解文件缓存机制吗?磁盘文件如何读写?Python中open函数详解...

    我们知道,在使用Python打开一个文件时,一般使用的是open()函数,但是你真正了解这个函数么?文件打开后如何进行缓存?对于大文件它是如何处理的?今天,小编带你来详细了解一下-- Python如何 ...

最新文章

  1. 自考总结-2019-4-14
  2. 窗体添加阴影效果如此简单
  3. 几个环境变量说明:ORACLE_SID、DB_NAME、INSTANCE_NAME、DB_DOMIAN、GLOBAL_NAMES
  4. CodeForces - 1373D Maximum Sum on Even Positions(最大连续子段和)
  5. STL set和multiset
  6. wps分享为什么要登入_[win]为什么你需要便携应用?portableapps让你得心应手.
  7. CSS雪碧,即CSS Sprite 简单的例子
  8. 禁止更改计算机名_PiNetwork如何更改名字教程
  9. 用VB.net编写的Windows服务管理程序(堪称经典)全部源代码
  10. IPO | 经纬恒润登科创板,好赛道下隐患依然很突出
  11. 关于微信卡券网页跳转链接能力的下线
  12. Speex手册----Speex 简介
  13. 阿里云通信发布全新号码认证服务, 重新定义手机号码认证的方式
  14. Python利用SMTP/IMTP制作简单邮件(QQ邮箱)发送程序(保姆级)
  15. android应用开发完全
  16. linux buffer io error,Linux Buffer I/O error on device dm-4, logical block,dm-4logical
  17. c语言从键盘输入一个百分制成绩score,C语言程序设计实验实验指导书及答案
  18. win10使用自带的Hyper-V安装win7虚拟机
  19. 【途虎养车】数分笔试题目整理
  20. 【报告分享】2021中国人健康大数据报告-光华博思特(附下载)

热门文章

  1. python相关性分析及可视化
  2. job每分钟执行 oracle_oracle的job怎么设置一个过程每5分钟执行一次
  3. Unity Shader 内置函数
  4. 平均获客成本_获客成本5年翻了6倍,布局私域流量的背后隐藏了哪些惊人数据?...
  5. 当了两天向导,带他进行了上海都市游885
  6. join me - gregorian 歌词翻译
  7. 完整版TCP/UDP第7点
  8. 什么是英特尔® Edison 模块?
  9. mysql的user表被清空_不小心删除掉了mysql user表无法登陆进mysql解决方法
  10. 视觉十四讲:第九讲_BA优化_g2o