嗯,我也看到过其他人也会犯这个错误,但我不知道我的错误是什么。
我明白了:
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下面是我的代码:(Python3.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))`这是一个简单的21点游戏,大多数初学者在python中制作,我希望代码上的注释能帮助您理解它。
我的错误应该是愚蠢的,只要我是新的语言,但我希望你会帮助我。唯一的问题是..。当节目要求:
开始新游戏(n)还是继续以前的游戏(c)?
你给'c‘作为输入,它就会产生错误。
我在这个网站上找到了这个方法,所以我可能不会正确地使用它:
combined = list(zip(symbols,deck))
shuffledDeck(combined)
symbols[:], deck[:] = zip(*combined)提前谢谢!
更新!
有没有办法显示字母'A‘(代表ace)而不是11个?
例如:
你得到的是♡而不是 你有11♡
发布于 2014-12-17 00:37:54
您已经用字符串覆盖了内置的list函数:
list=l.pop()要解决这个问题,请使用不同的变量名,而不是list。通常,在命名变量时,您希望避免隐藏内置的内容。也就是说,不要将事物命名为list、map、dict等。
这也是一个很好的实践,就是用变量的名字来命名变量。因此,如果您有list = ["apples", "oranges", "pears"],可以考虑将它重命名为fruits = ["apples", "oranges", "pears"]。它确实有助于提高代码的可读性。
发布于 2014-12-17 00:36:19
您已经将list定义为字符串:
list=l.pop()所以
list(zip(symbols,deck))导致Python抱怨list不可调用。
当然,解决方案是使用不隐藏Python内置的描述性变量名称。
发布于 2018-05-22 01:16:04
最近在我身上发生了这种情况,我试图调用在另一个函数中定义的函数,但没有注意到在调用函数中也有一个局部变量,其名称与我试图调用的函数的名称相同。
由于作用域规则,对函数的调用被解释为调用本地variable...hence,因为类型为'str‘的标量变量(例如)是不可调用的。
因此,问题的本质是变量共享您需要在其范围内调用的函数的名称,无论它们是您定义的函数、导入模块中包含的函数还是Python内置的函数。
https://stackoverflow.com/questions/27516482
复制相似问题