Python: 括号内的方括号

问题描述 投票:2回答:1

我看到 方括号内的参数. 我不知道它是什么意思,和普通的参数有什么区别,所以希望能得到一些启发。

下面是有关的代码行。

(我会把整个代码打印出来,因为有人可能会觉得有用 但重要的部分是: 第一段代码的第三行第二段代码的第二行)

第一种情况。

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编程绝对初学者,第3版 而且是他通过讲解如何做一个简单的21点游戏来教OOP的部分。

python oop blackjack
1个回答
3
投票

方法 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 对象,只有一个人的名单。

© www.soinside.com 2019 - 2024. All rights reserved.