五一快乐的时光总是飞快了,不知多久没有拿起键盘写文章了,最近公司有Python的需求,想着复习下Python吧,然后就买了本Python的书籍 书名: 《流畅的Python》
下面是整理的一个阅读笔记,大家自行查阅,主要是做一个记录,记录下自己认为重要的部分
第1章 Python数据模型
- 特殊方法(xx)的存在是为了被Python解释器调用的,你自己并不需要调用它们。
- 很多时候,特殊方法的调用是隐式的,比如 for i in x: 这个语句,背后其实用的是iter(x),而这个函数的背后则是x.iter()方法。
- 元对象所指的是那些对建构语言本身来讲很重要的对象。
第2章 序列构成的数组
- 容器序列:list、tuple和collections.deque这些序列能存放不同类型的数据。
- 扁平序列:str、bytes、bytearray、memoryview和array.array,这类序列只能容纳一种类型。
- 容器序列存放的是它们所包含的任意类型的对象的引用,而扁平序列里存放的是值而不是引用。换句话说,扁平序列其实是一段连续的内存空间。
- 可变序列:list、bytearray、array.array、collections.deque和memoryview。
- 不可变序列:tuple、str和bytes。
- 生成器表达式:逐个产出元素,而不是一次性产出一个含有所有元素的列表。
- 元组拆包可以应用到任何可迭代对象上。
- 切片:对seq[start:stop:step]进行求值的时候,Python会调用seq.getitem(slice(start,stop,step))。
第3章 字典和集合
- 什么是可hash的数据类型,原子不可变数据类型(str、bytes和数值类型)都是可散列类型。
- 字典推导(dictcomp)可以从任何以键值对作为元素的可迭代对象中构建出字典。
- 集合中的元素必须是可散列的,set类型本身是不可散列的,但是frozenset可以。
- 反汇编函数:dis.dis
- 散列表给dict带来的优势和限制:
- 键必须是可散列的
- 字典在内存上的开销巨大:由于字典使用了散列表,而散列表又必须是稀疏的,这导致它在空间上的效率低下。举例而言,如果你需要存放数量巨大的记录,那么放在由元组或是具名元组构成的列表中会是比较好的选择。
- 键查询很快:dict的实现是典型的空间换时间
第4章 文本和字节序列
- 略过
第5章 一等函数
- 编程语言理论家把“一等对象”定义为满足下述条件的程序实体:
- 在运行时创建
- 能赋值给变量或数据结构中的元素
- 能作为参数传给函数
- 能作为函数的返回结果
- 接受函数为参数,或者把函数作为结果返回的函数是高阶函数
- all和any也是内置的归约函数。
- Python简单的句法限制了lambda函数的定义体只能使用纯表达式。换句话说,lambda函数的定义体中不能赋值,也不能使用while和try等Python语句。
- Python数据模型文档列出了7种可调用对象。
- **用户定义的函数:**使用def语句或lambda表达式创建。
- 内置函数:使用C语言(CPython)实现的函数,如len。
- 内置方法:使用C语言实现的方法,如dict.get。
- 方法:在类的定义体中定义的函数。
- **类:**调用类时会运行类的__new__方法创建一个实例,然后运行__init__方法,初始化实例,最后把实例返回给调用方。
- 类的实例:如果类定义了__call__方法,那么它的实例可以作为函数调用。
- **生成器函数:**使用yield关键字的函数或方法。调用生成器函数返回的是生成器对象。
- 不仅Python函数是真正的对象,任何Python对象都可以表现得像函数。为此,只需实现实例方法__call__。
函数内省??- 虽然Guido明确表明,Python的目标不是变成函数式编程语言,但是得益于operator和functools等包的支持,函数式编程风格也可以信手拈来。
第6章 使用一等函数实现设计模式
- 略过
第7章 函数装饰器和闭包
- 函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为。这是一项强大的功能,但是若想掌握,必须理解闭包。
- 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。
- 严格来说,装饰器只是语法糖。如前所示,装饰器可以像常规的可调用对象那样调用,其参数是另一个函数。
- 函数装饰器在导入模块时立即执行,而被装饰的函数只在明确调用时运行。这突出了Python程序员所说的导入时和运行时之间的区别。
- 装饰器函数与被装饰的函数在同一个模块中定义。实际情况是,装饰器通常在一个模块中定义,然后应用到其他模块中的函数上。
- **闭包(closure)**是一种函数,它会保留定义函数时存在的自由变量的绑定,这样调用函数时,虽然定义作用域不可用了,但是仍能使用那些绑定。
- Python3引入了nonlocal声明。它的作用是把变量标记为自由变量,即使在函数中为变量赋予新值了,也会变成自由变量。
- Python内置了三个用于装饰方法的函数:property、classmethod和staticmethod。
单分派泛函数??- 叠放装饰器:把@d1和@d2两个装饰器按顺序应用到f函数上,作用相当于f=d1(d2(f))
- 参数化装饰器
第8章 对象引用、可变性和垃圾回收
- ==运算符比较两个对象的值(对象中保存的数据),而is比较对象的标识。
- 元组的值会随着引用的可变对象的变化而变化。元组中不可变的是元素的标识。
- 浅复制:即复制了最外层容器,副本中的元素是源容器中元素的引用。如果有可变的元素,可能就会导致意想不到的问题。
- 不要使用可变类型作为参数的默认值。
第9章 符合Python风格的对象
classmethod
与staticmethod