Chapter One
變量名類似____xxx____,以雙下劃線開頭,雙下劃線結(jié)尾的就是特殊變量,特殊方法的存在是為了被Python解釋器調(diào)用的
例如 ____getitem____ 這里我們查找key來(lái)得出value,d['a']背后的動(dòng)作就是____getitem____方法
# -*- coding:utf-8 -*-
d = {'a': 1, 'b': 2, 'c': 3}
print(d['a'])
print(d.__getitem__('a'))
print(d['a'] == d.__getitem__('a'))
執(zhí)行結(jié)果:
1
1
True
Python風(fēng)格紙牌
namedtuple()用來(lái)創(chuàng)建一個(gè)自定義的tuple對(duì)象,它和tuple一樣都是不可變的,它可以用屬性而不是索引來(lái)引用tuple的元素
# -*- coding:utf-8 -*-
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):
"""
返回這套字牌的長(zhǎng)度
"""
return len(self._cards)
def __getitem__(self, position):
"""
1、返回索引的位置
2、__getitem__把[]操作self._cards,所以自動(dòng)支持切片操作
"""
return self._cards[position]
beer_card = Card('7', 'diamonds')
# 用屬性來(lái)調(diào)用tuple的元素
print(beer_card.rank)
print(beer_card.suit)
# 創(chuàng)建實(shí)例
deck = FrenchDeck()
# 輸出deck長(zhǎng)度
print(len(deck))
# 索引出第一張牌
print(deck[0])
# 索引出最后一張紙牌
print(deck[-1])
執(zhí)行結(jié)果:
7
diamonds
52
Card(rank='2', suit='spades')
Card(rank='A', suit='hearts')
隨機(jī)抽取一張紙牌
這里用random.choice來(lái)隨機(jī)生成一張紙牌
from random import choice
print(choice(deck))
print(choice(deck))
執(zhí)行結(jié)果:
Card(rank='9', suit='spades')
Card(rank='Q', suit='clubs')
切片(slicing)
____getitem____()方法把[]交給了self._cards,所以類得對(duì)象是支持切片操作的
- 索引出前三張牌
- 抽出索引是12的那張牌,然后每隔13張牌拿一張
print(deck[:3])
print(deck[12::13])
執(zhí)行結(jié)果:
[Card(rank='2', suit='spades'), Card(rank='3', suit='spades'), Card(rank='4', suit='spades')]
[Card(rank='A', suit='spades'), Card(rank='A', suit='diamonds'), Card(rank='A', suit='clubs'), Card(rank='A', suit='hearts')
迭代
實(shí)現(xiàn)____getitem____()后,這一副牌就是可迭代的了
for card in deck:
print(card)
執(zhí)行結(jié)果:
Card(rank='2', suit='spades')
Card(rank='3', suit='spades')
Card(rank='4', suit='spades')
Card(rank='5', suit='spades')
Card(rank='6', suit='spades')
Card(rank='7', suit='spades')
Card(rank='8', suit='spades')
.............
.............
也可以反向迭代,使用reversed()方法
for card in reversed(deck):
print(card)
IN運(yùn)算符
迭代通常都是隱式的,一個(gè)集合類型沒有實(shí)現(xiàn)____contains____方法,那么in運(yùn)算符就會(huì)按順序做一次迭代搜索
print(Card('Q', 'hearts') in deck)
print(Card('7', 'beasts') in deck)
字符串表示形式
____str____, ____repr____兩者都是字符串表示形式
兩者的區(qū)別:
____str____是在str()函數(shù)被使用,或是在print函數(shù)打印一個(gè)對(duì)象的時(shí)候被調(diào)用的,是給終端用戶看的
____repr____,如果一個(gè)對(duì)象沒有____str____函數(shù),而Python又需要調(diào)用它的時(shí)候,解釋器會(huì)用____repr____作為替代,它又可以方便我們調(diào)試和記錄日志