2015-12-14 5 views
1

У меня есть эта игра линкора, которая выводит сетку (строка 5 'o напечатана 5x) и генерирует случайную точку для угадывания пользователем.Ошибка типа при попытке распечатать номер строки

Эти строки: 16-20

""" Allows the function to print row by row """ 
    def print_board(board): 
     for row in board: 
      for x in enumerate(row): 
       print('%s " ".join(row)' % (x)) 

я получаю эти ошибки. Но это было только после того, как я изменил линию 20, чтобы напечатать номер рядом с напечатанной сеткой (http://imgur.com/uRyMeLU) картина там

Traceback (most recent call last): File "C:\Users\Jarrall\pythonPrac\battleship.py", line 23, in <module> 
    print_board(board) File "C:\Users\Jarrall\pythonPrac\battleship.py", line 20, in print_board 
    print('%s " ".join(row)' % (x)) TypeError: not all arguments converted during string formatting 

Как бы я получить этот кусок кода, чтобы напечатать номер (перечисляя длину списка строк ?) рядом с сеткой?

+0

Просто fyi, ваша docstring должна быть * внутри * функции после подписи и отступов на том же уровне, что и внешний 'for'. – jpmc26

ответ

0

Принимая догадку из вашей трассировки стека, я бы сказал, что вам нужно, чтобы привести переменную х в строку, как это:

print('%s " ".join(row)' % (str(x))) 
1

вы используете enumerate неправильно. Я не совсем уверен, но он смотрит на меня, как вы хотите, чтобы напечатать что-то вроде:

0 0 0 0 0 0 
1 0 0 0 0 0 
2 0 0 0 0 0 
3 0 0 0 0 0 
4 0 0 0 0 0 

Это может быть сделано путем enumerate(board) с момента enumerate возвращает индекс и итераторов:

def print_board(board): 
    for index,row in enumerate(board): 
     print('{} {}'.format(index, ' '.join(row)) 

Так что вы можете получить:

>>> board = [['0' for _ in range(5)] for __ in range(5)] 
>>> print_board(board) 
0 0 0 0 0 0 
1 0 0 0 0 0 
2 0 0 0 0 0 
3 0 0 0 0 0 
4 0 0 0 0 0 

EDIT - добавить, почему ваш текущий print заявление необходимо некоторое Fixin':

Ваш print заявление не делает то, что вы ожидали от него. Давайте пройдем через него:

print('%s " ".join(row)' % (x)) 
    #'    ' will create a string literal. This is obvious. 
    # %s    a string formatting token meaning to replace with a string 
    #     % (x) the replacement for any of the string formatting 
    # " ".join(row) this is your vital flaw. Although this is valid code, the print 
    #     statement will print this as literally `" ".join(row) 
    #     rather than actually running the code. 

Вот почему вам необходимо изменить его:

print('{} {}'.format(index, ' '.join(row)) 
#shout-out to jpmc26 for changing this 

Это заменяет все экземпляры {} с аргументами, приведенными в format. Вы можете узнать больше о мини-языке, который связан с форматированием строки here

+0

Я сделал редактирование на вызов 'print', поскольку он не совместим с Python 2.7 (хотя он работал в Python 3.x). Вы также можете упомянуть что-то о различиях с командой 'print', так как OP казалась путаной в том, как использовать форматирование строк. – jpmc26

+0

@ jpmc26 Спасибо за редактирование, сейчас редактируем, чтобы добавить объяснения.Случайно нажал на поле загрузки прав в середине моего редактирования и потерял все, что у меня уже было *, почему я должен делать это сам с собой * –

0

Метод перечисления Python возвращает кортеж из 0-индексированных целых чисел вместе со значением списка. Поэтому вместо того, чтобы просто быть значением в строке, ваша переменная x на самом деле (целое число, строка). Если вы просто хотите, чтобы напечатать список целых чисел, изменить свой внутренний цикл на следующее:

for x,y in enumerate(row): 
    print('%s " ".join(row)' % (x)) 

Это должно решить вашу проблему. Если вы хотите получить более конкретный ответ, укажите, что именно вы пытаетесь сделать вместе с переменной строки.