eval() 与 exec()
本篇教学会介绍 Python 两个特别的内建函数: eval() 和 exec(),透过这两个函数,能够将字串转换成可以运作的程序码,近一步搭配其他的程序码做运用。
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
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() 可以回传计算的结果 ( 有点类似 lambda 匿名函数 ),下方的例子,会以 x 等于 1、y 等于 2 做计算,回传 x+y 的结果。
a = eval('x+y',{'x':1,'y':2})
print(a) # 3
虽然 eval() 很方便好用,但相对有使用上的风险,因为 eval() 会将字串转换成程序码执行,如果套用在 input,就可以输入类似“系统指令”的方法,操控系统的文件,例如下方的程序码执行后,会执行用户输入的程序码,这时如果输入了类似“__import__('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
微信扫码关注
抖音扫码关注