读《fluent python》1 - 4章

2019-04-03  本文已影响0人  明年决赛小牛打雄鹿

序幕和数据结构部分:

第一章(序幕):

  1. collections.nametuple可以构建简单的类, 如
  2. 实现 __len__ 函数可以调用 len()
  3. 实现__getitem__函数使类成为序列, 比如A类实现了这个函数, 其实例a可以通过a[0], a[-1]的方式获取值, 而且支持切片获取片段列表, 如a[:3], a[::-1], 另外a会变成可迭代对象可以通过for i in a的方式获取值, 还可以用一些接受可迭代对象的函数来处理实例, 比如 sorted(a), random.choice(a)
  4. 一些其他的魔法函数, 后面的章节会讲, 比如
    __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)
'''

第二章(序列):

  1. 可变序列(MutableSequence): list, bytearray, array.array, collections.deque, memoryview
    不可变序列(Sequence): tuple, str, bytes
  2. 列表推导式, 如[ord(x) for x in your_iterable_object], 返回一个新的列表, 源数据不变
  3. 生成器表达式, 如(ord(x) for x in your_iterable_object)
  4. 元组:
    一. 用作记录
    二. 元组拆包, *号的使用
    三. 嵌套元组拆包
    四. 具名元组 collections.nametuple
  5. 切片: seq[start: stop: step], 返回一个新列表; 给切片赋值(列表), 可以就地修改原列表
  6. +和*操作: +为拼接, *为复制, [1] * 3 返回[1, 1, 1], 注意,如果做*操作的列表里面为可变类型, 复制的数据是同一个引用
  7. 排序: list.sort就地排序, 内置sorted返回一个排好序新列表,
    一些参数: reverse降序, key比较函数
  8. bisect模块:, 有两个主要函数bisect和insort, 用二分在有序序列中查找和插入元素
  9. 数组array.array: 如果列表里只有数字类型, 用array.array性能会更好, 一些接口:fromfile tofile add append...
  10. 内存视图memoryview, 双向列表collections.deque

第三章(字典和集合):

  1. 可散列对象: 实现了__hash__()和__qe__(), 才能比较
  2. 字典推导式
  3. setdefault(key, defaultvalue), setdefault只需要遍历一次字典, 找不到键时用这个
  4. __missing__函数, 只会被__getitem__()在找不到键的时候调用
  5. 子类化UserDict, 可以直接操作self.data
  6. 字典和集合都是用散列表实现的, 不要对他们同时进行迭代和插入, 因为插入值可能会重哈希, 所以会有可能导致漏遍历或者重复遍历

第四章(字符串):

  1. unicodedata.normalize('NFC/NFD', str), 字符串规范化, 一个字符串可能有不同码位数的构成方式, 比较时把字符串用normalize函数把字符串规范化, NFC为码位最少, NFD为码位最多
  2. 大小写折叠, str.casefold()函数
  3. 去掉变音符号, 用NFD规范时字符串里带变音符号的字符会占2个码位, 通过unicodedata.combining()函数来判断是否变音符号, 然后去掉重组
上一篇 下一篇

猜你喜欢

热点阅读