小能豆

如何运行这个Python代码来得到这个结果?

python

我是Python新手,正在《Fluent 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]

他们对我说,如果我运行这段代码,我可以在控制台中看到:

>>> beer_card = Card('7', 'diamonds')
>>> beer_card
Card(rank='7', suit='diamonds')

或者在控制台中

>>> deck = FrenchDeck()
>>> len(deck)
52

但是当我尝试运行代码时,他们给了我这个错误:

File "c:\Users\HP\Desktop\自分のこと\Python\test35.py", line 4
    ranks = [str(n) for n in range(2, 11)] + list('JQKA')
    ^
IndentationError: expected an indented block after class definition on line 3
PS C:\Users\HP>

你能告诉我如何解决这个问题吗?或者他们到底想用代码做什么?非常感谢您的宝贵时间。

我想确切地知道他们想用我在文本中编写的代码做什么。


阅读 199

收藏
2024-02-23

共1个答案

小能豆

这段代码定义了两个类:CardFrenchDeck,并且使用了命名元组 (namedtuple)。它们的作用如下:

  1. Card 类:这是一个简单的类,表示一张扑克牌。它使用了命名元组 collections.namedtuple 来定义一个具有 ranksuit 属性的扑克牌对象。例如,Card('7', 'diamonds') 创建了一个称为 beer_card 的扑克牌对象,表示点数为 7 的方片牌。
  2. FrenchDeck 类:这是一个扑克牌的集合类,代表一副法式扑克牌。它有一个属性 _cards,存储了一副完整的法式扑克牌。__init__ 方法用于初始化这副扑克牌,__len__ 方法返回这副扑克牌的长度,__getitem__ 方法允许通过索引来访问扑克牌集合中的元素。

现在让我解释一下你遇到的错误:

File "c:\Users\HP\Desktop\自分のこと\Python\test35.py", line 4
    ranks = [str(n) for n in range(2, 11)] + list('JQKA')
    ^
IndentationError: expected an indented block after class definition on line 3

这个错误表明在第 4 行有一个缩进错误,意味着 Python 解释器期望在 class FrenchDeck: 类定义的后面有一个缩进的代码块。在 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]

# 现在你可以尝试在控制台中运行代码,并测试它们的功能。

希望这可以帮助你理解他们想用代码做什么,并解决你遇到的问题。

2024-02-23