Python中eval与exec的使用及区别
最近,eval()和exec()被用于开发中。我不知道在什么场景下使用哪个函数,所以我翻了Python的文档。让我们简单谈谈这两个函数之间的区别
1. eval函数
函数的作用:
计算指定表达式的值。也就是说,它要执行的Python代码只能是单个操作表达式(请注意,eval不支持任何形式的赋值操作),而不是复杂的代码逻辑,类似于lambda表达式。
函数定义:
eval(expression,globals=None,locals=None)
参数说明:
expression:必选参数,可以是字符串,也可以是任何code对象的例子(可以通过compile函数创建)。如果是字符串,将作为Python表达式进行分析和解释(使用globals和locals参数作为全局和本地命名空间)。
globals:可选参数表示全球命名空间(存储全球变量),如果提供,则必须是字典对象。
locals:可选参数表示当前局部命名空间(存储局部变量),如果提供,可以是任何映射对象。如果忽略了这个参数,它将获得与globals相同的值。
假如globals和locals都被忽略了,那么它们就会将eval()函数调用到环境中的整体命名空间和局部命名空间。
返回值:
如果expression是code对象,并且在创建code对象时,compile函数的mode参数为'exec',所以eval()函数的返回值是None。;
否则,如果expression是输出语句,如print(),则eval()返回结果为none;
否则,expression表达式的结果是eval()函数的返回值;
实例:
x=10 deffunc(): y=20 a=eval('x+y') print('a:',a) b=eval('x+y',{'x':1,'y':2}) print('b:',b) c=eval('x+y',{'x':1,'y':2},{'y':3,'z':4}) print('c:',c) d=eval('print(x,y)') print('d:',d) func()
输出结果
a:30 b:3 c:4 1020 d:None
对输出结果的解释:
对于变量a,忽略了eval函数的globals和locals参数,因此变量x和变量y都获得了eval函数在调用环境下的作用域中的变量值,即:x = 10, y = 20,a = x + y = 30
对于变量b,eval函数只提供globals参数而忽略locals参数,因此locals将采用globals参数的值,即:x = 1, y = 2,b = x + y = 3
提供了变量c、eval函数的globals参数和locals,因此eval函数将首先从所有功能域的globals中找到变量x, 在局部作用域locals中找到变量y,即:x = 1, y = 3, c = x + y = 4
对于变量d,由于print()函数不是计算表达式,没有计算结果,因此返回值为none
2. exec函数
函数的作用:
动态执行Python代码。也就是说,exec可以执行复杂的Python代码,而不是像eval函数那样只计算一个表达值。
函数定义:
exec(object[,globals[,locals]])
参数说明:
object:必选参数表示需要指定的Python代码。它必须是字符串或code对象。如果object是字符串,字符串将首先分析为一组Python语句,然后执行(除非语法错误)。如果object是code对象,那么它只是简单地执行。
globals:与eval函数相同的可选参数
locals:与eval函数相同的可选参数
返回值:
exec函数的返回值永远是None.
需要注意的是Python exec不是函数,而是内置语句(statement),但是Python 2中有一个execfile()函数。可以理解为Python statement和execfile()函数的三个exec功能可以集成到新的exec()函数中。
eval()函数与exec()函数的区别
eval()函数只能计算单个表达值,而exec()函数可以动态运行代码段。
eval()函数可以有返回值,而exec()函数返回值总是None。
实例1:
用exec函数试试实例1中的eval函数:
x=10 deffunc(): y=20 a=exec('x+y') print('a:',a) b=exec('x+y',{'x':1,'y':2}) print('b:',b) c=exec('x+y',{'x':1,'y':2},{'y':3,'z':4}) print('c:',c) d=exec('print(x,y)') print('d:',d) func()
输出结果
a:None b:None c:None 1020 d:None
正如我们所说,exec函数的返回值总是None。
实例2
x=10 expr=""" z=30 sum=x+y+z print(sum) """ deffunc(): y=20 exec(expr) exec(expr,{'x':1,'y':2}) exec(expr,{'x':1,'y':2},{'y':3,'z':4}) func()
输出结果
123 603334
对输出结果的解释:
前两个输出和上面解释的eval函数执行过程一样,没有太多解释。关于最后一个数字34,我们可以看到:x = 1, y = 3.毫无疑问。z为什么还是30而不是4其实很简单。我们只需要理清代码执行过程,相当于:
x=1 y=2 deffunc(): y=3 z=4 z=30 sum=x+y+z print(sum) func()