【问题标题】:Python: Square Brackets Inside of ParenthesesPython:括号内的方括号
【发布时间】:2018-12-28 23:34:24
【问题描述】:

我看到括号内的方括号参数。我不知道它是什么意思以及它与正常的争论有什么不同,所以我希望对这个问题有所启发。

这里是有问题的代码行:

(我会打印整个块,因为有人可能会觉得它很有用,但重要的部分是 第一个代码 sn-p 的第 3 行和 第二行代码 sn-p 的第 2 行)

第一种情况:

def __additional_cards(self, player):
    while not player.is_busted() and player.is_hitting():
        self.deck.deal([player])
        print(player)
        if player.is_busted():
            player.bust()

这一行中括号内的参数表示游戏的Player 类对象(可以有很多玩家),代码的目的是在玩家要求时发一张额外的牌。

第二种情况:

def play(self):
    self.deck.deal(self.players + [self.dealer], per_hand = 2)
    self.dealer.flip_first_card()    # hide dealer's first card
    for player in self.players:
        print(player)
    print(self.dealer)

在这种情况下,.deal 方法用于将起始牌发给游戏中的所有玩家以及庄家。下面是.deal方法的代码供参考:

def deal(self, hands, per_hand = 1):
   for rounds in range(per_hand):
         for hand in hands:
            if self.cards:
                top_card = self.cards[0]
                self.give(top_card, hand)

如您所见,它只需要一个参数来处理应处理的“手”牌,但上面的代码使用命令+ [self.dealer] 添加了庄家,这是我第一次看到。

庄家是否只是由+ 添加到手牌中的,如果是,为什么要放在方括号中?

代码取自 Michael Dawson 的书,Python Programming for the Absolute Beginner, 3rd Edition,这是他通过解释如何制作简单的二十一点游戏来教授 OOP 的部分。 p>

【问题讨论】:

  • self.deck.deal([player]) 创建一个包含 1 个元素的列表并将其传递给 deal 函数。
  • self.deck.deal(self.players + [self.dealer], per_hand = 2) 将两个列表合二为一,并将其​​传递给deal 函数。 (假设self.players 是一个列表)。
  • Deal 需要知道玩家的数量,并且由于 deal 期望手牌是一个数组,因此您正在创建一个内联数组并将其传递给函数。所以在你的例子中,你将处理 ​​1 手牌,player
  • 请始终注意,Python 中的方括号[] 基本上用于2 目的。主要用途是创建列表,次要用途是访问 tuplesdictionariessetslists 等。在您的代码中,在第一种情况下,您将 dictionary 作为函数调用中的实际参数传递。在第二种情况下,您将连接 2 个 列表

标签: python oop blackjack


【解决方案1】:

deck.deal() 方法将要处理的人员列表作为参数。您不能将单个对象传递给它,因为该方法可能会遍历列表中传递给这些人的交易中的每个对象。当您输入[player] 时,您是在告诉它唯一要处理的人是那个单身player。最好将其保留为列表,因为它允许您概括代码以接受任意数量的人进行交易。

看看self.deck.deal(self.players + [self.dealer], per_hand = 2),这里发生的事情是我们将经销商添加到被交易的人列表中。再次,deal 包含一个人员列表,因为我们想要与所有当前玩家和经销商进行交易,我们可以将这两个东西合并到一个列表中。 self.players 可能只是所有正在玩的人的列表,当我们 + [self.dealer] 我们创建一个包含所有玩家和经销商的新列表。 Python 有运算符重载,这意味着我们可以“添加”两个列表以将它们组合成一个更长的列表。

如果我编写这个代码,我会让player 始终是一个列表本身,self.dealer 始终是一个单元素列表,因为代码被概括为只接受看起来的列表。

编辑澄清:

我想deal 方法看起来像:

def deal(people):
    '''
    people = a list of person objects to deal to
    '''
    for person in people:
        # do something to that person

player 只是对象的一个​​实例。如果我们只想与那个人打交道,我们需要在列表中传入player[player],否则处理任意数量的人的代码会中断,因为你不能循环player对象,只是一个人的列表。

【讨论】:

  • 感谢朋友的回复,这很有见地。但是,关于 ([player])... 您和其他人说它的格式是这样的,以便将交易传递给单个玩家,但是,“玩家”已经是“玩家”列表中单个对象的迭代所以,由于这些原因,它可能没有像那样格式化。或者,我可能会误解某些内容。
  • 如果你运行 type(player) 它应该返回它是某个对象的实例,我猜。见我上面的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
相关资源
最近更新 更多