python笔记--exec、eval、execfile和compile

        有些时候可能会需要动态地创造Python代码,然后将其作为语句执行或作为表达式计算。简单的说,exec和eval可以执行字符串的内容。

exec(expression,global,local)

exec是一个语法声明,不是一个函数。也就是说和if,for一样。也就是说exec没有返回值。等价于exec "expression"  in  global,local

作用域:

        当global和local指明expression中变量的作用域,如果两者都不存在,则使用调用exec函数的当前作用域;如果global和local都存在,则以local为准。

a = 1

>>>exec "print a+3"

4

>>>exec "print a+3" in {'a':3}

6

>>>exec "print a+3" in {'a':3},{'a':4}

7

eval(expression,global,local)

eval是python内置的函数,它与exec相比,能够返回结果噢!

作用域:

同exec

eval和exec的比较:

①eval有返回值,exec没有返回值

②eval只能用来求值表达式、获得函数对象,并返回计算结果;而exec不仅仅用来求值表达式,还能进行赋值,引用global变量等

>>>eval('a = 1')

File "", line 1

a = 1

   ^

SyntaxError: invalid syntax

注意:eval函数只负责对你的输入进行输出,True还是False又或者是什么东西。但它本身是没有影响当前代码环境的能力的。如果我们想用来进行赋值,那么应该使用exec()函数。

>>>exec('a=1;print a')

1

execfile(filename,global,local)

相当于python filename

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

参数source:字符串或者AST(Abstract Syntax Trees)对象。

参数 filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。

参数model:指定编译代码的种类。可以指定为 ‘exec’,’eval’,’single’。如果是exec类型,表示这是一个序列语句,可以进行运行;如果是eval类型,表示这是一个单一的表达式语句,可以用来计算相应的值出来;如果是single类型,表示这是一个单一语句,采用交互模式执行,在这种情况下,如果是一个表达式,一般会输出结果,而不是打印为None输出。

这里主要来看看single模式,因为另两中跟上面介绍的一样

>>>eval_code='1+2'

>>>cmp_code2=compile(eval_code,'','single')

>>>exec(cmp_code2)

3

>>>cmp_code2=compile(eval_code,'','exec') 

>>>exec(cmp_code2)

没有输出,eval也是一样

作用

减少代码被重复的编译:

        当一个字符串被exec,eval(),或execfile()执行时,解释器会先将它们编译为字节代码,然后再执行.这个过程比较耗时,所以如果需要对某段代码执行很多次时,最好还是对该代码先进行预编译,这样就不需要每次都编译一遍代码,可以有效提高程序的执行效率。

你可能感兴趣的:(python笔记--exec、eval、execfile和compile)