Fluent Python Notes

第一章 Python数据模型

  • 什么是数据模型?

you can think of the data model as a description of Python as a framework. It formalizes the interfaces of the building blocks of the language itself,such as sequences, iterators,functions, classes, context manages, and so on.

将Python比作框架, 则数据模型规范了实现这个框架的基本原则,在这一章中,实际上就是介绍了Python语言中的一种特殊方法/双下划线方法,它体现了Python语言的数据模型特点

比如Python利用len(collection)获取长度信息,而不是collection.len()

  • 那这个双下划线方法在Python中是如何工作的?

    双下划线方法有如下特点?

    • 绝大多数情况下,双下划线方法是由Python解释器调用,比如:当Python解释器遇到len(collection)方法它实际上会以如下方式调用

      1
      collection.__len__()  # 查找collection实例是否实现__len__方法,如果实现则调用该方法
    • duck type(鸭子类型)是Python的一种特点, 他指出这么一个思想,看起来像鸭子,就可以把它当做鸭子,因此,对于一个对象,它具有不同的双下划线方法,它就具有不同的特性,

      双下划线方法对应表

  • 利用双下划线方法,构建具备多种特性的类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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 rank in self.ranks
    for suit in self.suits] # 存储所有牌

    def __len__(self):
    """返回牌的张数"""
    return len(self._cards)

    def __getitem__(self, position):
    """返回指定位置的牌"""
    return self._cards[position]
    1
    2
    3
    4
    # FrenchDeck 具有两种特性,求长度(len)和实现[]操作(即按位置取值操作)
    fd = FrenchDeck()
    position = 5
    print 'len : {} \nindex of {} , card is {}'.format(len(fd), position, fd[position])

第二章 序列构成的数组

序列

这一章主要讲述各种序列的使用

  • Container sequence(容器序列)

    ​容器序列,存储的是各个对象的引用, 因此容器序列可以存储不同类型的对象

    这类容器序列有 : list, tuple, collections.deque

  • Flat sequence(扁平序列)

    扁平序列存放不是对象的引用,而是对象本身, 因此,其不可存储不同类型的对象

    换句话说, 扁平序列其实是一个段连续的内存空间, 它里面只能存放诸如字符,字节,数值这种基本类型

    这类扁平序列有: str, bytes, bytearray, memoryview, array.array

  • 可变序列

    list, bytearray,array.array,collections.deque,memoryview

  • 不可变序列

    tuple, str, bytes

列表推导与生成器表达式

列表推导用于生成列表

1
2
In [7]: [n for n in range(10)] 
Out[7]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

生成器表达式会返回一个生成器,这个生成器实际上也是一种序列,不过里面的元素是惰性生成的,只有你想它请求下一个元素,它才会计算并求得下一个元素并返回

1
2
3
4
5
6
7
8
9
10
In [9]: gen = (n for n in range(10))

In [10]: gen
Out[10]: <generator object <genexpr> at 0x10f870820>

In [11]: next(gen)
Out[11]: 0

In [12]: next(gen)
Out[12]: 1

本文标题:Fluent Python Notes

文章作者:定。

发布时间:2018年5月9日 - 00时05分

本文字数:1,760字

原始链接:http://cocofe.cn/2018/05/09/fluent-python-notes/

许可协议: Attribution-NonCommercial 4.0

转载请保留以上信息。