1-1 一摞有風格的紙牌之一摞
阿新 • • 發佈:2017-05-11
下劃線 5% list 獲取 意義 mage ber position 賦值
寫在前面
昨天學習了怎麽用namedtuple()方法生成一張紙牌的類。今天繼續學習怎麽生成一摞紙牌。
一摞有風格的紙牌之一摞
流暢的Python中給出的第一個例子是一摞有序的紙牌:
import 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]
上一節學習了Card類,這一節看一下FrenchDeck中的內容。
ranks是一個列表,在這個列表中,共有13個字符,為2到11和‘JQKA’,這就是列表表達式。
suits是一個代表撲克牌4中花色的列表,這個列表是通過切割字符串得到的。
初始化方法中,對一摞紙牌進行了初始化,並賦值給self._cards,這裏為什麽要加下劃線呢?意義在哪裏?
import collections
Card = collections.namedtuple(‘Card‘, [‘rank‘, ‘suit‘])
ranks = [str(n) for n in range(2,11)] + list(‘JQKA‘)
suits = ‘spades diamonds clubs hearts‘.split()
cards = [Card(rank, suit) for suit in suits for rank in ranks]
for r, s in cards:
print({r: s})
>>>
{‘2‘: ‘spades‘}
{‘3‘: ‘spades‘}
{‘4‘: ‘spades‘}
...
{‘Q‘: ‘hearts‘}
{‘K‘: ‘hearts‘}
{‘A‘: ‘hearts‘}
說明:單下劃線開頭的變量,標明是一個受保護(protected)的變量,原則上不允許直接訪問,但外部類還是可以訪問到這個變量。這只是程序員之間的一個約定,用於警告說明這是一個私有變量,外部類不要去訪問它。
FrenchDeck類中的__len__()方法是一個特殊方法,獲取這摞撲克牌的長度,及統計共有多少張撲克牌。
FrenchDeck類中的__getitem__()方法也是一個特殊方法,用以獲取這摞撲克牌中的一張撲克牌。
思考
- 怎麽獲取這摞撲克牌中的第一張,第10張,最後一張?
- 怎麽隨機獲取一張撲克牌?--需要導入:random.choice
- 怎麽對撲克牌進行切片操作?
- 怎麽對撲克牌進行叠代操作,打印出所有的撲克牌?
寫在後面
學習了這節內容,第一反應是,哇哦~我可以用Python寫出99乘法表了,心動不如行動:
# 99乘法表
from collections import namedtuple
Rank = namedtuple(‘Rank‘, [‘row‘, ‘column‘])
table = [Rank(row, column) for row in range(1,10) for column in range(1, 10)]
print(table)
for row, column in table:
# print("%d*%d=%2d" % (row, column, row * column), end=‘ ‘)
print(row * column, end=‘ ‘)
# OMG 怎麽打印出99乘法表的格式呢?
if column == 9:
print("")
>>>
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
最後的結果如上,但是這不是我想要的啊,我想要的是小時候文具盒上那樣的:
TIPS: 這個故事告訴我們,你以為你會了,其實你還什麽都不會。
1-1 一摞有風格的紙牌之一摞