第6.5节 exec函数:一个自说自话的强大Python动态编译器
在Python动态执行的函数中,exec是用于执行一个字符串内包含的Python源码或其编译后对应的字节码。
一、 语法
1. exec(Code, globals=None, locals=None)
2. 参数说明
本函数的参数与eval的参数及含义完全相同,不过第一个参数eval函数要求是表达式字符串或其编译的字节码,exec要求是Python语句或语句块或其编译的代码,如果是编译的代码,要求是‘exec’模式编译,如果表达式,则也不会报错,但达不到eval返回计算值的效果;
3. 返回值
如果代码能正常执行该函数返回值是 None,因此对应代码不能用return和 yield返回数据。
二、 exec与语法与eval对比
1. exec与语法与eval 类似,都属于动态执行,有相同的参数,都可以直接处理字符串,也可以处理compile处理后的字节码;
2. 不同的地方包括3个方面:
1) eval()只能计算单个表达式的值,而exec()函数可以动态运行代码段;
2) eval()函数可以有返回值,而exec()函数返回值永远为None
3) 如果是参数中传递的是compile 的字节码,则compile调用时的mode参数取值不同。
三、 举例:
1. 用三引号定义了一个包含Python代码的字符串
s='''
person=['张三','李四']
for p in person:
print('name=',p)
while(True):
s=input("I will exit,are you ready(y/n)?")
if s=='Y': break;
if s=='y': break;
'''
2. 带一个匿名名字空间作为全局名字空间执行该语句:exec(s,{}),执行后输入‘y’退出,s的值保持不变
3. 不带全局名字空间和局部名字空间执行该语句:exec(s),执行后输入‘y’退出,s的值变成‘y’,说明该代码段在当前执行exec调用的名字空间中执行,并访问了相关变量,导致变量s的值被篡改
上述案例全部截屏:
本节老猿详细介绍了动态执行的exec函数及各个参数,并结合例子介绍了相关方法的使用。从上述介绍以及案例可以说,exec函数就是一个完整版本的Python编译器,它可以将一个完整的Python源文件完整的执行。这也就是老猿说exec是自说自话。老猿其实很想做一个测试,就是用一个动态执行的Python代码读取自身的源代码再去执行,是否形成递归调用呢?不知道是什么效果,有兴趣的同学可以自己试。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!