Learning Python
(4th Edition)
Python学习手册
第4版
Mark Lutz著
李军 刘红伟等译
O’REILLY Media, Inc
机械工业出版社
其实,我原先是不准备做这个笔记的,感觉编程这是技术性问题,多练即可,无奈大脑记性不佳,且技术之间的关系又没有搞清楚,故特作此笔记,以图理清脉络,加强记忆。
这篇笔记不会像以前那样详细,只是作为个人一种梳理、助记工具而已。
话说该作者挺为初学者着想的,全面详细,美中不足的是话有些重复。
一个多星期读完这本书,我好佩服自己啊!!!
字典视图
赋值语句执行时,python会建立相应的临时数据类型储存右侧变量原始的值
Python 3.0中的扩展序列解包,*号会使变量匹配剩下的内容
写成字符串,放在模块文件、函数以及类语句的顶端的注释
提取文档字符串并且自动提取其结构化的信息,并将其格式化成各种类型的排列友好的报表。
内嵌的模块是全局作用域。
全局作用域的作用范围仅限于单个文件
每次对函数的调用都创建一个新的本地作用域
赋值的变量名除非声明为全局或非本地,否则均为本地
所有其他的变量名都快归纳为本地、全局或内置的。
当在函数中使用为认证的变量名时,会搜索4个作用域,本地(L),上层函数的本地(E),全局(G),内置(B,__builtin__标准库模块),在第一个找到处停下。
当在函数中给一个变量名赋值时,Python总是创建或改变本地的变量名,除非已经声明为全局变量
在函数外给变量名赋值时,本地与全局是相同的。
全局变量如果在函数内被赋值的话,必须经过global声明
全局变量名在函数内部不经过声明也可被引用
嵌套函数能够记住嵌套作用域的变量值,即使上层函数已经返回了。
将变量映射到上层函数作用域中的对应变量。
是一个表达式,不是一个语句。
主体是一个单个的表达式,不是代码块。
生成器函数:编写为常规的def语句,但使用yield语句一次返回一个结果,在每个结果之间挂起和继续他们的状态。yield语句编译为生成器,调用时,返回一个支持自动创建__init__方法的迭代器
生成器表达式类似于列表解析,返回按需产生结果的一个对象。括在圆括号中而不是方括号中。
第一次导入指定文件时,会执行三个步骤。1、找到模块文件。2、编译成位码(需要时)。3、执行模块的代码来创建所定义的对象。
sys.path包括四个部分:
import将整个模块对象赋给一个变量名
from将一个或多个变量名赋给另一模块中同名的对象
函数绝对无法看见其他函数内的变量名,除非它在处于这个函数内
模块程序代码绝对无法看见其他模块内的变量名,除非明确地进行了导入
reload函数强制已加载的模块代码重新载入并重新执行。新的代码的赋值语句会在适当的地方修改现有的模块对象。
包所在的容器目录应在模块搜索路径中
包导入路径中的每个目录内都必须有__init__.py文件
包首次导入时,会自动执行该文件
可为目录所创建的模块对象提供命名空间,包含所赋值的所有变量名
使用__all__列表,定义目录以from*语句形式导入时,需要导出什么。
Python 3.0中的变化
修改了模块导入搜索路径语义,以默认地跳过包自己的目录。到如只是检查搜索路径的其他组件。这叫做“绝对”导入。
扩展了from语句的语法,以允许显式地要求导入值搜索包的目录。这叫做“相对”导入。
_X会阻止from*导入此变量名
__all__列表列出了from*语句要导出的变量
类对象提供默认行为
Class语句创建类对象并将其赋值给变量名
Class语句的赋值语句会创建类的属性
类属性提供对象的状态和行为
实例对象是具体的元素
像函数那样调用类对象会创建新的实例对象
每个实例对象继承类的属性并获得了自己的命名空间
在方法内对self属性做赋值运算会产生每个实例自己的属性
超类列在了类开头的括号中
类从其超类中继承属性
实例会继承所有可读取类的属性
每个object.attribute都会开启新的独立搜索
逻辑的修改是通过创建子类,而不是修改超类
以双下划线命名的方法(__X__)是特殊钩子
当实例出现在内置运算时,这类方法会自动调用
类可覆盖多数内置类型运算
运算符覆盖方法没有默认值,而且也不需要
运算符可让Python的对象模型相集成
编写构造函数
以两种方式使用代码:作为模块文件或作为脚本使用__name__运行测试代码
编写方法
封装,把操作逻辑包装到界面之和
提供打印显示
编写子类
扩展方法,调用超类的方法
继承、定制和扩展
instance.__class__
object.__dict__
Pickle和Shelve
pickle:任意Python对象和字节串之间的序列化
dbm:实现一个可通过键访问的文件系统,以存储字符串
shelve:使用另外两个模块按照键把Python对象存储到一个文件中
拦截分片slice()
所有迭代环境会先尝试__iter__方法,再尝试__getitem__方法。
当迭代器返回自身时,只支持一个活跃的迭代器。反之,则可支持独立位置的多个活跃迭代器。
优先级如上所示
__getattr__拦截未定义的属性
打印操作首先尝试__str__和str内置函数
只有+右侧对象是类实例,左侧不是时,才调用__radd__,其他所有情况下,由左侧对象调用__add__方法。
当调用实例时,使用该方法。
Class语句中开头有两个下划线,但结尾没有两个下划线的变量名自动扩张,_classname__x
无绑定类方法对象:无self。通过对类进行点号运算从而获取类的函数属性。Python 3.0删除了该概念。
绑定实例方法对象:self+函数对。通过对实例进行全运算从而获取类的函数属性
超类多于一个时,即为多重继承
传统类中,属性搜索深度优先
新式类(以及Python 3.0的所有类),属性搜索沿着树层次,广度优先
用__dict__列出实例属性
用dir列出继承的属性
通过嵌入扩展类型
通过子类扩展类型
(Python 3.0)所有类的继承自object,所有对象都是object的实例
类和类型合并
继承搜索顺序
针对内置函数的属性获取
新的高级工具
__slots__:只有其列表中的变量名可赋值为实例属性
try下的代码代表主要动作,except定义异常的处理器,else子句提供无异常时的处理器
空的except子句捕捉一切异常,捕捉Exception的异常类似于此,但会忽略和系统退出有关的异常。
一旦捕捉了错误,控制权会在捕捉的地方继续下去,即try语句之下,没有直接的方式可以回到异常发生的地方。
当控制权离开try代码块时,Python先执行finally代码块,然后才跳出。finally不会终止异常。
raise
raise
raise 重新引发最近引发的异常,以传播已经捕获的异常。
Python 3.0异常链:raise from
with expression [as variable]: with-block
expression返回一个支持环境管理器协议(有__enter__和__exit__方法)的对象。其__enter__方法的返回值会赋值给variable
若有异常被引发,__exit__(type,value,traceback)方法被调用,若其返回值为假,异常会重新引发,以传播到with语句外。
没有异常时,__exit__(None,None,None)会被调用。
有处理器处理时,返回(type、value和traceback)元组