码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-08-12 18:53:08      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:nbsp   code   变量   文件读取   操作   一个   指定表   没有   简单   

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?mpa?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()函数

标签:nbsp   code   变量   文件读取   操作   一个   指定表   没有   简单   

原文地址:https://www.cnblogs.com/foremostxl/p/9463627.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!