Fluent Python读书笔记(一)

Python解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作,这些特殊方法的名字以两个下划线开头,以两个下划线结尾(如__getitem__),obj[key]背后就是__getitem__方法,调用obj.__getitem__(key)。
这些特殊方法(双下方法)能让自己的对象实现和支持下面的语言架构,并与之交互:

  • 迭代
  • 集合类
  • 属性访问
  • 运算符重载
  • 函数和方法的调用
  • 对象的创建和销毁
  • 字符串表示形式和格式化
  • 管理上下文(with块)

一摞Python风格的纸牌

import collections

#collections.namedtuple用以构建只有少数属性但是没有方法的的对象
Card=collections.namedtuple('Card',['rank','suit'])
#>>> card=Card('7','diamonds')
#>>> card
#Card(rank='7', suit='diamonds')

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]

对于FrenchDeck这个类,deck = FrenchDeck(),可以使用len(deck)看一看长度,deck[0]来获取值,还可以方便地利用Python标准库,比如:

>>> from random import choice
>>> choice(deck)
Card(rank='3', suit='hearts')

因为__getitem__方法把[]操作交给了self._cards列表,所以deck类自动支持切片操作和迭代:

>>> deck[:3]
>>> for card in deck:
...   print(card)
>>> for card in reversed(deck): #反向迭代
...   print(card)

迭代通常是隐式的,譬如一个集合类型没有实现__contians__方法,那么in运算符就会按顺序做一次迭代搜索。( __contains__(self, item) 当调用 in 和 not in 来测试成员是否存在时候 __contains__ 被定义。)
根据花色和点数进行排序:

suit_values=dict(spades=3,hearts=2,diamonds=1,clubs=0)

def spades_high(card):
    rank_value=FrenchDeck.ranks.index(card.rank) #对rank属性的排序
    return rank_value*len(suit_values)+suit_values[card.suit]

根据spades_high函数,进行升序排序:

for card in sorted(deck,key=spades_high):
    print card
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值