Подтвердить что ты не робот

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

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

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

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

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be str, not int

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

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

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

4b9b3361

Ответ 1

Проблема заключается в том, что оператор + имеет (по крайней мере) два разных значения в 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-strings зависит от вас:% интерполяция была самой длинной (и знакома людям с фоном на C), str.format() часто более мощный, а f-строки еще более мощные (но доступны только в Python 3.6 и более поздних версиях).

Другой альтернативой является использование того факта, что если вы дадите print несколько позиционных аргументов, они будут объединены в свои представления строк вместе с использованием аргумента ключевого слова 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 На самом деле четыре... но строки шаблона редко используются и несколько неудобны.

Ответ 2

TL; DR

  • : print("You have " + str(things) + " things.") (старый школьный путь)

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


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

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

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

Ответ 4

str.format()

Другой альтернативой является использование метода str.format() для объединения int в String.

В твоем случае:

замещать

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

С

print("You have {} things".format(things))

Бонус: для множественного объединения

если у вас есть

first = 'rohit'
last = 'singh'
age = '5'
print("My Username is {}{}{}".format(first,age,last))

Ответ 5

Один из самых простых способов обойти эту проблему (это был вопрос, не так ли?), чтобы привыкнуть к конкатенации любых объектов в строку с помощью запятой (',') как оператор конкатенации. Это хорошо работает с 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.")

Ответ 6

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

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

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