Как я могу конкатенировать объекты str и int?

Если я попытаюсь сделать следующее:

things = 5 print("You have " + things + " things.") 

Я получаю следующую ошибку в Python 3.x:

 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Can't convert 'int' object to str implicitly 

… и аналогичная ошибка в Python 2.x:

 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects 

Как я могу обойти эту проблему?

5 Solutions collect form web for “Как я могу конкатенировать объекты str и int?”

Проблема здесь в том, что оператор + имеет (по крайней мере) два разных значения в Python: для числовых типов это означает «добавить числа вместе»:

 >>> 1 + 2 3 >>> 3.4 + 5.6 9.0 

… и для типов последовательностей, это означает «объединить последовательности»:

 >>> [1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] >>> 'abc' + 'def' 'abcdef' 

Как правило, Python не подразумевает конвертацию объектов из одного типа в другой 1 , чтобы сделать операции «понятными», потому что это будет путать: например, вы можете подумать, что '3' + 5 должно означать '35' , но кто-то может подумать, что это должно означать 8 или даже '8' .

Аналогично, Python не позволит вам объединить два разных типа последовательности:

 >>> [7, 8, 9] + 'ghi' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate list (not "str") to list 

Из-за этого вам нужно явно выполнить преобразование, нужно ли конкатенация или добавление:

 >>> 'Total: ' + str(123) 'Total: 123' >>> int('456') + 789 1245 

Однако есть лучший способ . В зависимости от используемой версии Python существует три различных типа форматирования строк 2 , которые не только позволяют избежать нескольких операций:

 >>> things = 5 

 >>> 'You have %d things.' % things # % interpolation 'You have 5 things.' 

 >>> 'You have {} things.'.format(things) # str.format() 'You have 5 things.' 

 >>> f'You have {things} things.' # f-string (since Python 3.6) 'You have 5 things.' 

… но также позволяет вам контролировать, как отображаются значения:

 >>> value = 5 >>> sq_root = value ** 0.5 >>> sq_root 2.23606797749979 

 >>> 'The square root of %d is %.2f (roughly).' % (value, sq_root) 'The square root of 5 is 2.24 (roughly).' 

 >>> 'The square root of {v} is {sr:.2f} (roughly).'.format(v=value, sr=sq_root) 'The square root of 5 is 2.24 (roughly).' 

 >>> f'The square root of {value} is {sq_root:.2f} (roughly).' 'The square root of 5 is 2.24 (roughly).' 

Если вы используете % интерполяцию , str.format() или f-строки зависит от вас:% интерполяция была самой длинной (и знакома людям с фоном на C), str.format() часто более эффективен , а f-строки еще более мощные (но доступны только в Python 3.6 и более поздних версиях).

Другой альтернативой является использование того факта, что, если вы даете многократные позиционные аргументы, он будет объединяться с их строковыми представлениями вместе с использованием аргумента ключевого слова sep (который по умолчанию равен ' ' ):

 >>> things = 5 >>> print('you have', things, 'things.') you have 5 things. >>> print('you have', things, 'things.', sep=' ... ') you have ... 5 ... things. 

… но это обычно не так гибко, как использование встроенных возможностей форматирования строк Python.


1 Хотя он делает исключение для числовых типов, где большинство людей соглашатся на «правильную» вещь:

 >>> 1 + 2.3 3.3 >>> 4.5 + (5.6+7j) (10.1+7j) 

2 На самом деле четыре … но строки шаблонов редко используются и несколько неудобны.

TL; DR

  1. либо: print("You have " + str(things) + " things.") (старая школа)

  2. или: print("You have {} things.".format(things)) (новый питон и рекомендуемый способ)


Немного более словесное объяснение:
Хотя на отличном ответе @Zero Piraeus есть что-то, что не покрыто, я попытаюсь немного его «минимизировать» :
Вы не можете конкатенировать строку и число (любого вида) в python, потому что эти объекты имеют разные определения оператора плюса (+), которые несовместимы друг с другом (в случае str + используется для конкатенации, в числовом случае он используется для добавления двух чисел вместе). Поэтому, чтобы решить это «непонимание» между объектами:

  1. Старая школьная дорога заключается в том, чтобы вывести число в строку с помощью метода str(anything) а затем объединить результат с другой строкой.
  2. Чем больше pythonic и рекомендуется использовать метод формата, который очень универсален (вам не нужно об этом говорить, прочитайте документацию и эту статью)

Получайте удовольствие и прочитайте @Zero Piraeus ответ, это, безусловно, стоит вашего времени!

Один из самых простых способов обойти эту проблему (это был вопрос, не так ли?), Чтобы привыкнуть к конкатенации любых объектов в строку, используя запятую (',') в качестве оператора конкатенации . Это хорошо работает с print (), и если это недостаточно для того, чтобы избежать пробелов в вставках print (), просто используйте функцию myprint (), приведенную ниже. Другим удобным инструментом будет функция concatByComma (), которая возвращает соответствующую строку.

Просто запустите код ниже и получайте удовольствие 🙂

 def myprint(*arg): strToPrint = "" for item in arg: strToPrint += str(item) print(strToPrint) def concatByComma(*arg): strToPrint = "" for item in arg: strToPrint += str(item) return strToPrint I = "I"; i=5 print(I, " am " , i , " years old") print(('s','o', I),[' wrote','it:'],' ',{1:'hour'},'and',5," min.") myprint(('s','o', I),[' wrote','it:'],' ',{1:'hour'},'and',5," min.") 

Python 2.x

  1. 'You have %d things.' % things 'You have %d things.' % things [ 1 ]
  2. 'You have {} things.'.format(things) [ 2 ]

Python 3.6+

  1. 'You have %d things.' % things 'You have %d things.' % things [ 1 ]
  2. 'You have {} things.'.format(things) [ 2 ]
  3. f'You have {things} things.' [ 3 ]

Справка

  1. Форматирование строк в стиле printf
  2. Встроенные типы -> str.format
  3. Форматированные строковые литералы

Почему не просто?

 things = 5 print("You have " + str(things) + " things.") 

которые работают как на python 2, так и на python 3

Python - лучший язык программирования в мире.