《流畅的python》读书笔记(1)

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

发布了32 篇原创文章 · 获赞 6 · 访问量 923

猜你喜欢

转载自blog.csdn.net/EEEEEEcho/article/details/103768686