流暢的python讀書筆記-第一章Python 資料模型

little_liang發表於2019-02-16

第一章 python資料型別

1 隱式方法

利用collections.namedtuple 快速生成字典

import collections


Card = collections.namedtuple(`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, position):
        return self._cards[position]

1.1 __getitem__方法

deck = FrenchDeck()

>>> deck[0]
Card(rank=`2`, suit=`spades`)
>>> deck[-1]
Card(rank=`A`, suit=`hearts`)

__getitem__方法

  • 通過下標找元素
  • 自動支援切片(slicing)操作
  • 可迭代

1.2 __len__方法 與 len(my_object)

  1. 如果my_object 是一個自定義類的物件,那麼 Python 會自己去呼叫其中由 你實現的 len 方法。
  2. Python 內建的型別,比如列表(list)、字串(str)、 位元組序列(bytearray)等,那麼 CPython
    會抄個近路,__len__ 實際 上會直接返回 PyVarObject 裡的 ob_size 屬性。

1.3 其他方法 特殊方法的呼叫是隱式的

for i in x: 這個語句

背後其實用的是 iter(x)
而這個函式的背後則是 x.__iter__() 方法。

1.4 不要自己想當然地隨意新增特殊方法

比如 foo 之類的
因為雖然現在這個名字沒有被 Python 內部使用,以後就不一定了

一個輪子 隨機抽牌

>>> from random import choice
>>> choice(deck)
Card(rank=`3`, suit=`hearts`)
>>> choice(deck)
Card(rank=`K`, suit=`spades`)
>>> choice(deck)
Card(rank=`2`, suit=`clubs`)

2 字串表示形式 reprstr

  • __repr__和__str__這兩個方法都是用於顯示的
  • __str__是面向使用者的,而__repr__面向程式設計師。
  • 一個物件沒有 str 函式,直譯器會用 repr 作為替代。

3 算術運算子

add 和 __mul__,類帶來了 + 和 * 這兩個算
術運算子。

4 布林值

  1. 列表專案bool(x) 的背後是呼叫x.__bool__() 的結果;
  2. 如果不存在 bool 方法,那麼 bool(x) 會嘗試呼叫 x.__len__()。
  3. 若返回 0,則 bool 會返回 False;否則返回True。

5 其他隱式方法請見 書1.3 特殊方法一覽

小總結

    1. collections.namedtuple 快速生成字典
    2. __getitem__方法
    • 通過下標找元素
    • 自動支援切片(slicing)操作
    • 可迭代

    1. len()

      • len(my_obj )自定義類的物件,自定義實現的 len 方法。
      • python內建型別,通過內部型別的屬性直接取得
    2. repr__和__str

      • __repr__和__str__這兩個方法都是用於顯示的
      • __str__是面向使用者的,而__repr__面向程式設計師。
      • 一個物件沒有 str 函式,直譯器會用 repr 作為替代。
    3. from random import choice 一個隨機選取的輪子

    相關文章