likes
comments
collection
share

Python教程 - eval 和 exec

作者站长头像
站长
· 阅读数 29

本篇教程将介绍Python两个特殊的内置函数:eval()和exec()。通过这两个函数,可以将字符串转换成可执行的代码,进一步结合其他代码进行使用。

eval()

eval()可以输入一行字符串,并将输入的字符串转换成可执行的代码后执行。eval()不能进行复杂的逻辑运算,例如赋值操作、循环等。eval()有三个参数:

参数说明
expression输入的字符串
globals输入字符串中使用的全局变量,使用字典类型,默认为 None
locals输入字符串中使用的局部变量,使用字典类型,默认为 None

下面的例子执行后,效果等同于print("hello")

eval('print("hello")')    # hello ( 等同 print("hello") )

下面的例子额外设置了globals和locals参数,会依次覆盖掉a、b、c的内容,globals和locals参数并不代表真正的变量,只有在eval()运算时才有效,运算之后就失效。

ab, c = 123
eval('print(ab, c)')                            # 123
eval('print(ab, c)', {'a':4'b':5'c':6})     # 456
eval('print(ab, c)', {'a':4'b':5'c':6}, {'a':7'b':8'c':9})   # 789
eval('print(ab, c)')   # 123

此外,使用eval()可以返回计算的结果,下面的例子,会以x等于1、y等于2进行计算,返回x+y的结果。

a = eval('x+y',{'x':1,'y':2})
print(a)       # 3

虽然eval()非常方便好用,但相对有使用上的风险,因为eval()会将字符串转换成代码执行,如果应用在input,就可以输入类似“系统指令”的方法,操控系统的文件,例如下面代码执行后,会执行用户输入的代码, 这时如果输入了类似'import os; os.system('rm 123.txt')'的代码,就会删除电脑中的某个文件。

eval(input())

exec()

exec()可以输入多行字符串,并将输入的字符串转换成可执行的代码后执行,exec()可以进行较为复杂的逻辑运算,例如赋值操作、循环等。exec()有三个参数:

参数说明
object输入的字符串
globals输入字符串里使用的全局变量,使用字典类型,默认 None
locals输入字符串里使用的局部变量,使用字典类型,默认 None

下面的例子执行后,效果等同于执行一个for循环,打印出0到9。

exec('''
for i in range(10):
    print(i)
''')

exec()无法像eval()那样返回结果,如果使用返回的方式,只会返回None。

a = exec('x+y',{'x':1,'y':2})
print(a)     # None

转载自:https://juejin.cn/post/7374551836906733620
评论
请登录