"Python3-Cookbook"阅读笔记

数据结构:

元组列表可比较

 

1.10 hash:如果一个对象在其生命周期内有一个固定不变的哈希值 (这需要hash()方法) 且可以与其他对象进行比较操作 (这需要eq()方法) ,那么这个对象就是可哈希对象 (hashable) 。所有python内置的不可变对象都是可哈希的,同时,可变容器 (比如列表或者字典 ) 都是不可哈希的。用户自定义的类的实例默认情况下都是可哈希的。

1.14 operator.attrgetter():排序类型相同的对象  sorted(users, key=attrgetter('user_id'))

字典:

1.6 defaultdict:d[key].append(value)

1.7 OrderedDict:控制插入顺序,序列化为json非常有用,但内存消耗过大

1.8 zip:字典键值反转

1.9 字典集合操作:keys()方法返回一个展现键集合的键视图对象,支持集合操作,比如集合并、交、差运算。items()方法返回一个包含 (键,值) 对的元素视图对象,也支持集合操作。values()方法不支持集合操作,可以先将值集合转换成 set,然后再执行集合运算。

1.13 operator.itemgetter():根据某个或某几个字典字段来排序字典列表  sorted(rows, key=itemgetter('fname'))

1.20 collections.ChainMap():接受多个字典并将它们在逻辑上变为一个字典

2.12 dict.fromkeys() 构建字典

列表:

1.12 collections.Counter   Counter 对象可以接受任意的由可哈希(hashable)元素构成的序列对象。 在底层实现上,一个 Counter 对象就是一个字典,将元素映射到它出现的次数上。

1.15 itertools.groupby():根据某个特定的字段比如 date 来分组迭代访问

1.16 itertools.compress():过滤序列元素。先创建一个Bolean序列,指示哪些元素符合条件。 然后compress()函数根据这个序列去选择输出对应位置为True的元素  more5 = [n > 5 for n in counts] list(compress(addresses, more5))

元组:

1.18 collections.namedtuple():命名元组

Subscriber = namedtuple('Subscriber', ['addr', 'joined'])  sub = Subscriber('jonesy@example.com', '2012-10-19')

字符串: 

1.11  命名切片:SHARES = slice(20,23) record[SHARES]   等价于   record[20:23]

2.1 多个界定符分割字符串:re.split()     (?:...):用括号来分组正则表达式,但不保留分割字符串到结果列表中

2.3 fnmatch() 和 fnmatchcase():匹配文本字符串

2.8 re.compile() 函数接受一个标志参数叫 re.DOTALL,可以让正则表达式中的点(.)匹配包括换行符在内的任意字符

2.9 unicodedata.normalize标准化Unicode文本

2.11 strip():字符串清理

2.12 str.translate():清理文本字符串

2.15 __missing__(self, key):防止找不到对象     sys._getframe(1) :返回调用者的栈帧   再访问属性 f_locals 来获得局部变量

2.16 textwrap 模块:指定列宽格式化字符串的输出 

2.17 在字符串中处理html和xml

2.18 re.compile.scanner(): 这个方法会创建一个 scanner 对象, 不断的调用 match() 方法会一步步的扫描目标文本

数字日期和时间:

3.2 Decimal:对浮点数执行精确的计算操作

3.5 字节与大整数转换: int.from_bytes()   int.to_bytes()

3.6 复数:complex(real, imag)    a = complex(2, 4) 或 b = 3 - 5j

3.8 分数:frantion.Fraction

3.12 日期时间表示与转换:datetime.datetime datetime.timedelta    dateutil.relativedelta()可填充月份

3.15 字符串转日期:datetime.strptime(速度很慢,性能较差,最好自己分割解析)  日期转字符串:datetime.strftime

3.16 时区转换:

ct = datetime.now() # ct = datetime(2020,7,10,9,30)
ctz = pytz.timezone('Asia/Shanghai')
loc_d = ctz.localize(ct) # 2020-04-23 22:13:27.534981+08:00
ny_d = loc_d.astimezone(pytz.timezone("America/New_York")) # 2020-04-23 10:13:27.534981-04:00

迭代器与生成器

4.5 __reversed__():可实现反向迭代

4.7 itertools.islice:对迭代器对象进行切片

