python中eval, exec, execfile,和compile

原文地址:http://blog.sina.com.cn/s/blog_7ae1b8300100xixe.html


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'c:\test.py')
              hello,world!
              >>>
默认的,eval_r(),exec,execfile()所运行的代码都位于当前的名字空间中. eval_r(), exec,和execfile()函数也可以接受一个或两个

可选字典参数作为代码执行的全局名字空间和局部名字空间. 例如:

切換行號
    1 globals = {'x': 7,
                        'y': 10,
                        'birds': ['Parrot', 'Swallow', 'Albatross']
                      }
    5 locals = { }
    6
    7 # 将上边的字典作为全局和局部名称空间
    8 a = eval_r("3*x + 4*y",globals, locals)
    9 exec "for b in birds: printb" 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 andlocal namespaces are used. Also,due to issues

related to nested scopes, the use of exec or execfile() inside afunction body may result in a SyntaxError exception

if that function also contains nested function definitions or usesthe lambda operator.)

在Python2.4中俺未发现可以引起异常 --WeiZhong
注意例子中exec语句的用法和eval_r(), execfile()是不一样的. exec是一个语句(就象print或while),而eval_r()和execfile()则是内

建函数.

exec(str) 这种形式也被接受,但是它没有返回值。 --WeiZhong
当一个字符串被exec,eval_r(),或execfile()执行时,解释器会先将它们编译为字节代码,然后再执行.这个过程比较耗时,所以如果需要

对某段代码执行很多次时,最好还是对该代码先进行预编译,这样就不需要每次都编译一遍代码,可以有效提高程序的执行效率。

compile(str ,filename ,kind )函数将一个字符串编译为字节代码, str是将要被编译的字符串,filename是定义该字符串变量的文

件,kind参数指定了代码被编译的类型-- 'single'指单个语句, 'exec'指多个语句, 'eval'指一个表达式.cmpile()函数返回一个代

码对象,该对象当然也可以被传递给eval_r()函数和exec语句来执行,例如:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值