Python教程 – eval 和 exec

本篇教程将介绍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()运算时才有效,运算之后就失效。

a, b, c = 1, 2, 3
eval('print(a, b, c)')                            # 1, 2, 3
eval('print(a, b, c)', {'a':4, 'b':5, 'c':6})     # 4, 5, 6
eval('print(a, b, c)', {'a':4, 'b':5, 'c':6}, {'a':7, 'b':8, 'c':9})   # 7, 8, 9
eval('print(a, b, c)')   # 1, 2, 3

此外,使用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

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/78932.html

(0)
guozi's avatarguozi
上一篇 2024年5月30日 下午2:31
下一篇 2024年5月30日 下午2:36

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注