日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python用起来极度舒适的强大背后

發(fā)布時(shí)間:2024/4/15 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python用起来极度舒适的强大背后 小編覺得挺不錯(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ǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。