视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
python学习路程
2020-11-27 14:14:20 责编:小采
文档
 这一章中作者简要的介绍了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 <module>

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). 否则就是表示对象的字符串:<Vector object at 0x0000>.这个__repr__和__str__的作用是类似的


下载本文
显示全文
专题