百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

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

wptr33 2025-04-08 19:45 7 浏览

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

相关推荐

Linux高性能服务器设计

C10K和C10M计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模。1999年,DanKegel提出了著名的C10问题:一台服务器上同时...

独立游戏开发者常犯的十大错误

...

学C了一头雾水该咋办?

学C了一头雾水该怎么办?最简单的方法就是你再学一遍呗。俗话说熟能生巧,铁杵也能磨成针。但是一味的为学而学,这个好像没什么卵用。为什么学了还是一头雾水,重点就在这,找出为什么会这个样子?1、概念理解不深...

C++基础语法梳理:inline 内联函数!虚函数可以是内联函数吗?

上节我们分析了C++基础语法的const,static以及this指针,那么这节内容我们来看一下inline内联函数吧!inline内联函数...

C语言实战小游戏:井字棋(三子棋)大战!文内含有源码

井字棋是黑白棋的一种。井字棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、三子旗等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时...

C++语言到底是不是C语言的超集之一

C与C++两个关系亲密的编程语言,它们本质上是两中语言,只是C++语言设计时要求尽可能的兼容C语言特性,因此C语言中99%以上的功能都可以使用C++完成。本文探讨那些存在于C语言中的特性,但是在C++...

在C++中,如何避免出现Bug?

C++中的主要问题之一是存在大量行为未定义或对程序员来说意外的构造。我们在使用静态分析器检查各种项目时经常会遇到这些问题。但正如我们所知,最佳做法是在编译阶段尽早检测错误。让我们来看看现代C++中的一...

ESL-通过事件控制FreeSWITCH

通过事件提供的最底层控制机制,允许我们有效地利用工具箱,适时选择使用其中的单个工具。FreeSWITCH是一个核心交换与混合矩阵,它周围有几十个模块提供各种功能特性。我们完全控制了所有的即时信息,这些...

物理老师教你学C++语言(中篇)

一、条件语句与实验判断...

C语言入门指南

当然!以下是关于C语言入门编程的基础介绍和入门建议,希望能帮你顺利起步:C语言入门指南...

C++选择结构,让程序自动进行决策

什么是选择结构?正常的程序都是从上至下顺序执行,这就是顺序结构...

C++特性使用建议

1.引用参数使用引用替代指针且所有不变的引用参数必须加上const。在C语言中,如果函数需要修改变量的值,参数必须为指针,如...

C++程序员学习Zig指南(中篇)

1.复合数据类型结构体与方法的对比C++类:...

研一自学C++啃得动吗?

研一自学C++啃得动吗?在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C++的资料从专业入门到高级教程」,点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!个人...

C++关键字介绍

下表列出了C++中的常用关键字,这些关键字不能作为变量名或其他标识符名称。1、autoC++11的auto用于表示变量的自动类型推断。即在声明变量的时候,根据变量初始值的类型自动为此变量选择匹配的...