在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动态编译器的更多相关文章

  1. QT创建窗口程序、消息循环和WinMain函数(为主线程建立了一个QEventLoop,并执行exec函数)

    使用QT也有一段时间了,有的时候需要跟踪代码到QT的源码中去查找问题.在这里我将记录一下我跟踪QT源码学习到的一些知识. 我的开发环境是VC6.0+QT4.3.3.QT已经不为VC6.0提供addin ...

  2. 二十五、Linux 进程与信号---exec函数

    25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...

  3. 第6.3节 Python动态执行之动态编译的compile函数

    Python支持动态代码主要三个函数,分别是compile.eval和exec.本节介绍compile函数的语法和相关使用.compile函数用来编译一段字符串的源码,将其编译为字节码或者AST(抽像 ...

  4. Linux下多进程编程之exec函数语法及使用实例

    exec函数族 1)exec函数族说明 fork()函数用于创建一个子进程,该子进程几乎复制了父进程的全部内容,但是,这个新创建的进程如何执行呢?exec函数族就提供了一个在进程中启动另一个程序执行的 ...

  5. JS中exec函数与match函数的区别与联系

    总结: 正则规则的声明,两种方法: exec是RegExp类的匹配方法 match是字符串类的匹配方法 var reg = /aaa/g; var reg = new RegExp("aaa ...

  6. 进程控制之exec函数

    用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行.因为调用exec并不创 ...

  7. linux exec函数家族

    1.exec家族一共有六个函数,分别是: (1)int execl(const char *path, const char *arg, ......); (2)int execle(const ch ...

  8. fork和exec函数

    #include<unistd.h> pid_t fork(void); 返回:在子进程中为0,在父进程中为子进程IO,若出错则为- fork最困难之处在于调用它一次,它却返回两次.它在调 ...

  9. 让QMainWindow也表现出QDialog的exec函数的特征

    前几天在做毕业设计项目的时候,使用的PyQt4,想实现这么样一个功能: 场景描述:主窗口a(QMainWindow类型)和主窗口b(QMainWindow),b是通过a窗口中某一个按钮弹出来的. 功能 ...

随机推荐

  1. linux-gcc简要知识点 **

    目录 交叉编译 简要知识点 ** 一些概念 GCC编译器 GCC简要使用 GCC编译过程 ** 常用的编译选项 编译多个文件 制作.使用动态库 制作.使用静态库 很有用的选项 参考 交叉编译 使用不同 ...

  2. leetcode115:search -insert-position

    题目描述 给出一个有序的数组和一个目标值,如果数组中存在该目标值,则返回该目标值的下标.如果数组中不存在该目标值,则返回如果将该目标值插入这个数组应该插入的位置的下标 假设数组中没有重复项. 下面给出 ...

  3. JSP系列记录

    JSP就是可以实现在html中写Java代码 例: hello.jsp <%@page contentType="text/html; charset=UTF-8" page ...

  4. JSON&AJAX

    JSON 定义:JSON(JavaScript Object Notation, JS 对象简谱)是一种轻量级的数据交换格式.它基于 ECMAScript(欧洲计算机协会制定的 JS 规范)的一个子集 ...

  5. Python--安装 PyQt5, pyqt5-tools

    # 使用豆瓣镜像源 anaconda prompt界面里输入: pip install pyqt5-tools -i https://pypi.douban.com/simple/

  6. Flink SQL Client综合实战

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. GSO和TSO

    http://www.cnhalo.net/2016/09/13/linux-tcp-gso-tso/ TSO(TCP Segmentation Offload): 是一种利用网卡来对大数据包进行自动 ...

  8. 极客mysql06

    两阶段锁:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放, 而是要等到事务结束时才释放. 建议:如果你的事务中需要锁多个行,要把最可能造成锁冲突.最可能影响并发度的锁 ...

  9. oracle的迁移工作

    1.创建新数据库用户 1).创建用户和分配权限 sqlplus / as sysdba create user ENFRC_TEST_GZ_TMP identified by ENFRC_TEST_G ...

  10. 关于C# Span的一些实践

    Span这个东西出来很久了,居然因为5.0又火起来了.   相关知识 在大多数情况下,C#开发时,我们只使用托管内存.而实际上,C#为我们提供了三种类型的内存: 堆栈内存 - 最快速的内存,能够做到极 ...