Итак, у меня проблема. У меня есть кортеж (1,2,3), который я должен распечатать с форматированием строки. например.
tup = (1,2,3)
print "this is a tuple %something" % (tup)
и это должно печатать представление кортежа в скобках, например
Это кортеж (1,2,3)
Но я получаю TypeError: not all arguments converted during string formatting
вместо этого.
Как я могу это сделать? Типа проиграл здесь, так что если вы, ребята, можете указать мне правильное направление :)
print(....)
.Обратите внимание, что
%
синтаксис устарел. Используйтеstr.format
, что проще и читабельнее:источник
%
устарело, но теперь я всеstr.format
равно всегда слепо. Неважно, меня интересует, что такое полный квалификатор, потому что простой{0}
- это не полный квалификатор, а просто индикатор позиции. Для an тоint
, что я называю полным квалификатором, будет{0:d}
(или,{3:d}
например, если int, который нужно напечатать, находится в 4-й позиции вstr.format
методе). Я пробовал распечатать кортеж с использованием{0:s}
квалификатора, но это не сработало. Итак, каков полный квалификатор для чего-то вроде кортежа?str
вы можете сказать{!s}
, но это значение по умолчанию, поэтому в этом нет необходимости. Если вы хотите использоватьrepr
вместо этого, вы можете это сделать{!r}
. В отличие от with%
,d
для целых чисел нет необходимости говорить .%
не полностью устарел. Фактически,pylint
даже будет жаловаться, если вы используете.format
синтаксис внутриlogging
модуля: stackoverflow.com/a/34634301/534238Многие ответы, данные выше, были правильными. Правильный способ сделать это:
Однако возник спор о том,
'%'
устарел ли оператор String. Как отмечали многие, он определенно не устарел, поскольку'%'
оператор String легче комбинирует оператор String со списком данных.Пример:
Однако, используя
.format()
функцию, вы получите подробный оператор.Пример:
Более того,
'%'
строка оператор также полезен для нас , чтобы проверить тип данных , такие как%s
,%d
,%i
, в то время как .format () поддерживает только два флага преобразования :'!s'
и'!r'
.источник
.format
:tup = (1,2,3); print('First: {}, Second: {}, Third: {}'.format(*tup))
.Обратите внимание, что
(tup,)
это кортеж, содержащий кортеж. Внешний кортеж - это аргумент оператора%. Внутренний кортеж - это его содержимое, которое фактически печатается.(tup)
- это выражение в скобках, которое при вычислении даетtup
.(tup,)
с конечной запятой - это кортеж, который содержитtup
только член.источник
Это не использует форматирование строки, но вы должны уметь:
Если вы действительно хотите использовать форматирование строк:
Обратите внимание, это предполагает, что вы используете версию Python более раннюю, чем 3.0.
источник
источник
Несмотря на то, что этот вопрос довольно старый и имеет много разных ответов, я все же хотел бы добавить imho самый «питонический», а также читаемый / краткий ответ.
Поскольку общий
tuple
метод печати уже правильно показан Antimony, это дополнение для печати каждого элемента в кортеже отдельно, как правильно показал Фонг Ках Чун с%s
синтаксисом.Интересно, что это было упомянуто только в комментарии, но использование оператора звездочки для распаковки кортежа дает полную гибкость и удобочитаемость с использованием
str.format
метода при печати элементов кортежа отдельно .Это также позволяет избежать печати конечной запятой при печати одноэлементного кортежа, что обходится Jacob CUI с помощью
replace
. (Несмотря на то, что imho представление конечной запятой является правильным, если вы хотите сохранить представление типа при печати ):источник
Я думаю, что лучший способ сделать это:
Если вы знакомы с printf форматированием стиля , то Python поддерживает собственную версию. В Python это делается с помощью оператора «%», применяемого к строкам (перегрузка оператора по модулю), который принимает любую строку и применяет к ней форматирование в стиле printf.
В нашем случае мы говорим ему напечатать «Это кортеж:», а затем добавляем строку «% s», а для фактической строки мы передаем строковое представление кортежа (вызывая str ( т)).
Если вы не знакомы с форматированием стиля printf, я настоятельно рекомендую изучить его, поскольку оно очень стандартно. Большинство языков так или иначе его поддерживают.
источник
Обратите внимание, что в конце будет добавлена запятая, если в кортеже есть только один элемент. например:
и вы получите:
в некоторых случаях, например, вы хотите получить список в кавычках для использования в строке запроса mysql, например
вам нужно подумать об удалении хвостовой запятой, используйте replace (',)', ')') после форматирования, потому что возможно, что в кортеже есть только 1 элемент, например ('Tom',), поэтому хвостовую запятую необходимо удалить:
Подскажите, пожалуйста, есть ли у вас достойный способ удалить эту запятую в выводе.
источник
format()
в запросах к базе данных. Для этого есть подходящие методы в каждой библиотеке.format()
со значениями, полученными от пользователей, может привести к внедрению SQL. Более безопасно проверять входные значения перед их вводом в запрос. См. Эти рекомендации для получения дополнительной информации: dev.mysql.com/doc/connector-python/en/ ... Вы также можете преобразовать значения параметров в строковое представление типа базы данных, а затем вставить его в строку запроса. Взгляните на initd.org/psycopg/docs/usage.html, где у вас есть контрпример с%
оператором и решение сexecute()
методом, в котором параметры запроса передаются в аргументах метода.Помимо методов, предложенных в других ответах, начиная с Python 3.6, вы также можете использовать интерполяцию литеральной строки (f-строки):
источник
Попробуйте это, чтобы получить ответ:
Если мы поместим только один кортеж внутри (), он сам создаст кортеж:
Это означает, что приведенный выше оператор печати будет выглядеть так: print ("Value:% s"% ('1', '2')), что является ошибкой!
Следовательно:
Выше будет правильно передано аргументам печати.
источник
Для Python 3
источник
Вы также можете попробовать это;
Вы не можете использовать
%something
with(tup)
только из-за концепции упаковки и распаковки с помощью кортежа.источник
Обсуждение дешево, покажите код:
источник