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有用的内置函数divmod,id,sorted,enumerate,input,oct,eval,exec,isinstance,ord,chr,filter,vars,zip