读《fluent python》1 - 4章
2019-04-03 本文已影响0人
明年决赛小牛打雄鹿
序幕和数据结构部分:
第一章(序幕):
- collections.nametuple可以构建简单的类, 如
- 实现 __len__ 函数可以调用 len()
- 实现__getitem__函数使类成为序列, 比如A类实现了这个函数, 其实例a可以通过a[0], a[-1]的方式获取值, 而且支持切片获取片段列表, 如a[:3], a[::-1], 另外a会变成可迭代对象可以通过for i in a的方式获取值, 还可以用一些接受可迭代对象的函数来处理实例, 比如 sorted(a), random.choice(a)
- 一些其他的魔法函数, 后面的章节会讲, 比如
__setitem__ 设置值
__repr__, __str__ 对象的字符串表示
__abs__, __bool__数值转换
__enter__, __exit__ 上下文管理
不赘述
下面是一个扑克类的python实现
import collections
Card = collections.nametuple('Card', ['rank', 'suit'])
class FrenchDeck:
ranks = [str(n) for n in range(2, 11)] + list('JQKA')
suits = 'spades diamonds clubs hearts'.split()
def __init__(self):
self.cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]
def __len__(self):
return len(self.cards)
def __getitem__(self, index):
return self.cards[index]
'''
-----test-----
deck = FrenchDeck()
len(deck)
deck[0], deck[-1]
random.choice(deck)
deck[:3]
deck[12::13]
for card in deck:
print(card)
for card in reverse(deck):
print(card)
'''
第二章(序列):
-
可变序列(MutableSequence): list, bytearray, array.array, collections.deque, memoryview
不可变序列(Sequence): tuple, str, bytes -
列表推导式, 如
[ord(x) for x in your_iterable_object]
, 返回一个新的列表, 源数据不变 -
生成器表达式, 如
(ord(x) for x in your_iterable_object)
-
元组:
一. 用作记录
二. 元组拆包, *号的使用
三. 嵌套元组拆包
四. 具名元组 collections.nametuple - 切片: seq[start: stop: step], 返回一个新列表; 给切片赋值(列表), 可以就地修改原列表
- +和*操作: +为拼接, *为复制, [1] * 3 返回[1, 1, 1], 注意,如果做*操作的列表里面为可变类型, 复制的数据是同一个引用
-
排序: list.sort就地排序, 内置sorted返回一个排好序新列表,
一些参数: reverse降序, key比较函数 - bisect模块:, 有两个主要函数bisect和insort, 用二分在有序序列中查找和插入元素
- 数组array.array: 如果列表里只有数字类型, 用array.array性能会更好, 一些接口:fromfile tofile add append...
- 内存视图memoryview, 双向列表collections.deque
第三章(字典和集合):
- 可散列对象: 实现了__hash__()和__qe__(), 才能比较
- 字典推导式
- setdefault(key, defaultvalue), setdefault只需要遍历一次字典, 找不到键时用这个
- __missing__函数, 只会被__getitem__()在找不到键的时候调用
- 子类化UserDict, 可以直接操作self.data
- 字典和集合都是用散列表实现的, 不要对他们同时进行迭代和插入, 因为插入值可能会重哈希, 所以会有可能导致漏遍历或者重复遍历
第四章(字符串):
- unicodedata.normalize('NFC/NFD', str), 字符串规范化, 一个字符串可能有不同码位数的构成方式, 比较时把字符串用normalize函数把字符串规范化, NFC为码位最少, NFD为码位最多
- 大小写折叠, str.casefold()函数
- 去掉变音符号, 用NFD规范时字符串里带变音符号的字符会占2个码位, 通过unicodedata.combining()函数来判断是否变音符号, 然后去掉重组