這一章中作者簡要的介紹了python資料模型,主要是python的一些特殊方法。例如__len__, __getitem__. 並且用一個紙牌的程式來講解了這些方法
首先介紹下Tuple和nametuple的區別:
Nametuple是類似於元組的資料類型。除了能夠用索引來存取數據,還支援用方便的屬性名稱來存取數據。
傳統的元組存取如下。對每個元素的存取都必須透過索引來找到。這種找法很不直觀
tup1=(,,) tup1[1]
使用nametuple來建構:
tup2=namedtuple(,[,,]) t1=tup2(,,) t1 t1.age t1.height t1.name
得到结果如下,namedtupel中tuple2是类型名,name,age,height是属性名字
从上面的访问可以看到,直接用t1.age的方法访问更加直观。当然也可以用索引比如t1[0]的方法来访问
namedtupe1也支援迭代存取:
t t1: t
和元组一样,namedtupel中的元素也是不可变更的。如果执行t1.age+=1。将会提示无法设置元素
Traceback (most recent call last):
File "E:/py_prj/fluent_py.py", line 17, in
t1.age+=1
AttributeError: can't set attribute
下面來看書中的紙牌例子,程式碼如下:
collections namedtuple Card=namedtuple(,[,]) FrenchDeck: ranks=[str(n) n range(2,11)] + list() suits=.split() __init__(self): self._cards=[Card(rank,suit) suit self.suits
rank self.ranks] __len__(self): len(self._cards) __getitem__(self, position): self._cards[position] __name__==: deck=FrenchDeck() len(deck) deck[1]
#首先定義了的紙牌元組Card, rank代表紙牌數字,suit代表紙牌花色。然後在FrenchDeck首先定義了ranks和suit的具體指。在__init__中初始化self._cards。
__len__回饋self._cards的長度。 __getitem__回饋具體的紙牌值。
結果如下,紙牌的長度為52,其中deck[1]為Card(rank='3',suit='spades')
可以看到len(deck)其實呼叫的是__len__方法。 deck[1]呼叫的是__getitem__
由於有了__getitem__方法,還可以進行迭代訪問,如下:
d deck: d
既然是可迭代的,那我們可以模擬隨機發牌的機制。
from random import choice
print choice(deck)
得到結果:
Card(rank='9', suit='hearts')
接下來看另外一個例子,關於向量運算的。例如有向量1 vector1(1,2),向量2 vector2(3,4)。那麼vector1+vector2的結果應該是(4,6)。 Vector1和vector2都是向量,如何實現運算呢。方法是__add__,__mul__
代碼如下:
vector: __init__(self,x=0,y=0): self.x=x self.y=y __repr__(self): % (self.x,self.y) __abs__(self): hypot(self.x,self.y) __bool__(self): bool(abs(self)) __add__(self,other): x=self.x+other.x y=self.y+other.y vector(x,y) __mul__(self, scalar): vector(self.x*scalar,self.y*scalar)
__name__==: v1=vector(1,2) v2=vector(2,3) v1+v2 abs(v1) v1*3
運算結果如下:
##在這裡__add__,__mul__,__abs__分別實現了向量加法,乘法,以及求模的運算。 值得一提的是__repr__的方法。這個方法是在需要列印物件的時候呼叫。例如print vector(1,2)的時候得到vector(1,2). 否則就是表示物件的字串:
<br>
以上是Python直式學習路程的詳細內容。更多資訊請關注PHP中文網其他相關文章!