第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的世界。
欢迎大家批评指正,谢谢大家关注!

posted on 2019-06-05 18:54  老猿Python  阅读(350)  评论(0编辑  收藏  举报