python种的builtin函数详解-第三篇
exec_stmt ::= "exec" or_expr ["in" expression ["," expression]]
eval(expression[, globals[, locals]])
execfile(filename[, globals[, locals]])
Help on built-in function execfile in module __builtin__:
execfile(...)
execfile(filename[, globals[, locals]])
Read and execute a Python script from a file.
The globals and locals are dictionaries, defaulting to the current
这几个函数都非常类似,第一个 [exec] () 在python2 中还是一个语句,在python3中 exec 和 print 都被实现成为了 buildin 函数。
这3个 “函数” 的作用都是去执行一段 python 代码字符串, 和js中的eval有类似的作用,其中 exec 表达式的参数 可以是一个code对象,一个打开的文件,一个unicode字符串,其中code对象可以通过 compile 这个内置函数生成。
eval 函数的参数只能是一个表达式,不能是语句,如果没有仔细看文档的话,非常有可能写出如下的代码:
eval(" print 'test' ")
这个时候你就会得到一个无情的 SyntaxError , 而 exec 与 execfile 即可以执行语句,也可以执行表达式。
execfile的第一个参数是一个文件名字符串,它会把相应的文件载入内存,然后像 exec 语句一样执行, 所以这里我拿exec来做例子, 其余的2个参数都是关于执行的语句与表达式的环境变量,loclas是本地变量作用域,globals是全局作用域, 需要说明的是,当没有提供2个参数的时候,代码块执行的上下文就是语句和表达式执行的上下文,如果只提供了globals,那么, locals就是globals,关于为什么globals在locals前面的问题,就非常显而易见了,见下面的代码:
>>> exec "print test(name)" in {'test': lambda name:name, 'name' : 'younger'}, {'test': lambda name:name, 'name' : 'test'}
test
>>>exec "print test(name)" in {'test': lambda name:name, 'name' : 'younger'}
younger
我在第一次研究这3个方法的时候,陷入了一个误区,这个误区就是关于变量作用域的,见如下的代码:
def test(name):
print name
>>> exec "test(name)" in {'name' : 'name'}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'test' is not defined
是的,我在外部作用域定义了一个方法,当我在exec中执行这个方法的时候,由于需要一个参数,所以在globals里面写了name属性, 结果test自然就找不到了,一开始一直以为只有变量才会在globals中和locals中去寻找,忘记了函数也是第一类值,所以上面的写法是完全错误的.
其次还有 __builtins__ 这个字典会被自动注入到exec 的globals里面,前提是在语句中提供globals, 可以是空的,也可以是带参数的。
exec "print globals()" in {'s':'s'}
exec "print locals()" in {}
上面的2个语句执行结果完全一样.
关于globals和locals的副作用,在执行的语句是付值语句或者是会对变量产生影响的语句的时候,就会影响到你的locals和globals变量,当你期望从globals或者locals中得到有用信息的时候,就要小心这个副作用了
a = {'a' : 1}
b = {}
exec "a = a + 1" in a, b
print a['a']
print b['b']
>>> 1
>>>2
结果显而易见,如果你执行 print a ,的话,内置的builtin会全部输出,包括copyright信息在内。
关于那些显而易见的好用方法,暂时没有挖掘出有价值的使用技巧,所以就不多加叙述了,既然显而易见,那么肯定很好用就对了.
所以从现在开始,尽量去说一些带坑的方法,包括使用技巧和部分原理性的东西,希望能把自己的知识点梳理完整.
python种的builtin函数详解-第三篇的更多相关文章
- python中的builtin函数详解-第二篇
classmethod(function) 这里不过多说明这个builtin方法的具体用法,python的文档和help函数已经给了这个方法充足的使用说明,所以我这里要说的时关于 classmetho ...
- python基础-内置函数详解
一.内置函数(python3.x) 内置参数详解官方文档: https://docs.python.org/3/library/functions.html?highlight=built#ascii ...
- Python中的getattr()函数详解
最近看Dive into python第四章自省中提到getattr()函数,作为一个内建函数平时自己没怎么用过所以也不太理解这个函数的一些用法 看了下函数本身的doc getattr(object, ...
- python中的buildin函数详解(第一篇)
这会是很长的一个帖子,因为我打算从python最基础的东西开始,尝试去完全的掌握它,buildin中有一些常用的函数比如 abs, open, setattr, getattr, 大家都很了解他们的用 ...
- python中的 zip函数详解
python中zip()函数用法举例 定义:zip([iterable, ...]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple ...
- python 部分内置函数详解
简介 eval与exec eval和exec都是python内置的可以执行python代码的函数,但它们之间有所区别. eval(expression[, globals[, locals]]) ex ...
- 75.Python中ORM聚合函数详解:Sum
Sum:某个字段的总和. 1. 求图书的销售总额,示例代码如下: from django.http import HttpResponse from django.db import connecti ...
- 72.Python中ORM聚合函数详解:Avg,aggregate,annotate
聚合函数: 如果你用原生SQL语句,则可以使用聚合函数提取数据.比如提取某个商品销售的数量,那么就可以使用Count,如果想要知道销售的平均价格,那么就可以使用Avg. 聚合函数是通过aggregat ...
- python常用内置函数详解
1.abs(x) 返回一个数字的绝对值.参数可以是整数或浮点数.如果参数是复数,则返回它的大小 n = abs(-12.5) print(n) # 12.5 2.all(iterable) 如果所有的 ...
随机推荐
- C# 匿名方法 委托 Action委托 Delegate委托
原文地址:https://msdn.microsoft.com/zh-cn/library/bb882516.aspx 匿名函数是一个“内联”语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿 ...
- 阿里巴巴算法工程师四面(三轮技术+hr面)详细面经
阿里面试总结: 一遍一遍地刷阿里网站,今天发现“面试中”变成“待跟进offer”了,写个面经攒人品,希望offer通知邮件早点来吧. 我当时投简历时投了C/C++工程师,其实也没经过啥考虑,因为我一开 ...
- javaweb开发过程中的地址写法
凡是要表示web资源的地址,比如浏览器地址栏中,都是 /凡是要表示硬盘地址, 都是 \ public class ServletDemo1 extends HttpServlet { //实际开发过 ...
- redis 集群
http://www.linuxidc.com/Linux/2015-08/121845.htm Redis3.0版本之后支持Cluster,具体介绍redis集群我就不多说,了解请看redis中文简 ...
- 2016最新cocoapods版本更新,以及多个版本的问题
先删除之前的pod 在终端中执行下面命令. 删除目录下的podrm -rf /usr/local/bin/pod 执行gem list | grep cocoapods 查看所有与cocoapods相 ...
- hnsd11348tree(并查集)
Problem description A graph consists of a set of vertices and edges between pairs of vertices. Two v ...
- hdu 1882 Strange Billboard(位运算+枚举)
http://acm.hdu.edu.cn/showproblem.php?pid=1882 感觉非常不错的一道题. 给一个n*m(1<=n,m<=16)的矩阵,每一个格子都有黑白两面,当 ...
- QT 内存泄露 检测
一:问题出现 最近几天在做一个QT程序,IPX的检测控制程序.需要全天候运行.自己做完了,然后就运行.使用 top|grep TP2 来动态检测程序的CPU,内存占用律.不幸的是,一晚 ...
- migrate from weblogic to tomcat: directory mapping--reference
Question: I am trying to migrate from weblogic to tomcat. in weblogic I have <virtual-directory-m ...
- html+css+js实现复选框全选与反选
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...