4.8 itertools.dropwhile():传递一个函数对象和一个可迭代对象。 它会返回一个迭代器对象,丢弃原有序列中直到函数返回Flase之前的所有元素,然后返回后面所有元素

4.9 集合中元素的排列或组合:itertools.permutations():排列  itertools.combinations():组合

4.12:itertools.chain():对不同的集合中所有元素执行相同操作

4.15:顺序合并:heapq.merge()(要求是排过序的)

文件与IO

5.4 对字节字符串索引和迭代动作返回的是字节的值而不是字节字符串

5.6 类文件对象操作字符串数据:io.StringIO() 和 io.BytesIO()

5.7 读写压缩文件:gzip.open  bz2.open  可以作用在一个已存在并以二进制模式打开的文件上

5.8 固定大小快迭代:partial(f.read, RECORD_SIZE)

5.9 直接读取二进制数据到一个可变缓冲区:文件对象的 readinto() 方法能被用来为预先分配内存的数组填充数据,甚至包括由 array 模块或 numpy 库创建的数组。   os.path.getsize(filename):获取二进制文件字节大小。   memoryview :可以通过零复制的方式对已存在的缓冲区执行切片操作,甚至还能修改它的内容。

5.10 mmap.mmap:内存映射一个二进制文件到一个可变字节数组中

5.13 文件名的匹配:glob 或 fnmatch 模块

5.19 创建临时文件和文件夹:tempfile 模块中 TemporaryFile() 、NamedTemporaryFile() 和 TemporaryDirectory()

5.21 将Python对象序列化为字节流:pickle.dumps()  pickle.loads()      用户自定义类提供 __getstate__() 和 __setstate__() 方法。pickle.dump() 会调用 __getstate__() 获取序列化的对象。__setstate__() 在反序列化时被调用

数据编码和处理

6.1 读写CSV数据

6.2 读写JSON数据

6.3 解析XML数据:xml.etree.ElementTree

6.4 增量式解析大型XML文件:xml.etree.ElementTree.iterparse

6.5 将字典转换为XML:from xml.etree.ElementTree import Element

6.6 解析和修改XML

6.7 利用命名空间解析XML文档

6.9 编码和解码十六进制数:binascii.b2a_hex()  binascii.a2b_hex()    base64.b16encode()  base64.b16decode()

6.10 编码解码Base64数据:base64.b64encode()  base64.b64decode()

6.11 读写二进制数组数据

6.12 读取嵌套和可变长二进制数据 (重点学习)

函数

7.5 默认参数:默认参数的值应该是不可变的对象。  测试某个可选参数是否被使用者传递进来,可以创建一个独一无二的私有对象实例

7.7 匿名函数捕获变量值:lambda表达式中的x是一个自由变量, 在运行时绑定值。  如果想让某个匿名函数在定义时就捕获到值,可以将那个参数值定义成默认参数。

7.11 内联回调函数(思想:将复杂的控制流隐藏到生成器函数背后)

7.12 给闭包添加方法,访问闭包中定义的变量

类与对象

8.1 内置方法__repr__:终端调用时可打印信息,IDE中没有定义__str__时,打印时会调用__repr__函数。

8.2 自定义字符串的格式化

8.4 __slots__:减少实例所占的内存。  实例通过一个很小的固定大小的数组来构建,而不是为每个实例定义一个字典,并且不能再给实例添加新的属性。

8.5 在类中封装属性名:以单下划线_开头的名字都应该是内部实现。双下划线的内部属性应该在子类中隐藏起来。

8.8 子类拓展property(疑问:子类重写调用父类方法时,为什么name有set方法?为什么用super(type,type)?)

@name.setter
    def name(self, value):
        print('Setting name to', value)
        super(SubPerson, SubPerson).name.__set__(self, value)

8.9 描述器   带参数的装饰器来装饰类

8.10 延迟计算属性:@property+装饰器

8.12 from abc import ABCMeta, abstractmethod:定义抽象基类

8.13 描述器+装饰器/元类实现系统类型和赋值验证框架(重点学习)

8.14 自定义容器:继承collections 定义的抽象基类

8.15 代理访问 为什么没有父类   super().__setattr__(name, value)可以顺利运行

8.16 类方法实现初始化

8.18 混入类:增强已存在的类的功能和一些可选特征。__slots__ = ()  混入类没有实例变量,直接实例化混入类没有任何意义。

