compile()函数 eval()函数 exec()函数
基础概念
标识符 是变量、函数、类、模块和其他对象的名称,(包括关键字,预定义标识符,用户自定义标识符)
python表达式 是值、变量和操作符(或叫运算符)的组合。单独的一个值是一个表达式,单独的变量也是一个表达式。
运算符和操作数一起构成表达式,操作数可以使用标识符表示,
如a=3;b=2;c=a*b,
表达式是python程序最常见的代码(Python代码由表达式和语句组成,并由Python解释器负责执行)。
一、compile()函数
1、作用
compile() 函数将指定的源作为代码对象返回,并准备执行。
将source编译为code对象或AST对象。
code对象能够通过exec()函数来执行或者通过eval()函数进行计算求值。
2、语法
compile(source, filename, mode[, flags[, dont_inherit]])
- source – 字符串或者AST(Abstract Syntax Trees)对象。。
- filename – 代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。
- mode – 指定编译代码的种类。可以指定为 exec, eval, single。
- flags – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。。
- flags和dont_inherit是用来控制编译源码时的标志
co = compile("for i in range(10): print(i, end=' ')", '', 'exec')
exec(co)
#0 1 2 3 4 5 6 7 8 9
二、eval()函数
1、描述
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
计算指定表达式的值。也就是说它要执行的Python代码只能是单个运算表达式(注意eval不支持任意形式的赋值操作),而不能是复杂的代码逻辑,这一点和lambda表达式比较相似。
2、语法
eval(expression[, globals[, locals]])
- expression – 必选参数,可以是字符串,也可以是一个任意的code对象实例(可以通过compile函数创建)。如果它是一个字符串,它会被当作一个(使用globals和locals参数作为全局和本地命名空间的)Python表达式进行分析和解释。
- globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
- locals – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
3、返回值
返回表达式计算结果。
指定了globals,所以在expression部分的作用域就是globals指定的字典范围内。所以此时外面的a=10被屏蔽,取用字典中的值。
当有globals和locals时作用的范围域是在globals和locals中,所以a=10,b=20,c=30不会被应用。a和c的值分别去字典g和字典t中的值,当globals和locals中都有参数b时取locals中的值。所以a=6,b=100,c=10
三、exec函数
1、描述
动态执行Python代码。也就是说exec可以执行复杂的Python代码,而不像eval函数那么样只能计算一个表达式的值。
2、定义
exec(object[, globals[, locals]])
- object:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象。如果object是一个字符串,该字符串会先被解析为一组Python语句,然后在执行(除非发生语法错误)。如果object是一个code对象,那么它只是被简单的执行。
- globals:可选参数,同eval函数
- locals:可选参数,同eval函数
3、返回值
None
四、eval()函数与exec()函数的区别:
- eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段。
- eval()函数可以有返回值,而exec()函数返回值永远为None。
五、补充
comiple()函数、globals()函数、locals()函数的返回结果可以当作eval()函数与exec()函数的参数使用。
另外,我们可以通过判断globals()函数的返回值中是否包含某个key来判断,某个全局变量是否已经存在(被定义)。
globals() 函数会以字典类型返回当前位置的全部全局变量。