我正在通过构建二十一点游戏来学习python(具有VBA背景)(是的,我以二十一点为例问了一堆问题)。
这是我的代码:
import random
class DECK():
def load_deck(self):
suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
rank = ('2', '3', '4', '5', '6', '7', '8', '9', '10', "Jack", "Queen", "King", "Ace")
full_deck = {}
i = 0
for s in suite:
for r in rank:
full_deck[i] = "%s of %s" % (r, s)
i += 1
return full_deck
def pick_item(self, deck):
card_key = random.choice(deck.keys())
new_card = deck[card_key]
del deck[card_key]
return (deck, new_card)
def missing_card(self, deck):
temp_deck = DECK()
print temp_deck
d1 = DECK()
deck1 = d1.load_deck()
deck1, card1 = d1.pick_item(deck1)
print card1
d1.missing_card(d1)
这是我在终端中得到的(文件名hand_c.py
):
$ python hand_c.py
Ace of Clubs
<__main__.DECK instance at 0x10bb0d248>
$
为什么一个函数pick_item
工作,而另一个函数missing_card
不起作用?
根据第一个答案,我将函数定义更改为:
def missing_card(self, deck):
deckC1 = DECK()
temp_deck = deckC1.load_deck
print temp_deck
但是现在我从终端得到以下内容:
$ python hand_c.py
Jack of Diamonds
<bound method DECK.load_deck of <__main__.DECK instance at 0x10500e248>>
$
我修改了你的程序才能工作。我引入了一个构造函数,并将您的套牌的表示形式更改为列表而不是字典,并将其更改为属于您在行d1 = DECK()
中创建的套牌的实例变量。您类中的每个方法现在都可以访问您的套牌,而无需向世界透露您的套牌内部表示,您只需使用一个 DECK 对象。
import random
class DECK():
def __init__(self):
suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
rank = ('2', '3', '4', '5', '6', '7', '8', '9', '10', "Jack", "Queen", "King", "Ace")
self.full_deck = []
for s in suite:
for r in rank:
self.full_deck.append("%s of %s" % (r, s))
def pick_item(self):
card_key = random.randint(0, len(self.full_deck)-1)
new_card = self.full_deck[card_key]
del self.full_deck[card_key]
return new_card
def missing_card(self):
print self.full_deck
d1 = DECK()
card1 = d1.pick_item()
print card1
d1.missing_card()
你应该通过Python教程。 您的代码有很多问题。 最基本上,您只是将类用作保存函数的包,而实际上没有将 deck 数据作为类实例的一部分保存。 也就是说,您将甲板作为字典返回,然后将其传递回另一个函数。 最好将套牌存储在属性中(例如,self.deck
),然后让其他函数使用它。
无论如何,它不打印字典的原因很简单。 你这样做:
temp_deck = DECK()
print temp_deck
因此,您创建一个变量temp_deck
并将其设置为等于类 DECK 的新实例。 然后你打印它。 好吧,当然它不会打印字典。 temp_deck
不是字典。 它是一个 DECK 对象。 如果你想用你当前的代码来字典,你需要像对原始甲板一样做temp_deck.load_deck()
然后打印结果。