我如何修复TypeError:'str'对象不可调用?

时间:2014-12-17 00:32:25

标签: python list python-3.x zip blackjack

我已经看到这个错误发生在其他人身上,但我无法弄清楚我的错误是什么。

我明白了:

Traceback (most recent call last):
File "C:\Users\Bill\Desktop\Finalizing_2.1(DEVELOPING).py", line 100, in <module>
combined = list(zip(symbols,deck))
TypeError: 'str' object is not callable

这是我的代码:(Python 3.x)

import random #shuffle
import os#file deleting

def shuffledDeck(deck):#shuffles ceck
    random.shuffle(deck)

def dealCard(deck,participant):#deal cards , chooses between player and house with string z
    participant.append(deck.pop())
    if z==1:
        print('\nYou got  %s ' %("{} {}".format(player[len(player)-1],symbols.pop()))) 
    else:
        print('\nHouse got %s ' %("{} {}".format(house[len(house)-1],symbols.pop())))

def total(hand):#chooses between player and house with string z and displays total
    y =sum(hand)
    if z==1:
        print('Your total now is :',y)
    else:
        print('House total now is :',y)

def compareHands(house, player):  #compares players and house's hand totals
    global wallet 
    global bet
    global bank
    if sum(house)>sum(player):
        print('You Lose :(')

        wallet += bet
        bank -= bet
        prw = False
    elif sum(house)<sum(player):
        print('You Win!')

        wallet += bet
        bank -= bet
        prw = True
    elif sum(house)==sum(player):
        print('DRAW!')

def printHistory(history):  #  prints history.txt
    if history=='h':
        f = open('history.txt')
        for l in f:
            print(l,end='') 


# r=0           # last game
row = 1         #  times a game was played
bank = 10       # starting value
exit = False    # making sure the game won't exit if the user doesn't want to
newGame = True

#  defy if it is a new game or the previous had been canceled
try:
   f=open('history.txt')
   print('\n________________________ \nHistory File Available')
   newGame=False#it is not a new game
except FileNotFoundError:
    print('Creating History File..')
    f=open('history.txt','w')
    newGame=True#it is a new game
if newGame==False:#if it is not a new game
    answer=input('Start new game (n) or continue previous game (c)?')#ask 
    if answer=='n':
        f.close()
        os.remove('history.txt')
        f=open('history.txt','w')
    elif answer=='c':
        f=open('history.txt')
        l=f.readlines()
        list=l.pop()
        splitlist=list.split()
        row=int(splitlist[0])
        bank=int(splitlist[5])

print('========================')#begining game

Done=iter([True, False])
while bank>0 and exit==False and (bank <30 or next(Done)):#if bank<0 bank looses so the loop brakes


deck=[2,2,2,2,3,3,3,3,4,4,4,4,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11]
symbols=['\u2660', '\u2661', '\u2662', '\u2663','\u2660', '\u2661', '\u2662', '\u2663','\u2660', '\u2661', '\u2662', '\u2663','\u2660', '\u2661', '\u2662', '\u2663','\u2660', '\u2661', '\u2662', '\u2663','\u2660', '\u2661', '\u2662', '\u2663','\u2660', '\u2661', '\u2662', '\u2663','\u2660', '\u2661', '\u2662', '\u2663']


wallet = 0 #Money player won
prw = False #Player Won
player = []
house = []
bet = 0
z = 1 #to choose player or house in totalHand()
loop = True #Enter Houses loop
#out2=1#loopbrake2
Round = 2 #Rounds played(used in 5 cards combination)


#  shuffle both deck and symbols the same way
combined = list(zip(symbols,deck))
shuffledDeck(combined)
symbols[:], deck[:] = zip(*combined)

#player
dealCard(deck,player)
bet = int(input('Place your bet: '))
while bet > bank:
    print('Your bet should not be higher than bank\nplease try again >>>')
    bet = int(input('Place your bet: '))
dealCard(deck,player)
total(player)


#checking
if sum(player) == 22: #double ace
    print('You win (Α-Α)!!')

    wallet += bet
    bank -= bet
    loop = False
    prw = True
elif sum(player)==21:
    print('You win!!')

    wallet += bet
    bank -= bet
    loop = False
    prw = True
