由于 《流畅的python》是进阶的python书籍,在阅读的时候有些内容还需要查阅相关书籍补充基础知识,所以在此记录一些理解.
一摞python 风格的纸牌
示例程序 1.1:
import collections #导入collections库
Card = collections.namedtuple('Card', ['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,position):
return self._cards[position]
知识点
- collections.nametuple
python 的列表(list),元祖(tuple)等基础的容器除外,collections 库包含了其它的容器,collections 包含的内容比较多,可以使用print(collections.__all__)
查看所有的子类,进一步了解.这里先介绍被使用的nametuple类.
在python基础中,list的元素的值是可以修改的,而元祖则无法修改,不过它们都只能通过下标来访问各个元素的值.nametuple()
的在此的作用是创建一个类似字典,可以用名字来访问元素的值.
经测试,这里的元组名字可以修改为其他字符串,并不影响程序,但是返回的对象,即该语句等于号左边的 ‘Card’ 不可单独修改.因为后文用它来实例元组.
ranks = [str(n) for n in range(2, 10)] + list('JQKA')```
n in range(2,11)
创建了一个2到11的列表,srt(n)将本来是数值转换为字符,然后使用+
号来连接它们,运行这段代码以后,ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
suits = 'spades diamonds clubs hearts'.split()
split()
函数将字符串按空格分割,suits是一个含有4个元素的列表: ['spades', 'diamonds', 'clubs', 'hearts']
,对应扑克牌的4个花色
self._cards = [Card(rank, suit) for suit in self.suits
for rank in self.ranks]
这是一段python风格的代码,Card(rank, suit) for suit in self.suits for rank in self.ranks
(其实是列表生成器,第二章有进一步说明)这里的两个 for..in..
是嵌套循环,根据suit和rank来生成列表.我想它等同于以下程序:
for suit in self.suits:
for rank in ranks:
self._cards.append(Card(rank,suit))
__len__()
,__getitem__()
这种前后由2个下划线的命名方式是python的特殊方法,所以平时程序员就不要用这种风格定义自己的函数了,免得现在或以后和python的特殊方法冲突,python特殊方法使用和普通的方法不同,详见后文。
如何使用特殊方法
__len__()
是一个特殊的方法,python规定len()来调用它,而不是和普通的方法一样,使用user_object.len(),在上文中,实例程中,程序告知python当用户使用 len()函数的时候,应该怎么做:
def __len__(self):
return len(self._cards)
这里,程序获知,对 self._cards 求长度,由于是对对象使用len函数,对象里面可能有很多内容,所以就通过这种方法来确定.
__getitem__()
是另一个特殊的方法:
def __getitem__(self,position):
return self._cards[position]
它告知python,如果使用```object[n]的方式来访问的时候,应该怎么做,毕竟一个对象可能含有很多个列表,很明显,程序确定了就是访问
self.cards``列表.
模拟数值类型
数值比如1,2,4,5,它们都可以进行四则运算等,对于程序员自定义的类型,比如一个类有两个数值变量,那么我们就需要告知python,当运行比如object_1 + object2
的时候,应该具体怎么做,这可以用__add__()
来实现,此外还有__mul__()
等,详见《流畅的python》1.2.
本章小结
略