【流畅的python】笔记一:
近期闲来无事,准备将【流畅的python】一书翻完。
不定期会有工作任务来临,因此时间很紧,尽我能吸收的最大速度过一遍。年龄大了,时间稍微一长就会遗忘,留此待回忆吧!
争取书中代码全部手工过一遍!
开工!!!
1.特殊方法:
__getitem__ 和 __len__
比如:len(content) 实际执行 content.__len__
obj[key] 实际执行 obj.__getitem__
==================================================
一个纸牌类:
card = collections.namedtuple('car',['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):
return self._cards[position]
=================================================
import collections: --------collecions模块 :
1、计数器:Counter
2、双向队列:deque
3、默认字典:defaultdict
4、有序字典:OrderedDict
5、可命名元组:namedtuple
string.split() 切片 split() 以空格及\n切片
from random import choice 随机选取
【尽可能使用python标准库,避免重新发明轮子】
deck = FrenchDeck()
deck类自动支持切片slicing操作。
deck[:3] 查看最上面的3张牌
输出:[card(rank='2', suit='spades'), card(rank='3', suit='spades'), card(rank='4', suit='spades')]
deck[12::13] 查看‘A’的牌,查看序号为12的牌,每个13张拿1张
输出:[card(rank='A', suit='spades'), card(rank='A', suit='diamonds'), card(rank='A', suit='clubs'), card(rank='A', suit='hearts')]
特殊方法的存在,是为了被Python解释器使用,我们不需要调用它们。除非有大量的元编程存在,直接调用特殊方法的频率应该远低于你去实现它们的次数。唯一常用的是__init__方法,其目的是在你自己的子类的__init__方法中去调用超类的构造器。
不要想当然的随意添加特殊方法。