第一章 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万+的文章可能是你见过的最完整的讲解