Python 2.7 __getitem\ black jack项目中出现错误

Python 2.7 __getitem\ black jack项目中出现错误,python-2.7,Python 2.7,我正在为我参加的在线课程写一个21点游戏。我知道我必须在某个时候引入对象,但现在我只是尝试为对象中的操作编写非常基本的代码。我也只有化学背景,绝对没有计算机科学背景 我试图做的是从元组的第一个条目中提取值文本值,然后给它分配一个数值,这样我就可以在创建玩家时开始比较分数。然而,我得到这个错误,我不完全知道它意味着什么…代码也在下面。这里还是个笨蛋,只是想学 27 def value_of_card(): --->28 x=交易[0] 29 30卡的打印值() TypeError:“函数”对象没

我正在为我参加的在线课程写一个21点游戏。我知道我必须在某个时候引入对象,但现在我只是尝试为对象中的操作编写非常基本的代码。我也只有化学背景,绝对没有计算机科学背景

我试图做的是从元组的第一个条目中提取值文本值,然后给它分配一个数值,这样我就可以在创建玩家时开始比较分数。然而,我得到这个错误,我不完全知道它意味着什么…代码也在下面。这里还是个笨蛋,只是想学

27 def value_of_card():
--->28 x=交易[0] 29 30卡的打印值()

TypeError:“函数”对象没有属性“getitem

import random

suits = ['spades', 'hearts', 'clubs', 'diamonds']
ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']

def deal():
    deck = []
    for suit in suits:
        for rank in ranks:
            deck.append((rank, suit))
    random.shuffle(deck)
    print deck
    deal = deck[0]
    print deal
    for card in deck:
        if deal in deck:
            deck.remove(deal)
            return deck
    print deck
    print deal[0]

print deal()

def value_of_card(deal):
    return deal[0]    

print value_of_card(deal)

您忘记在卡的
value\u
函数中调用您的
deal
函数。

您还应该将函数名称更改为不同的名称,因为现在有太多名为
deal
的对象,这确实会产生误导,使代码难以阅读

您忘记在卡的
函数中调用您的
交易
函数。
您还应该将函数名称更改为不同的名称,因为现在有太多名为
deal
的对象,这确实会产生误导,使代码难以阅读

一些问题:

  • 将函数引用传递给卡的值,而不是传递该函数返回的值
  • 您的交易功能不会返回一张卡,而是返回剩余卡的牌组。您不应该
    return deck
    ,而应该
    return deal
  • 对所选卡片的搜索(使用
    搜索
    循环)不是必需的:您从索引0中获取了该卡片,因此只需删除索引0处的卡片(使用
    弹出(0)
以下是更正后的脚本:

import random

suits = ['spades', 'hearts', 'clubs', 'diamonds']
ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']

def deal():
    deck = []
    for suit in suits:
        for rank in ranks:
            deck.append((rank, suit))
    random.shuffle(deck)
    # you don't need to search for the card. It is at index 0
    # grab, remove and return the card (not the deck) in one go:
    return deck.pop(0)

card = deal() # remember the dealt card
print card

def value_of_card(deal):
    return deal[0]

print value_of_card(card) # pass the remembered card
下面是如果你让它更面向对象,它会是什么样子:

import random

class Card:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        return self.rank + ' of ' + self.suit

class Deck:
    def __init__(self):
        suits = ['spades', 'hearts', 'clubs', 'diamonds']
        ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']
        self.__deck = [Card(rank, suit) for suit in suits for rank in ranks]

    def shuffle(self):
        random.shuffle(self.__deck)

    def deal(self):
        return self.__deck.pop()

# Create a deck of 52 cards
deck = Deck()

# Shuffle the deck
deck.shuffle()

# Pull a card from the deck
card = deck.deal()

# Show the card
print(card) # this calls the __repr__ method

# ..or only the rank:
print(card.rank)
一些问题:

  • 将函数引用传递给卡的值,而不是传递该函数返回的值
  • 您的交易功能不会返回一张卡,而是返回剩余卡的牌组。您不应该
    return deck
    ,而应该
    return deal
  • 对所选卡片的搜索(使用
    搜索
    循环)不是必需的:您从索引0中获取了该卡片,因此只需删除索引0处的卡片(使用
    弹出(0)
以下是更正后的脚本:

import random

suits = ['spades', 'hearts', 'clubs', 'diamonds']
ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']

def deal():
    deck = []
    for suit in suits:
        for rank in ranks:
            deck.append((rank, suit))
    random.shuffle(deck)
    # you don't need to search for the card. It is at index 0
    # grab, remove and return the card (not the deck) in one go:
    return deck.pop(0)

card = deal() # remember the dealt card
print card

def value_of_card(deal):
    return deal[0]

print value_of_card(card) # pass the remembered card
下面是如果你让它更面向对象,它会是什么样子:

import random

class Card:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        return self.rank + ' of ' + self.suit

class Deck:
    def __init__(self):
        suits = ['spades', 'hearts', 'clubs', 'diamonds']
        ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']
        self.__deck = [Card(rank, suit) for suit in suits for rank in ranks]

    def shuffle(self):
        random.shuffle(self.__deck)

    def deal(self):
        return self.__deck.pop()

# Create a deck of 52 cards
deck = Deck()

# Shuffle the deck
deck.shuffle()

# Pull a card from the deck
card = deck.deal()

# Show the card
print(card) # this calls the __repr__ method

# ..or only the rank:
print(card.rank)

deal
中,生成一整副牌来弹出第一副牌似乎有点浪费(当然,如果你继续从牌堆中重新处理,那就不同了)。。。当然,也可以只做
card=random.choice(套装),random.choice(等级)
@JonClements,但是OP对牌组有更多的计划,然后只抽一张牌。看他问题的第一句话非常感谢您的帮助和小小的指导!我总是忘记当你创建一个函数时,你必须用一个变量来调用这个函数…doh!谢谢你,我能够重新编写一些代码行来实现我想做的事情,不管怎么说,它开始变得更有意义:)在
deal
中生成一整副牌来弹出第一副牌似乎有点浪费(当然,如果你继续从牌堆中重新处理,那就不同了)。。。当然,也可以只做
card=random.choice(套装),random.choice(等级)
@JonClements,但是OP对牌组有更多的计划,然后只抽一张牌。看他问题的第一句话非常感谢您的帮助和小小的指导!我总是忘记当你创建一个函数时,你必须用一个变量来调用这个函数…doh!谢谢,我能够重新编写一些代码行来实现我想要做的事情,不管怎样,它开始变得更有意义:)