第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的世界。
欢迎大家批评指正,谢谢大家关注!
第6.5节 exec函数:一个自说自话的强大Python动态编译器的更多相关文章
- QT创建窗口程序、消息循环和WinMain函数(为主线程建立了一个QEventLoop,并执行exec函数)
使用QT也有一段时间了,有的时候需要跟踪代码到QT的源码中去查找问题.在这里我将记录一下我跟踪QT源码学习到的一些知识. 我的开发环境是VC6.0+QT4.3.3.QT已经不为VC6.0提供addin ...
- 二十五、Linux 进程与信号---exec函数
25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...
- 第6.3节 Python动态执行之动态编译的compile函数
Python支持动态代码主要三个函数,分别是compile.eval和exec.本节介绍compile函数的语法和相关使用.compile函数用来编译一段字符串的源码,将其编译为字节码或者AST(抽像 ...
- Linux下多进程编程之exec函数语法及使用实例
exec函数族 1)exec函数族说明 fork()函数用于创建一个子进程,该子进程几乎复制了父进程的全部内容,但是,这个新创建的进程如何执行呢?exec函数族就提供了一个在进程中启动另一个程序执行的 ...
- JS中exec函数与match函数的区别与联系
总结: 正则规则的声明,两种方法: exec是RegExp类的匹配方法 match是字符串类的匹配方法 var reg = /aaa/g; var reg = new RegExp("aaa ...
- 进程控制之exec函数
用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行.因为调用exec并不创 ...
- linux exec函数家族
1.exec家族一共有六个函数,分别是: (1)int execl(const char *path, const char *arg, ......); (2)int execle(const ch ...
- fork和exec函数
#include<unistd.h> pid_t fork(void); 返回:在子进程中为0,在父进程中为子进程IO,若出错则为- fork最困难之处在于调用它一次,它却返回两次.它在调 ...
- 让QMainWindow也表现出QDialog的exec函数的特征
前几天在做毕业设计项目的时候,使用的PyQt4,想实现这么样一个功能: 场景描述:主窗口a(QMainWindow类型)和主窗口b(QMainWindow),b是通过a窗口中某一个按钮弹出来的. 功能 ...
随机推荐
- ZJU-Summer Camp Problem
Day 1 NTT #include <bits/stdc++.h> #define inf 0x3f3f3f3f #define m_k make_pair #define mod 99 ...
- Java程序员成长之路
北哥在前文总结了程序员的核心能力,但在专业能力维度,只是做了大概的阐述,并没有详细展开.从今天开始,我会把我作为程序员成长过程中,学习的知识总结成系列文章陆续发出来,供大家学习参考. 本文是第一篇,关 ...
- 【kata Daily 190905】What's a Perfect Power anyway?(完美幂)
原题: A perfect power is a classification of positive integers: In mathematics, a perfect power is a p ...
- 说说 C# 9 新特性的实际运用
你一定会好奇:"老周,你去哪开飞机了?这么久没写博客了." 老周:"我买不起飞机,开了个铁矿,挖了一年半的石头.谁知铁矿垮了,压死了几条蜈蚣,什么也没挖着." ...
- java开发就业信息管理系统
本文实例为大家分享了java就业信息管理平台开发案例,供大家参考,具体内容如下 可查询公司信息,学生信息,班级信息,针对学生就业与否信息的统计,老师和管理员登录后的权限不同等就业信息管理平台想要实现的 ...
- 数字取证autopsy——性能优化(二)
介绍: 在开始使用autopsy之前,我们先对autopsy进行性能优化.如果还没有安装autopsy,请点击连接https://github.com/sleuthkit/autopsy/releas ...
- 2012年游戏软件开发独立本科段01B0815自考科目
01B0815自考科目 课程代码[学分] 课程名称 03708[02] 中国近现代史纲要 03709[04] 马克主义基本原理概论 03684[10] 综合英语(四) 01042[05] 应用数学 0 ...
- [MIT6.006] 16. Dijkstra
先回顾下上节课的内容: 下面来看一个定理:对于所有的点来说,放松操作总是满足 d[v] ≥ δ(s, v).即点s到点v的最短路径总是小于或等于当前点d的路径权重.证明如下: 在正是进入复杂的图前,先 ...
- 年轻人不讲武德来白piao我这个老同志
朋友们好啊,我是码农小胖哥. 今天有个同学问我在吗,我说什么事? 给我发个截图,我一看!噢,原来是帮忙搞个定时任务,还是动态的. 他说了两种选择,一种是用DelayQueue,一种是用消息队列. 他说 ...
- 这 12 款 IDEA 插件你用过几款?
搞 Java开发用什么软件,当然是神器idea了,那么,idea的插件对于你来说就是必不可少的了,不仅可以提高自己的编码效率,还可以减轻工作时的枯燥烦闷.接下来就来说说,我平时敲代码用的什么插件吧. ...