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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【学习笔记】流畅的Python第二版【第一章】

發布時間:2023/12/20 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【学习笔记】流畅的Python第二版【第一章】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一摞Python風格的紙牌

#!/usr/bin/env python3import collections from random import choice# namedtuple自從python2.6開始就加入到了Python里,用以構建只有少數屬性但沒有方法的對象,類似于C/C++里面的結構體 Card = collections.namedtuple('Card', ['rank','suit'])def main():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, idx):return self._cards[idx]deck = FrenchDeck()# 打印撲克牌長度print(len(deck))# 抽取第一張牌print(deck[0])# 抽取最后一張牌print(deck[-1])# 隨機抽取一張牌,使用random.choice方法,choice(seq)中傳入的值可以是列表,數組,字符串。print(choice(deck))# 查看一摞牌最上面3張和只看牌面是A的牌的操作print(deck[:3])# 先抽出索引是12的那張牌,然后每隔13張拿1張print(deck[12::13])# 正向迭代for card in deck:print(card)# 反向迭代for card in reversed(deck):print(card)# 對一摞撲克牌排序,2最下,A最大,黑桃最大,紅桃次之,方塊再次,梅花最小。梅花2的大小是0,黑桃A的大小是51.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 car in sorted(deck, key=spades_high):print(car)if __name__ == '__main__':main()

如何使用特殊方法

  • 特殊方法的存在是為了被Python解釋器調用的,你自己并不需要調用他們。盡量少使用my_object.__len__()這種寫法,而推薦使用len(my_object)。
  • 如果my_object是一個自定義類的對象,那么Python會自己去調用你實現的__len__方法。
  • 如果是Python內置的類型,那么 CPython 會抄個近路,__len__實際上會直接返回PyVarObject里的ob_size屬性。
  • 模擬數值類型

    #!/usr/bin/env python3from math import hypot def main():class Vector:def __init__(self, x=0, y=0):self.x = xself.y = ydef __repr__(self):return 'Vector(%r, %r)'%(self.x, self.y)def __abs__(self):return hypot(self.x, self.y)def __bool__(self): # 模非0,顯示truereturn bool(abs(self)) # 可以用 return bool(self.x or self.y) 代替def __add__(self, other):x = self.x + other.xy = self.y + other.yreturn Vector(x,y)def __mul__(self, scalar):return Vector(self.x*scalar, self.y*scalar)v = Vector(3,4)# 查看模數print(abs(v))# 向量與標量相乘v = v*3print(v)# 兩個向量相加v1 = Vector(3,4)v2 = Vector(1,1)print(v1+v2)if __name__ == '__main__':main()

    注意

    __repr__ 和 __str__的區別在于,后者是在 str() 函數被使用, 或是在用 print
    函數打印一個對象的時候才被調用的,并且它返回的 字符串對終端用戶更友好。 如果你只想實現這兩個特殊方法中的一個,__repr__
    是更好的選擇, 因為如果一個對象沒有 __str__函數,而 Python又需要調用它的時 候,解釋器會用 __repr__作為替代。

    總結

    以上是生活随笔為你收集整理的【学习笔记】流畅的Python第二版【第一章】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。