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、返回值

返回表达式计算结果。

compile示例 python python中compile函数_开发语言

指定了globals,所以在expression部分的作用域就是globals指定的字典范围内。所以此时外面的a=10被屏蔽,取用字典中的值。

compile示例 python python中compile函数_python_02


compile示例 python python中compile函数_开发语言_03

当有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() 函数会以字典类型返回当前位置的全部全局变量。