流畅的python

Posted anovana

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了流畅的python相关的知识,希望对你有一定的参考价值。

python最好的品质之一就是一致性。初步接触python可能会len(collection)而不是collection.len()觉得不适应,这是通常所说的“python风格”(Pythonic)的关键,体现在Python的数据模型上,数据模型是对Python框架的描述,它规范了这门语言自身构建模块的接口,这些模块包括但不限于序列、迭代器、函数、类和上下文管理器。

特殊方法:以两个下划线开头,两个下划线结尾(例如__getitem__)。比如obj[key]背后就是__getitem__方法,为了能求得my_collection[key]的值,解释器实际上会调用my_collection.__getitem__(key)。

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]

collections.namedtuple构建了一个简单的类表示一张纸盘,用以构建只有少数属性但是没有方法的对象,比如数据库条目。

>>> beer_card = Card(7, diamods)
>>> beer_card
Card(rank=7, suit=diamods)

用len()函数看看一叠牌有多少张:

>>> deck = FrenchDeck()
>>> len(deck)
52

从一叠牌中抽取特定的一张,比如第一张或者是最后一张,以下这些都是由__getitem__方法提供的:

>>> deck[0]
Card(rank=2, suit=spades)
>>> deck[-1]
Card(rank=A, suit=hearts)
>>> 

也可以随机抽取一张纸牌

>>> from random import choice
>>> choice(deck)
Card(rank=4, suit=clubs)
>>> choice(deck)
Card(rank=8, suit=clubs)
>>> choice(deck)
Card(rank=10, suit=diamonds)

这是因为__getitem__方法把[]操作交给了self._cards列表,所以deck类会自动支持切片操作。

>>> deck[:3]
[Card(rank=2, suit=spades), Card(rank=3, suit=spades), Card(rank=4, suit=spades)]
>>> deck[12::13]
[Card(rank=A, suit=spades), Card(rank=A, suit=diamonds), Card(rank=A, suit=clubs), Card(rank=A, suit=hearts)]

另外仅仅实现了__getitem__方法,这一摞牌就变成可迭代了

>>> for card in deck:
...     print(card)
... 
Card(rank=2, suit=spades)
Card(rank=3, suit=spades)
...

in运算符会按照顺序做迭代搜索,

>>> Card(Q, hearts) in deck
True
>>> Card(7, beasts) in deck
False

排序,按照黑桃最大、红桃次之、方块再次、梅花最小

>>> 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]
... 
>>> for card in sorted(deck, key=spades_high):
...     print(card)
... 
Card(rank=2, suit=clubs)
Card(rank=2, suit=diamonds)
Card(rank=2, suit=hearts)

按照目前的设计,FrenchDeck是不能洗牌的。

以上是关于流畅的python的主要内容,如果未能解决你的问题,请参考以下文章

分享《流畅的Python》(官方高清中文版PDF+高清英文版PDF+源代码)

帆布迷宫游戏流畅的动画

小白技巧:大图片进行程序切图,页面加载更加流畅

《流畅的Python》高清中文版PDF_mobi+高清英文版PDF_mobi+源代码大全套

《流畅的Python》一副扑克牌中的难点

分享《流畅的Python》+PDF+源码+Luciano Ramalho+安道