Python eval()、exac()


一、eval()

1. 描述

eval()执行一个字符串,返回表达式的值。


2. 语法

eval(expression[, globals[, locals]])
  • expression:表达式
  • globals:变量作用域,全局命名空间(存放全局变量),如果被提供,必须是字典。
  • locals:变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

返回值:

表达式计算结果。


3. 实例

result = eval('pow(2, 2)')
print(result)

result = eval('3*x', {'x': 7})
print(result)

输出:

4
21


二、exec()

1. 描述

exec执行存储在字符串或文件中的 Python 语句,相比eval,exec 可执行更复杂的代码。


2. 语法

exec(object[, globals[, locals]])
  • object:必选参数。如果 object 是字符串,会被解析为 Python 语句再执行,如果是代码,直接执行。
  • globals:可选参数。全局命名空间(存放全局变量),如果被提供,必须是字典。
  • locals:可选参数。局部命名空间。如果被提供,可以是任何映射对象。当和 globals 有重复,以 locals 为准。

返回值:

永远是None。


3. 实例

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()


a = 10
b = 20
c = 30
g = {'a': 6, 'b': 8}  # 定义一个字典
t = {'b': 100, 'c': 10}  # 定义一个字典
print(eval('a+b+c', g, t))  # 定义一个字典 116

输出:

60
33
34

116


三、exal()与exac()的区别、易错点

1. 区别

eval()有返回值,exec()无返回值。


2. 易错点

eval()exac()的第一个参数是字符串,字符串的内容必须是可执行代码。

s = 'hello'
print(eval(s))
print(exec(s))

输出:

NameError: name 'hello' is not defined

出错原因:字符串的内容是 hello,而 hello 不是可执行代码。

s = 'hello'
print(eval('s'))
print(exec('s'))

输出:

hello
None

字符串的内容是 'hello',是字符串,字符串是可执行代码。


使用repr()转化,但使用str()转换会报错。

s = "hello"
print(eval(repr(s)))
print(eval(str(s)))

输出:

hello

NameError: name 'hello' is not defined

出错原因:repr()返回的内容,多一个单引号。

s = 'hello'
print(repr(s))
print(str(s))

输出:

'hello'
hello


原文地址:https://www.cnblogs.com/keye/p/15682081.html