字符串类型代码的执行函数有三个,都是Python的内置函数。
下面来一一介绍这三个函数。
执行一个字符串表达式,并返回表达式的值
eval(expression[, globals[, locals]])
参数
例子一:因为此处没有指定globals和locals,所以直接执行expression部分的内容。
>>> a = 10 >>> eval("a ** 3") 1000
例子二:globals参数示例。
>>> a = 10 >>> g = {'a': 5} >>> eval("a + 1", g) 6
因为现在指定了globals,所以在expression部分的作用域就是globals指定的字典范围内。所以此时外面的a=10被屏蔽,取用字典中的值。
例子三:locals参数示例
>>> a = 10 >>> b = 15 >>> c = 20 >>> g = {"a": 6, "b": 8} >>> t = {"b": 1000, "c": 10} >>> eval("a + b + c", g, t) 1016
上面提到了,当有globals和locals时作用的范围域是在globals和locals中,所以a=1,b=20,c=30不会被应用。a和c的值分别去字典g和字典t中的值,当globals和locals中都有参数b时取locals中的值。所以a=6,b=100,c=10。
在Python中,exec()是一个十分有趣且实用的内置函数,不同于eval()函数只能执行计算数学表达式的结果的功能,exec()能够动态地执行复杂的Python代码,能够十分强大。参数如下:
下面来看一些例子。
例子一:执行简单的代码
>>> a = 12 >>> b = 30 >>> exec("ans = a * b") >>> ans 360
例子二:func为字符串,它是一个递归地计算整数阶乘的函数。因为exec()仅支持string和code object参数,所以我们要将该递归函数转化成一个字符串,当然,格式还是要Python代码的格式来,注意换行和缩进。刚才例子的输出结果为:
>>> func = "def fact(n):\n\treturn 1 if n == 1 else n * fact(n - 1)
>>> exec(func)
>>> a = fact(5)
>>> a
120
例子三:exec()的参数和上面的eval()一模一样。
>>> x = 15 >>> expr = "z = 30\nsum = x + y + z\nprint(sum)" >>> y = 20 >>> exec(expr) 65 >>> exec(expr, {'x': 1, 'y': 2}) 33 >>> exec(expr, {'x': 1, 'y': 2}, {'y': 100, 'z': 4}) 131
例子四:说到这里,可能有些疑问了?事实上,这些代码不是直接能够在Python中执行吗,为何还要多此一举?在实际项目中,我们有些时候会将Python代码写入一些文件中,举个例子,如以下的eg.txt,它储存了我们想要的Python代码,如下:
def fact(n): if n == 1: return 1 else: return n * fact(n - 1) t = fact(6) print(t)
请再次注意,这是一个txt格式的Python代码。那么,我们如何调用它呢?答案就是exec()函数,代码如下:
with open('E://eg.txt', 'r') as f: s = f.read() exec(s)
compile()函数将一个字符串编译为字节代码或 AST 对象。代码对象可以被 exec()或 eval() 执行。以下是compile()方法的语法:
compile(source, filename, mode[, flags[, dont_inherit]])
参数如下:
编译代码时,如果语法出错会返回SyntaxError;如果代码包含一些空字节,则返回类型错误TypeError。
注意事项:当采用single或eval类型编译时,如果有多行代码,每行代码后面至少有一个换行符,否则在code模块编译时就会提示编译的源码不完整错误。在Python 3.2版本之后,允许输入Windows或Mac的换行符;当采用exec模式时,不需要在每个行后面输入换行符;在这个版本之后增加了优化参数。
例子:
>>> str = "for i in range(0,10): print(i)" >>> c = compile(str, '', 'exec') >>> exec(c) # eval 也可以 0 1 2 3 4 5 6 7 8 9 >>> str = "3 * 4 + 5" >>> a = compile(str, '', 'eval') >>> eval(a) 17