第一章 Python數據模型
1.1一摞Python風格的紙牌
import collections
from random import choice
from functools import reduce
# 首先:什麼是collections
# Python中的基本數據結構有list,dict,tuple,set
# collection模塊額外提供了幾種高級數據類型:
# namedtuple():生成可以使用名字來訪問元素內容的tuple子類
# deque:雙端隊列,可以快速的從另外一側追加和推出對象
# counter:計數器
# ordereddict:有序字典
# defaultdict:帶有默認值的字典
# 本代碼用到的是nametuple tuple是不可變集合,nametuple用來創建一個自定義的
# tuple對象並且規定了tuple元素的個數,可通過屬性而不是索引來引用tuple的某個元素,
# 我們可以通過namedtuple很方便的自定義一個數據類型,
# 它具有tuple的不變屬性又可以根據屬性來引用
Card = collections.namedtuple('Card', ['rank', 'suit'])
class FrenchDeck:
# 創建一個列表 包含2-11的數字 以及 J Q K A四個字母 作爲撲克牌的數字
ranks = [str(n) for n in range(2, 11)] + list('JQKA')
# 通過split生成一個花色列表
suits = 'spades diamonds clubs hearts'.split()
def __init__(self):
# 創建一個Card列表 每一個Card代表一張紙牌 通過for循環實現 rank 和 suit的賦值
self.cards = [Card(rank, suit) for suit in self.suits
for rank in self.ranks]
def __len__(self):
# 重寫雙下方法__len__ 調用len()時 len調用該類的__len__
return len(self.cards)
def __getitem__(self, position):
# 重寫__getitem__雙下方法
return self.cards[position]
# 實現按照 2 - A 黑 紅 塊 花 進行排序的規則
# 創建一個字典 爲各花色賦權值
suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)
def spades_high(card):
return_value = FrenchDeck.ranks.index(card.rank)
# print(return_value)
# print(return_value * len(suit_values) + suit_values[card.suit])
#按照 rank * 字典長度 + 花色權值 的大小進行排序
return return_value * len(suit_values) + suit_values[card.suit]
if __name__ == '__main__':
beer_card = Card('7', 'diamonds')
print(beer_card)
deck = FrenchDeck()
print(deck.ranks)
print(deck.suits)
# 輸出第一張紙牌
print(deck[0])
# 調用Python內置的方法從一個序列中隨機選出一個元素的函數 random.choice
# 隨機抽取一張紙牌 重寫雙下方法可以更方便的使用Python的標準庫
print(choice(deck))
# __getitem__方法 將隊列表的操作交給了self.cards 可以這樣理解
# 對deck進行類似列表的切片操作時 會調用__getitem__方法 而該方法
# 進行了重寫 返回了self.cards[position]因此可以進行列表的操作
print(deck[:3])
# 先抽出索引是12的牌,然後每隔13張牌抽出一張 就取到了所有牌面是A的牌
print(deck[12::13])
# 僅僅實現了__getitem方法,這一摞牌就成爲可迭代的
for card in deck:
print(card)
# 迭代是隱式的,若一個集合類型未實現__contains__方法
# 那麼in運算 會隱式的進行迭代進行 搜索,
# 而deck 是可迭代的 所以 in運算符 可以用於該對象
print(Card('Q', 'hearts') in deck)
# 此處有一個排序的知識點
# sorted() 函數對所有可迭代的對象進行排序操作。sort 與 sorted 區別:
# sort 是應用在 list 上的方法,sorted 可以對所有可迭代的對象進行排序操作。
# list 的 sort 方法返回的是對已經存在的列表進行操作,無返回值,
# 而內建函數 sorted 方法返回的是一個新的 list,
# 而不是在原來的基礎上進行的操作。
# sorted 語法:
# sorted(iterable, cmp=None, key=None, reverse=False)
# iterable -- 可迭代對象。
# cmp -- 比較的函數,這個具有兩個參數,參數的值都是從可迭代對象中取出,
# 此函數必須遵守的規則爲,大於則返回1,小於則返回-1,等於則返回0。
# key -- 主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自於可迭代對象中,指定可迭代對象中的一個元素來進行排序。
# reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(默認)。
# 返回值 :返回重新排序的列表。
# key = spades_high 是按照這個規則進行排序
for card in sorted(deck, key=spades_high):
print(card)
#另有學lambda時 遇到的reduce函數
foo = [1,2,3]
#實現累加求和
print(reduce(lambda x,y:x+y,foo)) #輸出6
關於lambda表達式的一位大佬所寫的博客
關於Python中的lambda,這篇閱讀量10萬+的文章可能是你見過的最完整的講解