Python中eval()与exec()

eval函数:计算指定表达式的值。即要执行的Python代码只能是单个运算表达式(注意eval不支持任意形式的赋值操作),而不能是复杂的代码逻辑

#函数定义
eval(expression, globals=None, locals=None)

参数说明

  1. expression:必选参数,可以是字符串,也可以是一个任意的code对象实例。如果它是一个字符串,它会被当作一个(使用globals和locals参数作为全局和本地命名空间的)Python表达式进行分析和解释。
  2. globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。
  3. locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。
  4. 如果globals与locals都被忽略,那么它们将取eval()函数被调用环境下的全局命名空间和局部命名空间。

示例程序1:

x = 10


def func():
    y = 20
    a = eval('x + y')
    print('a: ', a)
    b = eval('x + y', {'x': 1, 'y': 2})
    print('b: ', b)
    c = eval('x + y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
    print('c: ', c)
    d = eval('print(x, y)')
    print('d: ', d)


func()

# 输出结果:
# a:  30
# b:  3
# c:  4
# 10 20
# d:  None

输出解释:

  1. 对于变量a,eval函数的globals和locals参数都被忽略了,因此变量x和变量y都取得的是eval函数被调用环境下的作用域中的变量值,即:x = 10, y = 20,a = x + y = 30
  2. 对于变量b,eval函数只提供了globals参数而忽略了locals参数,因此locals会取globals参数的值,即:x = 1, y = 2,b = x + y = 3
  3. 对于变量c,eval函数的globals参数和locals都被提供了,eval函数的查找顺序是先查找locals,再查找globals。因此,eval函数会先从全局作用域globals中找到变量x, 再从局部作用域locals中找到变量y,即:x = 1, y = 3, c = x + y = 4
  4. 对于变量d,因为print()函数不是一个计算表达式,没有计算结果,因此返回值为None

示例程序2:

x = 10


def func():
    y = 20
    a = eval('x + y')
    print('a: ', a)
    b = eval('x + y', {'x': 1, 'y': 2})
    print('b: ', b)
    c = eval('x + y', {'x': 1, 'y': 2}, {'x': 3, 'y': 4})
    print('c: ', c)
    d = eval('print(x, y)')
    print('d: ', d)


func()

# 输出结果:
# a:  30
# b:  3
# c:  7         # 观察发现,此时c的值为7,查找顺序为先locals,再globals
# 10 20
# d:  None

exec函数:动态执行Python代码。也就是说exec可以执行复杂的Python代码,而不像eval函数那么样只能计算一个表达式的值。

# 函数定义:
exec(object[, globals[, locals]])
  1. object:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象。如果object是一个字符串,该字符串会先被解析为一组Python语句,然后再执行(除非发生语法错误)。如果object是一个code对象,那么它只是被简单的执行。
  2. globals:可选参数,同eval函数
  3. locals:可选参数,同eval函数

返回值:exec函数的返回值永远为None.

eval()函数与exec()函数的区别:

  • eval()函数只能计算单个表达式的值,而exec()函数可以运行代码块。
  • eval()函数可以有返回值,而exec()函数返回值永远为None。

示例程序3:

x = 10


def func():
    y = 20
    a = exec('x + y')
    print('a: ', a)
    b = exec('x + y', {'x': 1, 'y': 2})
    print('b: ', b)
    c = exec('x + y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
    print('c: ', c)
    d = exec('print(x, y)')
    print('d: ', d)


func()

# 输出结果:
# a:  None
# b:  None
# c:  None
# 10 20
# d:  None

示例程序4:

x = 10
expr = """
z = 30
sum = x + y + z
print(sum)
"""


def func():
    y = 20
    exec(expr)
    exec(expr, {'x': 1, 'y': 2})
    exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})


func()

# 输出结果:
# 60
# 33
# 34

换种写法:

x = 1
y = 2


# 代码块放最后
def func():
    y = 3
    z = 4

    z = 30
    sum = x + y + z
    print(sum)


func()

猜你喜欢

转载自blog.csdn.net/qq_36201400/article/details/108140748