玖叶教程网

前端编程开发入门

ScalersTalk成长会Python小组第14周学习笔记

Scalers点评:在2015年,ScalersTalk成长会完成Python小组完成了《Python核心编程》第1轮的学习。到2016年,我们开始第二轮的学习,并且将重点放在章节的习题上。Python小组是成长会内部小组,如果你想和我们一起学习Python,你需要是成长会成员,并且完成相关进群任务。

我们的节奏是行动是一周一章学到位,章节习题都会一个一个过。通过到位地执行,达到实质性的提升。

往期日志:

本周学习情况

本周(20160425-20160501)学习第十四章,章节内容为《执行环境》。本周复盘主持人为诗耀。

本章主要内容

本章主要介绍了可调用对象和代码对象,以及支持调用执行功能的一些内建函数,提供了执行其他python程序或非python程序的方法,同时介绍了一些终止执行的方法,最后列举了一些与执行环境相关的模块。

本章主要知识点

14.1可调用对象

即能通过操作符“”来调用的对象,如:用foo来调用函数foo。

可调用对象可以作为参数,通过函数式编程接口来进行调用,如:applyfiltermapreduce

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.systemos.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更新)

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言