2017-02-11 14 views
0

Desired outputDesired outputvariant Не может найти то, что случилось с этим битом кода Python:TypeError: не все аргументы преобразуются во строке форматирования операции

print('%-*s', low, '%-*s', mid, ' %-*s', high, '%-*s' 
     % (8, "", (var_range//3), "", (var_range//3), "", (var_range//3), "")) 

Я пытаюсь пространство переменных: low, mid и high на основе ввода от пользователя (var_range//3). (Var_range // 3) действует как настраиваемый интервал. Я хочу, чтобы выход изменялся в зависимости от диапазона пользователем

P.S. Я использую Python 3.4.4

+0

'%' _operator_ ожидает, что строка форматирования будет содержать столько '%' _formatting спецификаторов, что и в кортеже после нее. В вашем фрагменте кода используемая строка форматирования - это только последний ''% - * s'', но кортеж, следующий за ним, содержит 8 вещей ('(8," ", (var_range // 3)," ", (var_range // 3), "", (var_range // 3), "") '). – martineau

+0

Когда я использую только 4 вещи: (8, (var_range // 3), (var_range // 3), (var_range // 3))), та же ошибка существует –

+0

Строка формата ''% - * s'' только ожидайте, что один элемент будет указан, потому что _that строка содержит только символ ''% '(не 8 или даже 4). Возможно, вам будет проще использовать метод ['str.format()'] (https://docs.python.org/3/library/stdtypes.html#str.format), который не использует ''% ' 'персонажей вообще. Я думаю, вы сбиваете с толку тот факт, что они используются для двух разных вещей здесь: как строка _operator_ **, так и **, что этот оператор ожидает в форматировании _string_, он передается как часть всего выражения. – martineau

ответ

0

Я не совсем уверен, что вывод, который вы пытаетесь произвести, но этот пример может помочь:

var_range = 99 
print('%*s %*s %*s' % (8, var_range//3, 8, var_range//3, 8, var_range//3)) 

Выход:

33  33  33 

Эта строка формата требует 3 пары значений для всего 6 в кортеже, который следует за ним. Первое значение каждой пары - это ширина поля (8 во всех трех случаях), а второе значение - отображаемое числовое значение (что также очень важно в том случае, если вы повторили var_range//3 три раза).

Я также изменил форматирование для каждого значения от '%-*s до '%*s, поэтому отображение значения является право-оправданием вместо выравнивания по левому краю шириной. Подробности см. На странице string formatting documentation.

+0

Я добавил фотографии желаемого вывода –

0

Использование newer style string formatting:

>>> var_range=24 
>>> print('{:<{fill}}{:<{fill}}{:<{fill}}'.format(2, 12, 22, fill=var_range//3)) 
     2  12  22  

Так как ваша картина одинакова для каждого, создать форматирование для одного поля и повторить его 3 раза.

>>> print(('{:>{fill}}' * 3).format(2, 12, 22, fill=var_range//3)) 
     2  12  22