python内置函数 eval()exec()以及complie()函数

Posted foremost

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python内置函数 eval()exec()以及complie()函数相关的知识,希望对你有一定的参考价值。

1、eval函数

eval() 函数用来执行一个字符串表达式,并返回表达式的值。

eval(expression[, globals[, locals]])

参数

  • expression -- 表达式。
  • globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
  • locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

返回值

返回表达式计算结果。

计算指定表达式的值。也就是说它要执行的python代码只能是单个表达式(注意eval不支持任何形式的赋值操作),而不能是复杂的代码逻辑。

x = 10
def func():
    y = 20   #局部变量y
    a = eval("x+y")
    print("a:",a)      #x没有就调用全局变量
    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)   #对于变量d,因为print()函数不是一个计算表达式,因此没有返回值
func()

运行结果:

a: 30
b: 3
c: 4
10 20
d: None

 

2、exec()

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

exec(object[, globals[, locals]])

参数

  • object:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象。如果object是一个字符串,该字符串会先被解析为一组Python语句,然后在执行(除非发生语法错误)。如果object是一个code对象,那么它只是被简单的执行。
  • globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。
  • locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。

返回值

exec 返回值永远为 None。

 

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

eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段。

eval()函数可以有返回值,而exec()函数返回值永远为None。


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

example2:

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

3、complie()函数

compile() 函数将一个字符串编译为字节代码。

compile(source, filename, mode[, flags[, dont_inherit]])


参数

  • source -- 字符串或者AST(Abstract Syntax Trees)对象。。
  • filename -- 代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。
  • mode -- 指定编译代码的种类。可以指定为 exec, eval, single。
  • flags -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。。
  • flags和dont_inherit是用来控制编译源码时的标志

返回值

返回表达式执行结果

 

>>> str = "3 * 4 + 5"
>>> a = compile(str,\'\',\'eval\')
>>> eval(a)
17

compile  美 /kəm\'paɪl/vt. 编译;编制;编辑;[图情] 汇编

s = """              #一大段代码
for x in range(10):
    print(x, end=\'\')  
print()
"""
code_exec = compile(s, \'<string>\', \'exec\')   #必须要指定mode,指定错了和不指定就会报错。
code_eval = compile(\'10 + 20\', \'<string>\', \'eval\')   #单个表达式
code_single = compile(\'name = input("Input Your Name: ")\', \'<string>\', \'single\')   #交互式

a = exec(code_exec)   #使用的exec,因此没有返回值,但字符串里面的print执行
b = eval(code_eval)  

c = exec(code_single) # 交互
d = eval(code_single)

print(\'a: \', a)
print(\'b: \', b)
print(\'c: \', c)
print(\'name: \', name)
print(\'d: \', d)
print(\'name; \', name)

运行结果:

 

 

 

以上是关于python内置函数 eval()exec()以及complie()函数的主要内容,如果未能解决你的问题,请参考以下文章

Python之内置函数

Python eval 与 exec 函数区别

python内置函数1

python中的exec和eval

python——内置函数匿名函数

Python有用的内置函数divmod,id,sorted,enumerate,input,oct,eval,exec,isinstance,ord,chr,filter,vars,zip