else:
    action = input('Hit (h) or stand (s)?: ')
    while action == 'h' and sum(player) <= 21 and prw == False:
        dealCard(deck, player)
        total(player)
        Round += 1     # 5 cards combination

        if player[0] == 7 and player[1] == 7 and player[2] == 7:
            print('You win (Σκουπα)!!')

            wallet += bank
            bank -= bank
            loop = False
            prw = True
            exit = True
        elif Round == 5 and sum(player) <= 21:
            print('You win! (Πενταφυλλια)')

            wallet += bet
            bank -= bet
            loop = False
            prw = True
        elif sum(player) == 21:
            print('You win (21)!!')

            wallet += bet
            bank -= bet
            loop = False
            prw = True
        elif sum(player) < 21:
            action = input('Hit (h) or stand (s)?: ')
        elif sum(player) > 21:
            print('You Lose :( ')

            wallet -= bet
            bank += bet
            loop = False
            pwd = False




#houses turn
if loop is True:
    z=0
    dealCard(deck,house)

    total(house)
    while sum(house)<17:
        dealCard(deck,house)
        total(house)


    #comparison
    if sum(house)<=21:
        if house[0] == 7 and house[1] == 7 and house[2] == 7:
            print('You Lose :( (7-7-7)')

            wallet = 0
            bank += bet
            pwd = False
            exit = True         
        elif sum(house) == 21:
            print('You Lose :( ')

            wallet -= bet
            bank += bet
            pwd = False
        else:
            compareHands(house,player)
    elif sum(house)>21:
        print('You Win!')

        wallet += bet
        bank -= bet
        prw = True

print("Bank's balance now is", bank)
if sum(house) == sum(player):
    winner = 'DRAW'
elif prw is False:
    winner = 'House'
elif prw is True:
    winner = 'Player'


#updating history.txt file
if row==1:
    f=open('history.txt','r+')
    f.write('%-*s%-*s%-*s%-*s%-*s %-*s'%  (10,'Round',15,'Bet($)',10,'Player',10,'House',15,'Winner',10,'Bank($)'))
    f.close()
    f=open('history.txt','a')
    f.write('\n%-*s%-*s%-*s%-*s%-*s %-*s'%(10,row,15,bet,10,sum(player),10,sum(house),15,winner,10,bank))
    row+=1
    f.close()
else:
    f=open('history.txt','a')
    f.write('\n%-*s%-*s%-*s%-*s%-*s %-*s'%      (10,row,15,bet,10,sum(player),10,sum(house),15,winner,10,bank))
    row+=1
    f.close()


#display history and other actions
history=input('\nContinue(c), print history (h) or exit game (x)?')
while history=='h':
    printHistory(history)
    history=input('\nContinue(c), print history (h) or exit game (x)?')
if history=='c':
    exit=False
else:
    exit=True


#game overview
print('Game Over')
if bank==0:
    print('Player has won $10')
elif bank>10:
    print('Player has lost %d$'%(bank-10))`

这是一个简单的二十一点游戏,大多数初学者在python中制作我希望对代码的评论能帮助你理解它。

只要我是语言新手,我的错误应该是愚蠢的,但我希望你能帮助我。 它运行应该唯一的问题是...... 当程序问:

开始新游戏(n)或继续上一场比赛(c)?

你给&#39; c&#39;作为输入,它给出了错误。

我在这个网站上找到了这个方法,所以我可能不会正确使用它:

combined = list(zip(symbols,deck))
shuffledDeck(combined)
symbols[:], deck[:] = zip(*combined)
  • 对代码的任何改进都是可以接受的。

提前致谢!

UPDATE!

有没有办法显示字母&#39; A&#39; (代表王牌)代替11?

例如

  
    
      

你有A♡       而不是

             

你有11♡

    
  

3 个答案:

答案 0 :(得分:3)

您已使用字符串覆盖了内置list函数:

list=l.pop()

要解决此问题,请使用list以外的其他变量名称。通常,在命名变量时,您需要避免隐藏内置函数。也就是说,不要将内容命名为listmapdict等。

将变量命名为其中的变量也是一种好习惯。因此,如果您有list = ["apples", "oranges", "pears"],则可以考虑将其重命名为fruits = ["apples", "oranges", "pears"]。它确实有助于代码可读性。

答案 1 :(得分:1)

您已将list定义为字符串:

list=l.pop()

所以

list(zip(symbols,deck))

导致Python抱怨list不可调用。

当然,解决方案是使用不影响Python内置函数的描述性变量名称。

答案 2 :(得分:0)

最近我发生了这种情况,我试图调用我在另一个函数中定义的函数,但是没有注意到我在调用函数中也有一个局部变量与我试图调用的函数同名。

由于范围规则,对函数的调用被解释为调用局部变量...因此错误消息是因为类型&#39; str&#39;的标量变量。 (例如)不可调用。

因此问题的实质是变量共享您需要在其范围内调用的函数名称,无论它们是您定义的函数,还是导入模块中包含的函数或Python内置函数。