一摞python风格的纸牌

一摞python风格的纸牌

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):
        return len(self._cards)

    def __getitem__(self, position):
        return self._cards[position]


# 测试代码
if __name__ == "__main__":
    # 创建一副扑克牌
    deck = FrenchDeck()
    
    # 1. 测试牌组长度
    print(f"牌组共有 {len(deck)} 张牌")  # 应该输出52张
    
    # 2. 测试获取特定位置的牌
    print("\n测试特定位置的牌:")
    print(f"第一张牌: {deck[0]}")      # 黑桃2
    print(f"最后一张牌: {deck[-1]}")   # 红桃A
    print(f"第10张牌: {deck[9]}")      # 黑桃J
    
    # 3. 测试切片功能
    print("\n测试切片功能:")
    print("前5张牌:", deck[:5])        # 黑桃2到黑桃6
    print("最后3张牌:", deck[-3:])     # 红桃Q、红桃K、红桃A
    
    # 4. 测试迭代功能
    print("\n测试迭代功能 - 前10张牌:")
    for card in list(deck)[:10]:
        print(card)
    
    # 5. 测试成员检查
    print("\n测试成员检查:")
    print(f"黑桃A在牌组中: {Card('A', 'spades') in deck}")  # True
    print(f"方片1在牌组中: {Card('1', 'diamonds') in deck}")  # False
    
    # 6. 测试随机抽取
    import random
    print("\n测试随机抽取3张牌:")
    for _ in range(3):
        print(random.choice(deck))

以下是代码中单词的翻译:

  • import collections:导入 集合(模块)

  • Card = collections.namedtuple('Card', ['rank', 'suit'])

    • Card:卡牌(类名,此处为专有名词,不翻译)
    • namedtuple:命名元组(Python 中的一种数据类型)
    • rank:点数(指牌的数字或字母大小)
    • suit:花色(指扑克牌的四种花色)
  • class FrenchDeck

    • FrenchDeck:法式扑克牌(指标准52张扑克牌,不翻译)
  • ranks = [str(n) for n in range(2, 11)] + list('JQKA')

    • ranks:点数列表(牌面的数字和字母组合)
    • J:Jack(杰克,扑克牌中的J)
    • Q:Queen(王后,扑克牌中的Q)
    • K:King(国王,扑克牌中的K)
    • A:Ace(幺点,扑克牌中的A)
  • suits = 'spades diamonds clubs hearts'.split()

    • suits:花色列表
    • spades:黑桃
    • diamonds:方块
    • clubs:梅花
    • hearts:红桃
  • def __init__(self):初始化方法(构造方法)

  • self._cards:自身的卡牌列表(_ 表示该属性为内部使用,不建议外部直接访问)

  • def __len__(self):长度方法(用于返回对象的长度)

  • def __getitem__(self, position):获取元素方法(用于通过索引访问对象中的元素)

  • position:位置(指索引位置)

简单来说,这段代码通过 namedtuple 定义了“卡牌”(包含“点数”和“花色”),然后用 FrenchDeck 类创建了一副标准法式扑克牌(包含黑桃、方块、梅花、红桃四种花色,以及2-10、J、Q、K、A等点数),并实现了获取牌组长度和通过索引访问卡牌的功能。

posted @ 2025-10-07 23:20  wangya216  阅读(38)  评论(0)    收藏  举报