我是靠谱客的博主 丰富汉堡,这篇文章主要介绍Fluent Python读书笔记(一),现在分享给大家,希望可以做个参考。

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

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

一摞Python风格的纸牌

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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标准库,比如:

复制代码
1
2
3
>>> from random import choice >>> choice(deck) Card(rank='3', suit='hearts')

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

复制代码
1
2
3
4
5
>>> deck[:3] >>> for card in deck: ... print(card) >>> for card in reversed(deck): #反向迭代 ... print(card)

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

复制代码
1
2
3
4
5
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函数,进行升序排序:

复制代码
1
2
for card in sorted(deck,key=spades_high): print card

最后

以上就是丰富汉堡最近收集整理的关于Fluent Python读书笔记(一)的全部内容,更多相关Fluent内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(90)

评论列表共有 0 条评论

立即
投稿
返回
顶部