Ответ 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 На самом деле четыре... но строки шаблона редко используются и несколько неудобны.