文档章节

python 中 exec、 eval、 execfile 和 compile 用法

J
 JennerLuo
发布于 2017/08/31 10:44
字数 853
阅读 10
收藏 0
pyt

exec语句用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。下面是一个简单的例子。

>>> exec 'print "Hello World"'
Hello World

eval语句用来计算存储在字符串中的有效Python表达式。下面是一个简单的例子。

>>> eval_r('2*3')
6

 

eval_r(str [ globals [ locals ]])函数将字符串str当成有效python表达式来求值,并返回计算结果。

同样地, exec语句将字符串str当成有效Python代码来执行.提供给exec的代码的名称空间和exec语句的名称空间相同.

最后,execfile(filename [,globals [,locals ]])函数可以用来执行一个文件,看下面的例子:

>>> eval_r('3+4')
7
>>> exec 'a=100' 
>>> a 
100 
>>> execfile(r'd:\code\ex\test.py')
hello world!
>>>

默认的,eval_r(),exec,execfile()所运行的代码都位于当前的名字空间中. eval_r(), exec 和 execfile()函数也可以接受一个或两个可选字典参数作为代码执行的全局名字空间和局部名字空间. 例如:

1 globals = {      'x': 7, 
2            'y': 10, 
3           'birds': ['Parrot', 'Swallow', 'Albatross'] 
4          } 
5 locals = { } 
7 # 将上边的字典作为全局和局部名称空间 
8 a = eval("3*x + 4*y", globals, locals) 
9 exec "for b in birds: print b" in globals, locals   # 注意这里的语法 
10 execfile("foo.py", globals, locals)

如果你省略了一个或者两个名称空间参数,那么当前的全局和局部名称空间就被使用.如果一个函数体内嵌嵌套函数或lambda匿名函数时,同时又在函数主体中使用exec或execfile()函数时, 由于牵到嵌套作用域,会引发一个SyntaxError异常.(此段原文:If you omit one or both namespaces, the current values of the global and local namespaces are used. Also,due to issues related to nested scopes, the use of exec or execfile() inside a function body may result in a SyntaxError exception if that function also contains nested function definitions or uses the lambda operator.)

在Python2.4中俺未发现可以引起异常
注意例子中exec语句的用法和eval_r(), execfile()是不一样的. exec是一个语句(就象print或while), 而eval_r()和execfile()则是内建函数.
exec(str) 这种形式也被接受,但是它没有返回值。
当一个字符串被exec,eval_r(),或execfile()执行时,解释器会先将它们编译为字节代码,然后再执行.这个过程比较耗时,所以如果需要对某段代码执行很多次时,最好还是对该代码先进行预编译,这样就不需要每次都编译一遍代码,可以有效提高程序的执行效率。

compile(str ,filename ,kind )函数将一个字符串编译为字节代码, str是将要被编译的字符串, filename是定义该字符串变量的文件,kind参数指定了代码被编译的类型-- 'single'指单个语句, 'exec'指多个语句, 'eval'指一个表达式. cmpile()函数返回一个代码对象,该对象当然也可以被传递给eval_r()函数和exec语句来执行,例如:

>>> str = 'for i in range(0, 10): print i'
>>> c = compile(str,'','exec')      # 编译为字节代码对象 
>>> exec c        # 执行
0
1
2
3
4
5
6
7
8
9
>>>
 
>>> str2 = '3*6 + 4*8'
>>> c2 = compile(str2,'','eval')        # 编译为表达式 
>>> result = eval_r(c2)                    # 执行
>>> result
50
>>>

 

 

本文转载自:http://blog.sina.com.cn/s/blog_76e94d210100w1bl.html

共有 人打赏支持
J
粉丝 5
博文 84
码字总数 41408
作品 0
深圳
程序员
python核心编程--第十四章

14.1 可调用对象 许多的python对象都是我们所说的可调用的,即是任何能通过函数操作符“()”来调用的对象。要调用可调用对象,函数操作符得紧跟在可调用对象之后。python有4种可调用对象:...

fzyz_sb
2013/06/19
0
4
Python核心编程:第十四章

14.1 可调用的对象 许多python对象都是可调用的,即能通过函数操作符“()”来调用对象。 Python有四种可调用的对象:函数,方法,类,以及一些类的实例 14.1.4类的实例 python给类提供了名...

finndai
2016/11/21
41
0
python核心编程笔记chapter 14

可调用对象: 函数:内建函数、用户定义的函数、lambda表达式。 方法:内建方法:只有内建类型有内建方法。 用户自定义的方法: 类:调用类创建实例 类的实例: 可执行的对象声明和内建函数:...

MRFung
2016/01/06
10
0
测试你的Python 水平----7

1、问:Cpython,Jython和IronPython有什么不同? 答:三者都是python编译器的实现方式;Cpython是python的标准实现;Jypthon是Python的Java实现;IronPython是Python的.net实现。 2、 问:e...

jastme
2015/09/16
246
0
表达式与语句 局部变量与全局变量 exec与eval

Python有时需要动态的创造Python代码,然后将其作为语句执行 或 作为表达式计算。 exec用于执行存储在字符串中的Python代码。 1、 语句与表达式的区别:表达式是 某事,语句是 做某事(即告诉...

duhaizhang
2012/07/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

RabbitMQ在CentOS环境安装

1.废话不多说准备一台虚拟机,系统为centos,我这里使用的系统版本如下图所示:

凌晨一点
45分钟前
0
0
线程池相关

在java.util.concurrent包下,提供了一系列与线程池相关的类。 使用线程池的好处 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗; 提高响应速度。当任务到达时,任务...

edwardGe
47分钟前
0
0
学习大数据这三个关键技术是一定要掌握!

大数据时代全面来临,大数据、人工智能等技术引领科技创新潮流,获得国家政策大力支持,前景广阔。学习大数据技术的人自然是络绎不绝, 学习大数据虽然是一个趋势,但也要注意大数据培训课程...

董黎明
今天
0
0
jetbrains 上传代码到github

设置中找github 获取token 验证是否成功 测试git 生成key,一路回车即可 ssh-keygen -t rsa -C “youremail@example.com” 打开pub复制key,需要再次输入一次密码 验证是否成功,输入yes即可...

阿豪boy
今天
0
0
分布式服务框架(拾遗)

前言 现在的大部分工程都已经是基于分布式架构来处理。所以这里对分布式框架做一个简单的总结 常用的RPC框架 RPC框架原理 RPC(Remote Procedure Call,远程过程调用)一般用来实现部署在不同...

kukudeku
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部