Scalers点评:在2015年,ScalersTalk成长会完成Python小组完成了《Python核心编程》第1轮的学习。到2016年,我们开始第二轮的学习,并且将重点放在章节的习题上。Python小组是成长会内部小组,如果你想和我们一起学习Python,你需要是成长会成员,并且完成相关进群任务。
我们的节奏是行动是一周一章学到位,章节习题都会一个一个过。通过到位地执行,达到实质性的提升。
往期日志:
本周学习情况
本周(20160425-20160501)学习第十四章,章节内容为《执行环境》。本周复盘主持人为诗耀。
本章主要内容
本章主要介绍了可调用对象和代码对象,以及支持调用执行功能的一些内建函数,提供了执行其他python程序或非python程序的方法,同时介绍了一些终止执行的方法,最后列举了一些与执行环境相关的模块。
本章主要知识点
14.1可调用对象
即能通过操作符“”来调用的对象,如:用foo
来调用函数foo。
可调用对象可以作为参数,通过函数式编程接口来进行调用,如:apply
,filter
,map
,reduce
python有四种可调用对象:函数、方法、类以及一些类的实例。
函数
内建函数(BIF)
内建函数是用 c语言编写的,编译过后放入 python 解释器,作为第一(内建)名字空间的一部分加载进系统。这些函数在
_bulitin_
模块里,并作为__builtins__
模块导入到解释器中。内建函数属性:
bif.__doc__
:文档字符串(或None)bif.__name__
:字符串类型的文档名字bif.__self__
:设置为 None(保留给 built-in方法)bif.__module__
:存放 bif 定义的模块名字(或 None)用户定义的函数(UDF)
定义在模块的最高级,作为全局名字空间的一部分装载到系统中。
用def语句创建 def XX:
lambda表达式函数
lambda表达式不是def语句创建的,而是用lambda关键字创建的匿名函数;
没有命名,但是享有和用户定义函数相同的属性,其中
__name__
或fun_name
属性定为‘lambda’使用方法:
作为参数,通过函数式编程接口来调用
将其引用赋值给一个变量,再直接调用或通过函数调用
方法
方法实际上就是定义在类内部的函数
内建方法(BIM)
内建方法和内建函数两者属于相同的类型,有相同的属性,不同之处在于BIM的
__self__
属性指向python对象,而BIF指向None用户自定义方法(UDM)UDM包含在类定义之中,都属于实例方法,只是拥有标准函数的包装,仅有定义他们的类可以使用。如果没有在子类定义中被覆盖掉,也可以通过子类实例来调用他们。
类
类的调用实际上就是实例化的过程,调用类就创建了一个实例。
类的实例
一般情况下,大部分实例是不可调用的(通过函数操作符“()”),但如果在类定义中覆盖了__call__
方法的话,那么该类的实例就能通过函数操作符调用了。
14.2 代码对象
代码对象的定义:Python代码编译而成的字节码
代码对象的执行:可以作为函数或者方法的一部分来执行,也可以用exec语句或者
eval
来执行。代码对象、函数对象、方法之间的关系:函数对象仅是代码对象的包装,方法则是对函数对象的包装。
14.3 可执行的对象声明和内建函数
callable(obj)
判断obj是否可调用,如果 obj 可调用,返回 True,否则返回 False
compile
提供一次性字节代码预编译,以后每次调用的时候都不用再编译了。运行时迅速生成代码对象,然后用exec语句或内建函数
eval
来执行这些对象或者对他们进行求值。compile(string, file, type)
三个参数是必需的,分别对应要编译的python代码、保存代码对象的文件名(通常设为空串
''
)、代码对象的类型。类型有三种:
'eval'
:可求值的表达式 [和eval
一起使用]'single'
:单一可执行语句 [和exec一起使用]'exec'
:可执行语句组 [和exec一起使用]eval
eval(obj, globals, locals)
三个参数,对表达式进行求值,第一个参数obj可以是字符串或内建函数complie
创建的预编译代码对象,其他两个参数可选,代表全局和局部名字空间中的对象。与
int
的区别:-
eval
接受一个字符串并作为表达式求值;-
int
只是接受代表整数的字符串并转换为整数。exec
与
eval
类似,语法是exec obj
exec可以执行的对象:字符串代码(如单一语句或语句组);代码对象(如
compile()
用'single'
,'exec'
参数编译成的代码对象);文件对象input
相当于
eval(raw_input)
,有一个可选参数,代表了给用户的字符串提示,默认为空串。与
raw_input
区别是:-
raw_input
是得到字符串形式的用户输入;-
input
则是对输入表达式进行求值,将其转化为合适的类型返回。
14.4 执行其他python程序
导入
第一次导入模块会执行模块最高级的代码,如果不想每次导入都执行某些代码,那就缩进它,将其放入
if __name__ == __main__
内部。
# import1.py import import2 if __name__ == '__main__': print 'loaded import1' # import2.py f __name__ == '__main__' print 'loaded import2' >>>import import1 >> #不再执行print
execfile
execfile(filename)
执行代码文件,相当于使用exec语句读取python脚本的内容并执行
f = open(filename, 'r') exec f f.close
-将模块作为脚本执行
python2.4之后,允许从shell或DOS提示符直接把模块作为脚本来执行
14.5 执行其他(非Python)程序
在Python里执行非Python程序,要求是:有一个有效的执行环境;考虑python脚本是否需要和其他程序通信。本章主要是通过os系列函数来执行其他非Python程序。
os.system
接收字符串形式的系统命令并执行它,执行完成之后,将会以
system
的返回值形式给出退出状态(0表示成功,非0表示错误)os.popen
是文件对象和 system函数的结合,工作方式和
system
相同,但它可以建立一个指向那个程序的单向连接,然后如访问文件一样访问这个程序。返回的是一个类文件对象。os.fork
创建一个新的进程,称为子进程,目的是为了运行其他程序,区分的方法是根据父进程与子进程返回值的不同,子进程返回值是0。
subprocess模块
部分类可以取代
os.system
、os.popen
14.7 结束执行
当程序运行完成,所有模块最高级的语句执行完毕后退出,这是干净的执行。
sys.exit
当调用
sys.exit
时,就会引发systemExit
异常,解释器会用给定的状态参数退出,该参数默认为 0。System Exit 是唯一不被看作错误的异常,仅表示要退出python。
sys.exitfunc
默认不可用,没有参数,可以改写作为
exit
的一部分来执行。os._exit
不建议使用,只适用于特定的平台。
os.kill
模拟传统的unix函数发送信号给进程,从而终结进程。
本章练习
14-3.执行环境。创建运行其他Python脚本的脚本。
filename = raw_input('file name: ') execfile(filename)
14-4. os.system。调用os.system运行程序。附加题:将你的解决方案移植到subprocess.call。
import os s.system('dir')
14-5. commands.getoutput
。用commands.getoutput
解决前面的问题。
rom commands import getoutput output = getoutput('dir') print output
14-6.popen家族。选择熟悉的系统命令,该命令从标准输入获得文本,操作或输出数据。使用os.popen与程序进行通信。
from os import popen f = popen('dir') for i in f: print i,
ScalersTalkID:scalerstalk
本微信公众号作者Scalers,游走在口译世界的IT从业者。微信公众号ScalersTalk,微博@Scalers,网站ScalersTalk.com,口译100小时训练计划群C 456036104
成长会是由Scalers发起的面向成长、实践行动,且凝聚了来自全球各地各行各业从业者的社群。有意入会者请和Scalers直接联系,我和其他会员会和你直接交流关于成长行动等各方面的经验教训。2016年成长会持续招募中,参见做能说会写的持续行动者:ScalersTalk成长会2016年会员计划介绍(2016.3更新)