8.19 根据状态的不同来执行不同的操作,为每个状态定义一个对象。状态模式 

8.20 通过字符串调用对象方法:getattr()  operator.methodcaller()

8.21 访问者模式:getattr()

8.22 不用递归实现访问者模式(重点学习) 思想:栈和生成器

def visit_Add(x):
    yield (yield x[0]) + (yield x[1])

f = visit_Add([1,2])
print(f.send(None))  # out 1
print(f.send(1))     # out 2 send内的值送往第二个yield
print(f.send(2))     # out 3 send内的值送往第三个yield
# 最终输出值为两次send之和,若send(2) send(3) 最终输出值即为5

8.23 循环引用的内存管理:Python的垃圾回收机制是基于简单的引用计数。 当一个对象的引用数变成0的时候才会立即删除掉。垃圾回收永远都不会去回收循环引用的对象。弱引用:a_ref = weakref.ref(a)  为了访问弱引用所引用的对象,可以像函数一样去调用它。gc.collect()专门针对循环引用回收垃圾。

8.24 让类支持比较:类上添加装饰器functools.total_ordering后,只需定义一个 __eq__() 方法, 外加其他方法(__lt__, __le__, __gt__, or __ge__)中的一个即可。

8.25 创建缓存实例:创建缓存管理器,类中定义缓存管理器的全局变量,通过缓存管理器的方法创建实例,在这个方法中调用类方法来使用cls.__new(cls)创建实例,并让类的 __init__() 方法抛出异常,让它不能被初始化。

元编程

9.2 *.__wrapped__(*args, **kwargs):直接访问被包装函数

9.5 为装饰器装饰的函数添加函数属性

9.6 带可选参数的装饰器

9.7 利用装饰器强制函数的类型检查:inspect.signature():提取一个可调用对象的参数签名信息。bind_partial().arguments:执行指定参数类型到名称的部分绑定,并创建有序字典。bind().arguments:执行指定参数类型到名称的全绑定,并创建有序字典。

9.8 将装饰器定义为类的一部分

9.9 将装饰器定义为类:wraps(func)(self):将被包装函数的元信息复制到可调用实例中。types.MethodType(method, instance):将method方法绑定到instance实例中。方法函数在一个类中被查找时,它们的 __get__() 方法依据描述器协议被调用。

9.11 装饰器为被包装函数增加参数

9.12 使用装饰器扩充类的功能

9.13 使用元类控制实例的创建:元类调用super().__call__()即是让定义的类初始化。

9.14 捕获类的属性定义顺序:元类中定义“ __prepare__()”方法,这个方法会在开始定义类和它的父类的时候被执行。它必须返回一个映射对象以便在类定义体中被使用到。执行类主体时描述器的定义顺序会被OrderedDict()捕获到。

@classmethod
    def __prepare__(cls, clsname, bases):
        return OrderedDict()

9.15 定义有可选参数的元类:为使元类支持关键字参数,必须确保在 __prepare__() , __new__() 和 __init__() 方法中都使用强制关键字参数。__prepare__() 方法在所有类定义开始执行前首先被调用,用来创建类命名空间。__new__() 方法被用来实例化最终的类对象。它在类的主体被执行完后开始执行。 __init__() 方法最后被调用,用来执行其他的一些初始化工作。需要接受其他的关键字参数的话,__new__() 和 __init__() 方法就要同时提供。当这些额外的参数可能会影响到类命名空间的创建时,需要去定义 __prepare__() 方法。

9.16 利用inspect 模块对*args和**kwargs进行强制参数签名。

9.17 在类上强制使用编程规约:当使用元类时,self实际上是一个类对象。 super(self, self)就是用来寻找位于继承体系中构建self父类的定义。

9.18 编程方式定义类:types.new_class()

9.19 在定义的时候初始化类的成员:operator.itemgetter(n):该函数获取的不是值,而是定义了一个函数,通过定义的函数作用到对象上就能获取值。

9.20 利用函数注解实现方法重载:参数注解+元编程:掌握inspect模块与get函数。装饰器+描述器:结合9.9小节学习get函数。

9.21 避免重复的属性方法

9.22 定义上下文管理器的简单方法

9.23 局部变量域中执行代码:exec(),locals()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值