2015-01-19 2 views
2

я пытался получить сумму списка, который изменил свои значения из строки в целое, используя функциюВНУТР объект не Iterable

player_hand = [] 

def card_type(player_hand): 
card_value = 0 
if player_hand[0] == 'A': 
    card_value = 11 
if player_hand[0] == 'J': 
    card_value = 10 
if player_hand[0] == 'Q': 
    card_value = 10 
if player_hand[0] == 'K': 
    card_value = 10 

if player_hand[0] == '2': 
    card_value = 2 
if player_hand[0] == '3': 
    card_value = 3 
if player_hand[0] == '4': 
    card_value = 4 
if player_hand[0] == '5': 
    card_value = 5 
if player_hand[0] == '6': 
    card_value = 6 
if player_hand[0] == '7': 
    card_value = 7 
if player_hand[0] == '8': 
    card_value = 8 
if player_hand[0] == '9': 
    card_value = 9 
if player_hand[0] == '1': 
    card_value = 10 

def player_hit(card_deck): 
rando = random.randint(0,len(card_deck)-1) 
player_hand.append(card_deck[rando]) 
card_deck.remove(card_deck[rando]) 

, а затем попытаться найти сумму списка игроков используя

card_total = 0 

print('Player was handed:') 
for i in range(2): 
    print(player_hit(card_deck)) 

for i in len(player_hand)-1: 
    print('\n',sum(card_type(player_hand[i]))) 

однако я получаю сообщение об ошибке

for i in len(player_hand)-1: 
TypeError: 'int' object is not iterable 

я не понимаю, что проблема в том, что ив взял Валу es и преобразовали их в int уже, а также проверили диапазон индекса списка. Пожалуйста, помогите

ответ

8

len(player_hand) - 1 - всего лишь целое число, но написанный вами код пытается перевернуть его. Для выполнения цикла for необходим итерируемый объект. Попробуйте это:

for i in range(len(player_hand)): 
    # do your thing here 

Альтернативой будет итерация непосредственно над player_hand, так как это итерацию, так же, как это:

for card in player_hand: 
    print('\n', card_type(card)) 
+2

Это правильно диагностирует ошибку. Тем не менее, вопросник должен отметить, что функция 'card_type' ожидает последовательность символов (« рука »), а не один символ, который вы передаете. Это будет действительно работать, поскольку даже одна символьная строка является типом последовательности, но это говорит о том, что дизайн немного испорчен (вероятно, «card_type» должен ожидать одну карту в качестве своего аргумента и пропустить индексирование «[0]») , Кроме того, 'player_hit' возвращает' None' (поскольку нет операторов 'return'), но вы печатаете результат. – Blckknght

+0

@Blckknght, вы правы, может быть, вам стоит написать ответ. – VHarisop

-1

Вот объектно-ориентированная версия, которая может быть проще работать с:

from random import shuffle 

card_value = { 
    "A": 11, "J": 10, "Q": 10, "K": 10, "1": 10, 
    "9": 9,  "8": 8,  "7": 7,  "6": 6,  "5": 5, 
    "4": 4,  "3": 3,  "2": 2 
} 

class Deck: 
    def __init__(self): 
     self.d = list(card_value) * 4 
     shuffle(self.d) 

    def hit(self): 
     return self.d.pop() 

class Player: 
    def __init__(self, name): 
     self.name = name 
     self.hand = [] 

    def hit(self, deck, num=1): 
     for i in range(num): 
      self.hand.append(deck.hit()) 

    def hand_value(self): 
     return sum(card_value[card] for card in self.hand) 

    def __str__(self): 
     return "{}: {} ({} points)".format(self.name, "".join(self.hand), self.hand_value()) 

def main(): 
    print("Fresh deck!") 
    deck = Deck() 
    # deal 3 cards to player 1 and show the result 
    p1 = Player("Charles") 
    p1.hit(deck, 3) 
    print(p1)  # Charles: Q96 (25 points) 

if __name__ == "__main__": 
    main() 

 Смежные вопросы

  • Нет связанных вопросов^_^