我是靠谱客的博主 丰富汉堡,最近开发中收集的这篇文章主要介绍Fluent Python读书笔记(一),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Python解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作,这些特殊方法的名字以两个下划线开头,以两个下划线结尾(如__getitem__),obj[key]背后就是__getitem__方法,调用obj.__getitem__(key)。
这些特殊方法(双下方法)能让自己的对象实现和支持下面的语言架构,并与之交互:

  • 迭代
  • 集合类
  • 属性访问
  • 运算符重载
  • 函数和方法的调用
  • 对象的创建和销毁
  • 字符串表示形式和格式化
  • 管理上下文(with块)

一摞Python风格的纸牌

import collections

#collections.namedtuple用以构建只有少数属性但是没有方法的的对象
Card=collections.namedtuple('Card',['rank','suit'])
#>>> card=Card('7','diamonds')
#>>> card
#Card(rank='7', suit='diamonds')

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]

对于FrenchDeck这个类,deck = FrenchDeck(),可以使用len(deck)看一看长度,deck[0]来获取值,还可以方便地利用Python标准库,比如:

>>> from random import choice
>>> choice(deck)
Card(rank='3', suit='hearts')

因为__getitem__方法把[]操作交给了self._cards列表,所以deck类自动支持切片操作和迭代:

>>> deck[:3]
>>> for card in deck:
...   print(card)
>>> for card in reversed(deck): #反向迭代
...   print(card)

迭代通常是隐式的,譬如一个集合类型没有实现__contians__方法,那么in运算符就会按顺序做一次迭代搜索。( __contains__(self, item) 当调用 in 和 not in 来测试成员是否存在时候 __contains__ 被定义。)
根据花色和点数进行排序:

suit_values=dict(spades=3,hearts=2,diamonds=1,clubs=0)

def spades_high(card):
    rank_value=FrenchDeck.ranks.index(card.rank) #对rank属性的排序
    return rank_value*len(suit_values)+suit_values[card.suit]

根据spades_high函数,进行升序排序:

for card in sorted(deck,key=spades_high):
    print card

最后

以上就是丰富汉堡为你收集整理的Fluent Python读书笔记(一)的全部内容,希望文章能够帮你解决Fluent Python读书笔记(一)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部