exce函数
exce是一个python内置函数,可以将字符串的代码添加到名称空间;
eval() 和 exec() 函数的功能是相似的,都可以执行一个字符串形式的 Python 代码(代码以字符串的形式提供),相当于一个 Python 的解释器。
二者不同之处在于,eval() 执行完要返回结果,而 exec() 执行完不返回结果
eval()和exec()的用法
eval() 函数的语法格式为:
eval(source, globals=None, locals=None, /)
而 exec() 函数的语法格式如下:
exec(source, globals=None, locals=None, /)
exec(字符串形式的代码, 全局名称空间, 局部名称空间)
*********** *注意: 我要证明可以自己产生名称空间;
可以看到,二者的语法格式除了函数名,其他都相同,其中各个参数的具体含义如下:
- 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 为 bprint (dic.keys()) #先将 dic 的 key 打印出来,有一个元素 bexec("a = 4", dic) #在 exec 执行的语句后面跟一个作用域 dicprint(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 = 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)
输出结果为:
116
exec()和eval()的区别
前面已经讲过,它们的区别在于,eval() 执行完会返回结果,而 exec() 执行完不返回结果。举个例子:
a=10
b=20
c=30
g={'a':6, 'b':8} #定义一个字典
t={'b':100, 'c':10} #定义一个字典
print(eval('a+b+c', g, t)) #定义一个字典 116
运行结果为:
2
None
5
可以看出,exec() 中最适合放置运行后没有结果的语句,而 eval() 中适合放置有结果返回的语句。
如果 eval() 里放置一个没有结果返回的语句会怎样呢?例如下面代码:
a= eval("a = 2")
这时 Python 解释器会报 SyntaxError 错误,提示 eval() 中不识别等号语法。