码迷,mamicode.com
首页 > 编程语言 > 详细

流畅的python

时间:2019-01-23 17:17:21      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:最小   运算   lse   特殊   list   spl   接口   这一   self   

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

标签:最小   运算   lse   特殊   list   spl   接口   这一   self   

原文地址:https://www.cnblogs.com/anovana/p/10309421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!