本篇教程将介绍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