1. 程式人生 > >1-1 一摞有風格的紙牌之一摞

1-1 一摞有風格的紙牌之一摞

下劃線 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 一摞有風格的紙牌之一摞