流畅的Python阅读笔记

发布于:2024-05-09 ⋅ 阅读:(20) ⋅ 点赞:(0)

在这里插入图片描述

五一快乐的时光总是飞快了,不知多久没有拿起键盘写文章了,最近公司有Python的需求,想着复习下Python吧,然后就买了本Python的书籍 书名: 《流畅的Python》
在这里插入图片描述

下面是整理的一个阅读笔记,大家自行查阅,主要是做一个记录,记录下自己认为重要的部分


第1章 Python数据模型

  1. 特殊方法(xx)的存在是为了被Python解释器调用的,你自己并不需要调用它们。
  2. 很多时候,特殊方法的调用是隐式的,比如 for i in x: 这个语句,背后其实用的是iter(x),而这个函数的背后则是x.iter()方法。
  3. 元对象所指的是那些对建构语言本身来讲很重要的对象。

第2章 序列构成的数组

  1. 容器序列:list、tuple和collections.deque这些序列能存放不同类型的数据。
  2. 扁平序列:str、bytes、bytearray、memoryview和array.array,这类序列只能容纳一种类型。
  3. 容器序列存放的是它们所包含的任意类型的对象的引用,而扁平序列里存放的是而不是引用。换句话说,扁平序列其实是一段连续的内存空间。
  4. 可变序列:list、bytearray、array.array、collections.deque和memoryview。
  5. 不可变序列:tuple、str和bytes。
  6. 生成器表达式:逐个产出元素,而不是一次性产出一个含有所有元素的列表。
  7. 元组拆包可以应用到任何可迭代对象上。
  8. 切片:对seq[start:stop:step]进行求值的时候,Python会调用seq.getitem(slice(start,stop,step))。

第3章 字典和集合

  1. 什么是可hash的数据类型,原子不可变数据类型(str、bytes和数值类型)都是可散列类型。
  2. 字典推导(dictcomp)可以从任何以键值对作为元素的可迭代对象中构建出字典。
  3. 集合中的元素必须是可散列的,set类型本身是不可散列的,但是frozenset可以。
  4. 反汇编函数:dis.dis
  5. 散列表给dict带来的优势和限制:
    1. 键必须是可散列的
    2. 字典在内存上的开销巨大:由于字典使用了散列表,而散列表又必须是稀疏的,这导致它在空间上的效率低下。举例而言,如果你需要存放数量巨大的记录,那么放在由元组或是具名元组构成的列表中会是比较好的选择。
    3. 键查询很快:dict的实现是典型的空间换时间

第4章 文本和字节序列

  • 略过

第5章 一等函数

  1. 编程语言理论家把“一等对象”定义为满足下述条件的程序实体:
    1. 在运行时创建
    2. 能赋值给变量或数据结构中的元素
    3. 能作为参数传给函数
    4. 能作为函数的返回结果
  2. 接受函数为参数,或者把函数作为结果返回的函数是高阶函数
  3. all和any也是内置的归约函数。
  4. Python简单的句法限制了lambda函数的定义体只能使用纯表达式。换句话说,lambda函数的定义体中不能赋值,也不能使用while和try等Python语句。
  5. Python数据模型文档列出了7种可调用对象
    1. **用户定义的函数:**使用def语句或lambda表达式创建。
    2. 内置函数:使用C语言(CPython)实现的函数,如len。
    3. 内置方法:使用C语言实现的方法,如dict.get。
    4. 方法:在类的定义体中定义的函数。
    5. **类:**调用类时会运行类的__new__方法创建一个实例,然后运行__init__方法,初始化实例,最后把实例返回给调用方。
    6. 类的实例:如果类定义了__call__方法,那么它的实例可以作为函数调用。
    7. **生成器函数:**使用yield关键字的函数或方法。调用生成器函数返回的是生成器对象。
  6. 不仅Python函数是真正的对象,任何Python对象都可以表现得像函数。为此,只需实现实例方法__call__。
  7. 函数内省??
  8. 虽然Guido明确表明,Python的目标不是变成函数式编程语言,但是得益于operatorfunctools等包的支持,函数式编程风格也可以信手拈来。

第6章 使用一等函数实现设计模式

  • 略过

第7章 函数装饰器和闭包

  1. 函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为。这是一项强大的功能,但是若想掌握,必须理解闭包。
  2. 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。
  3. 严格来说,装饰器只是语法糖。如前所示,装饰器可以像常规的可调用对象那样调用,其参数是另一个函数。
  4. 函数装饰器在导入模块时立即执行,而被装饰的函数只在明确调用时运行。这突出了Python程序员所说的导入时和运行时之间的区别。
  5. 装饰器函数与被装饰的函数在同一个模块中定义。实际情况是,装饰器通常在一个模块中定义,然后应用到其他模块中的函数上。
  6. **闭包(closure)**是一种函数,它会保留定义函数时存在的自由变量的绑定,这样调用函数时,虽然定义作用域不可用了,但是仍能使用那些绑定。
    1. image.png
  7. Python3引入了nonlocal声明。它的作用是把变量标记为自由变量,即使在函数中为变量赋予新值了,也会变成自由变量。
  8. Python内置了三个用于装饰方法的函数:property、classmethod和staticmethod。
  9. 单分派泛函数??
  10. 叠放装饰器:把@d1和@d2两个装饰器按顺序应用到f函数上,作用相当于f=d1(d2(f))
  11. 参数化装饰器

第8章 对象引用、可变性和垃圾回收

  1. ==运算符比较两个对象的值(对象中保存的数据),而is比较对象的标识。
  2. 元组的值会随着引用的可变对象的变化而变化。元组中不可变的是元素的标识。
  3. 浅复制:即复制了最外层容器,副本中的元素是源容器中元素的引用。如果有可变的元素,可能就会导致意想不到的问题。
  4. 不要使用可变类型作为参数的默认值。

第9章 符合Python风格的对象

  1. classmethodstaticmethod