第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窗口中某一个按钮弹出来的. 功能 ...
随机推荐
- 浮动布局问题多,还是用inline-block吧
说说知识陈旧的问题. 目前我的前端开发知识积累最大的问题就是版本问题,也许我已经经历了很多,尝试了很多, 但是有些知识的版本已经过时了,而我还没有来得及更新它们.更悲剧的可能是有些部分我还没有意识到. ...
- Docker - 解决 Error response from daemon: driver failed programming external connectivity on endpoint tomcat9999
问题背景 执行 docker start tomcat 报以下的错误 Error response from daemon: driver failed programming external co ...
- [MIT6.006] 21. Daynamic Programming III: Parenthesization, Edit Distance, Knapsack 动态规划III:括号问题,编辑距离,背包问题
这节课主要针对字符串/序列上的问题,了解如果使用动态规划进行求解.上节课我们也讲过使用前缀和后缀的概念,他们如下所示: 接下来,我们通过三个问题来深入了解下动态规划使用前缀.后缀和子串怎么去解决括号问 ...
- 正则表达式-获取Json属性值
需求 需要获取json的字符串参数中的某个属性的值,只用json转对象后再获取层级比较多,所以使用简单的正则表达式进行获取 具体实现 public static void main(String[] ...
- nginx&http 第三章 惊群
惊群:概念就不解释了. 直接说正题:惊群问题一般出现在那些web服务器上,Linux系统有个经典的accept惊群问题,这个问题现在已经在内核曾经得以解决,具体来讲就是当有新的连接进入到accept队 ...
- linux netfilter ----iptable_filter
内核中将filter模块被组织成了一个独立的模块,每个这样独立的模块中都有个类似的init()初始化函数:首先来看一下filter模块是如何将自己的钩子函数注册到netfilter所管辖的几个hook ...
- select的限制
/*一.select实现并发服务器并发的两点限制 1.一个进能够打开的最大文件描述符限制.可以通过两种方式修改 ulimit -n :获取最大文件描述符个数 ulimit -n 2048:修改为204 ...
- linux基本操作之linux登陆
一 文本登陆方式: 输入用户名与密码:/etc/passwd文件对照(口令文件,保存基本的用户信息):/etc/shadow文件对照(影子文件,保存密码信息):启动相应的shell程序:用户得到 一个 ...
- mds的cpu占用问题分析以及解决办法
前言 mds是ceph里面处理文件接口的组件,一旦使用文件系统,不可避免的会出现一种场景就是目录很多,目录里面的文件很多,而mds是一个单进程的组件,现在虽然有了muti mds,但稳定的使用的大部分 ...
- 控制算法PID-理解分析1
以下内容是来自网络上的,本人觉得有道理,拷贝下来,由于没有找到最源头的出处,没有注明来自何方. 转载,下面说法应该更通俗易懂一家庭,每次需要开支的时候丈夫P都要拿卡去取钱.需要多少取多少,因为银行最低 ...