python笔记--exec、eval、execfile和com
有些时候可能会需要动态地创造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()执行时,解释器会先将它们编译为字节代码,然后再执行.这个过程比较耗时,所以如果需要对某段代码执行很多次时,最好还是对该代码先进行预编译,这样就不需要每次都编译一遍代码,可以有效提高程序的执行效率。