什么是namedtuple?
namedtuple是Python collections模块中的一个工厂函数,用于创建带有命名字段的元组子类。它结合了元组的不可变性和类的可读性,非常适合表示简单的数据结构。
为什么选择namedtuple表示扑克牌?
扑克牌有两个基本属性:花色(suit)和点数(rank)。namedtuple提供了一种轻量级、高效且易于理解的方式来表示这种简单数据结构。
实现扑克牌
下面是用namedtuple实现扑克牌的完整代码示例:
from collections import namedtuple
import random
# 定义扑克牌结构
Card = 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):
return len(self._cards)
def __getitem__(self, position):
return self._cards[position]
def shuffle(self):
"""洗牌"""
random.shuffle(self._cards)
def deal(self, num_cards):
"""发牌"""
if num_cards > len(self._cards):
raise ValueError("Not enough cards in the deck")
return [self._cards.pop() for _ in range(num_cards)]
# 使用示例
if __name__ == "__main__":
deck = FrenchDeck()
print(f"一副扑克牌有 {len(deck)} 张")
# 洗牌
deck.shuffle()
# 发5张牌
hand = deck.deal(5)
print("\n发到的5张牌:")
for card in hand:
print(f"{card.rank} of {card.suit}")
代码解析
1. 定义Card结构
使用namedtuple创建Card类,每个Card对象有两个字段:rank(点数)和suit(花色)。
2. 创建FrenchDeck类
这个类表示一副完整的52张扑克牌,包含所有花色和点数组合。
3. 实现特殊方法
__len__和__getitem__方法使我们的牌组支持len()函数和索引操作。
namedtuple的优势
✔️ 可读性强:card.rank比card[0]更清晰地表达意图
✔️ 内存高效:与普通类相比,namedtuple占用更少内存
✔️ 不可变性:创建后无法修改,避免意外更改
✔️ 完全兼容元组:可以在期望使用元组的地方使用namedtuple
扑克牌展示
以下是通过我们的代码生成的扑克牌示例:
发表评论