Python用起来极度舒适的强大背后
生活随笔
收集整理的這篇文章主要介紹了
Python用起来极度舒适的强大背后
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
當(dāng)你使用len(a)獲取a的長(zhǎng)度,使用obj[key]獲取一個(gè)key的值時(shí)的暢快和舒適,在于Python龐大的設(shè)計(jì)思想(Pythonic)。
而obj[key]背后其實(shí)是__getitem__方法,Python實(shí)現(xiàn)的會(huì)被框架本身調(diào)用的方法之一。像__len__,__getitem__這樣的方法稱為特殊方法或者雙下方法。
下面用一個(gè)例子展示如何實(shí)現(xiàn)這兩個(gè)特殊方法,以及見證特殊方法的強(qiáng)大:
此處用到collections模塊中的namedtuple方法,返回一個(gè)具名元組子類。
# -*- coding: utf-8 -*- # Nolaimport collections from random import choiceCard = collections.namedtuple('Card', ['rank', 'suit']) # 返回具有命名字段的元組的新子類 表示一張牌 suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0) # ?->?->?->? 2-A 花色和大小從小到大 0(2梅花色)-51(A黑桃色) 花色大小映射def spades_high(card):"""紙牌升序:param card::return:"""rank_value = FrenchDeck.ranks.index(card.rank) # 獲取紙牌大小indexreturn rank_value * len(suit_values) + suit_values[card.suit] # 紙牌大小index * 4色 + 花色權(quán)重 2clubs=0 2diamonds=1class FrenchDeck(object):# ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'] 13ranks = [str(n) for n in range(2, 11)] + list('JQKA')suits = 'spades diamonds clubs hearts'.split() # ['spades', 'diamonds', 'clubs', 'hearts'] 4def __init__(self):self._cards = [Card(rank, suit) for rank in self.ranksfor suit in self.suits]def __len__(self):return len(self._cards)def __getitem__(self, position):return self._cards[position]if __name__ == '__main__':# namedtuple用法Point = collections.namedtuple('Point', ['x', 'y'])print(Point.__doc__) # docstring Point(x, y)p = Point(11, 22)print(p[0] + p[1]) # 使用indexx, y = p # 像元組一樣解包print(x, y)print(p.x, p.y) # 使用字段名獲取對(duì)應(yīng)值d = p._asdict() # 轉(zhuǎn)為dict OrderedDict([('x', 11), ('y', 22)]) 11 22print(d, d['x'], d['y'])print(Point(**d)) # dict打包為新子類 Point(x=11, y=22)print(p._replace(x=100)) # 類似str替換 Point(x=100, y=22)print('@.@ '*20 + "\n"*2)# 得到一個(gè)紙牌對(duì)象beer_card = Card('7', 'diamonds')print(beer_card) # Card(rank='7', suit='diamonds')print('@.@ ' * 20 + "\n"*2)# len函數(shù)查看一疊牌有多少?gòu)?/span>deck = FrenchDeck()print(len(deck)) # 52print('@.@ ' * 20 + "\n"*2)# 使用__getitem__方法從一疊牌中抽取特定的一張牌print(deck[0]) # 第一張 Card(rank='2', suit='spandes')print(deck[-1]) # 最后一張 Card(rank='A', suit='hearts')print('@.@ ' * 20 + "\n" * 2)# 使用python內(nèi)置函數(shù)random.choice隨機(jī)抽取一張牌print(choice(deck)) # Card(rank='9', suit='hearts')print(choice(deck)) # Card(rank='3', suit='diamonds')print('@.@ ' * 20 + "\n" * 2)# 抽取最上面3張print(deck[:3])# 只看牌面是A的牌print(deck[-4:])print(deck[48:])print('@.@ ' * 20 + "\n" * 2)# 僅僅實(shí)現(xiàn)__getitem__方法,這一摞牌就編程可迭代了for card in deck[:5]:print(card)print('@.@ ' * 20 + "\n" * 2)# 反迭代reverse listfor card in reversed(deck):if card.rank == "K":breakprint(card)print('@.@ ' * 20 + "\n" * 2)# in運(yùn)算符可用在FrenchDeck類上,因?yàn)樗强傻?/span>print(Card('Q', 'diamonds') in deck)print(Card('S', 'diamonds') in deck)print('@.@ ' * 20 + "\n" * 2)# spades_high函數(shù)對(duì)牌進(jìn)行升序排序 標(biāo)準(zhǔn)庫(kù)中sorted函數(shù)自增可根據(jù)指定key自增排序 reverse參數(shù)為True倒序for card in sorted(deck[:8], key=spades_high, reverse=True):print(card)# Card(rank='3', suit='spades')# Card(rank='3', suit='hearts')# Card(rank='3', suit='diamonds')# Card(rank='3', suit='clubs')# Card(rank='2', suit='spades')# Card(rank='2', suit='hearts')# Card(rank='2', suit='diamonds')# Card(rank='2', suit='clubs')print('@.@ ' * 20 + "\n" * 2)?
轉(zhuǎn)載于:https://www.cnblogs.com/NolaLi/p/10616878.html
總結(jié)
以上是生活随笔為你收集整理的Python用起来极度舒适的强大背后的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第三次作业(词频统计及其效能分析)
- 下一篇: Python3 透明网桥算法