5% list 获取 意义 mage ber position 赋值
昨天学习了怎么用 namedtuple() 方法生成一张纸牌的类。今天继续学习怎么生成一摞纸牌。
流畅的 Python 中给出的第一个例子是一摞有序的纸牌:
- import collections# 一摞有序的纸牌
- Card = collections.namedtuple('Card', ['rank','suit'])classFrenchDeck:
- ranks = [str(n)for nin range(2,11)] + list('JQKA')
- suits ='spades diamonds clubs hearts'.split()def__init__(self):
- self._cards = [Card(rank, suit)for suitin self.suitsfor rankin self.ranks]def__len__(self):return len(self._cards)def__getitem__(self, position):return self._cards[position]
上一节学习了 Card 类,这一节看一下 FrenchDeck 中的内容。
ranks 是一个列表,在这个列表中,共有 13 个字符,为 2 到 11 和'JQKA',这就是列表表达式。
suits 是一个代表扑克牌 4 中花色的列表,这个列表是通过切割字符串得到的。
初始化方法中,对一摞纸牌进行了初始化,并赋值给 self._cards, 这里为什么要加下划线呢?意义在哪里?
- import collections
- Card = collections.namedtuple('Card', ['rank','suit'])
- ranks = [str(n)for nin range(2,11)] + list('JQKA')
- suits ='spades diamonds clubs hearts'.split()
- cards = [Card(rank, suit)for suitin suitsfor rankin ranks]for r, sin cards:
- print({r: s})
- >>>
- {'2':'spades'}
- {'3':'spades'}
- {'4':'spades'}
- ...
- {'Q':'hearts'}
- {'K':'hearts'}
- {'A':'hearts'}
说明:单下划线开头的变量,标明是一个受保护 (protected) 的变量,原则上不允许直接访问,但外部类还是可以访问到这个变量。这只是程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。
FrenchDeck 类中的__len__() 方法是一个特殊方法,获取这摞扑克牌的长度,及统计共有多少张扑克牌。
FrenchDeck 类中的__getitem__() 方法也是一个特殊方法,用以获取这摞扑克牌中的一张扑克牌。
学习了这节内容,第一反应是,哇哦~ 我可以用 Python 写出 99 乘法表了,心动不如行动:
- #99乘法表
- from collections import namedtuple
- Rank = namedtuple('Rank', ['row','column'])table = [Rank(row, column)for rowin range(1,10)for columnin range(1,10)]print(table)for row, columnintable:
- #print("%d*%d=-" % (row, column, row * column),end=' ')print(row * column,end=' ')
- # OMG 怎么打印出99乘法表的格式呢?if column ==9:print("")
- >>>1234567892468101214161836912151821242748121620242832365101520253035404561218243036424854714212835424956638162432404856647291827364554637281
最后的结果如上,但是这不是我想要的啊,我想要的是小时候文具盒上那样的:
TIPS: 这个故事告诉我们,你以为你会了,其实你还什么都不会。
1-1 一摞有风格的纸牌之一摞
来源: http://www.bubuko.com/infodetail-2063581.html