中心线

一个热爱“自由”的笔记博客

流畅的Python之纸牌程序

| 0 comments

流畅的Python这本书可以说是最好的Python书之一,很少有能超越的。对于深入了解Python底层的知识本书讲解的比较易懂生动。

强烈推荐学习Python的朋友去阅读这本数!

本文是我对本书中的纸牌程序的一篇学习笔记,也是对书中的知识点的巩固和了解吧。

程序所用模块列表

  1. collections

程序所涉及的的Python知识

  1. 使用 collections.namedtuple 创建命名元组
  2. 列表和列表生成式的使用
  3. split() 指定分隔符分隔字符串,返回分割后的字符串列表
  4. 初识__len__() 和 __getitem__ 方法的使用
  5. 切片(slicing) 的使用

一摞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]

suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)
def spades_high(card):
    rank_value = FrenchDeck.ranks.index(card.rank)
    return rank_value * len(suit_values) + suit_values[card.suit]

首先说说 collections 模块,该模块包含了一些什么?

collections是Python内建的一个集合模块,提供了许多有用的集合类。

这里我们只用了 namedtuple 模块,所以我们暂时先学习这一个模块,其实namedtuple只是一个函数。

下面是一个 namedtuple 的一个小例子

import collections

Point = collections.namedtuple('Point', ['x', 'y'])
# p = Point(x=1, y=2)
p = Point(1, 2)
print(p.x)
print(p.y)

其实namedtuple 就是对元组的一个二次封装。一、限制了元组元素的个数;二、给元组元素起了一个名字,可以通过元素的名字来访问。

这样一来,我们用namedtuple可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。

纸牌中的 namedtuple

Card = collections.namedtuple('Card', ['rank', 'suit'])

这行代码创建了一个命名元组类,包含了rank和suit两个元素,rank 是牌的花色,suit 是纸牌的牌面大小。

纸牌的花色包括(spades->黑桃 hearts->红心 clubs->梅花 diamonds->方块)

纸牌的牌面大小包括(2,3,4,5,6,7,8,9,10,J,Q,K,A)

 

除非注明,否则均为中心线原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.z10.xin/archives/101

发表评论

Required fields are marked *.