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