读后感
我觉得使用python数据模型,还不如使用python对象模型。在python中,万物皆对象,一张牌是一个对象,一副牌也是一个对象。python巧妙的运用已经存在的数据模型,构建对象,只需要重写相关方法就可以实现其功能。
python风格的纸牌
import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])
class FrenchDeck:
ranks = [rank for rank in range(2, 11)] + list('JQKA')
suits = list('shdc')
def __init__(self):
self._card = [Card(rank, suit) for rank in self.ranks
for suit in self.suits]
def __getitem__(self, item):
return self._card[item]
def __len__(self):
return len(self._card)
if __name__ == '__main__':
deck = FrenchDeck()
print(len(deck))
for c in deck:
print(c)
print(deck[0])
print(deck[-1])
向量
from math import hypot
class Vector:
def __init__(self, x=0, y=0):
self._x = x
self._y = y
# 向量表示
def __repr__(self):
return 'Vector(%r,%r)' % (self._x, self._y)
# 向量加法
def __add__(self, other):
x = self._x + other._x
y = self._y + other._y
return Vector(x, y)
# 向量乘法
def __mul__(self, scalar):
return Vector(self._x * scalar, self._y * scalar)
# 向量绝对值
def __abs__(self):
return hypot(self._x, self._y)
# 零向量
def __bool__(self):
return bool(self._x) and bool(self._y)
if __name__ == '__main__':
v = Vector(3, 4)
print(abs(v))
print(v+v)
print(v)
print(bool(v))
print(v*3)
代码编写事项
列表推导式不支持+操作
向量中的加法和乘法返回的是一个新的向量对象,需要调用构造方法。
零向量还可以对绝对值求值