1. ホーム
  2. python

[解決済み] strとintのオブジェクトを連結する方法は?

2023-06-17 19:35:26

質問

以下のようにすると

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

Python3.xで以下のエラーが発生します。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

... Python 2.xでも同様のエラーが発生します。

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

この問題を回避するにはどうしたらよいでしょうか?

どのように解決するのですか?

ここで問題となるのは + 演算子はPythonでは(少なくとも)2つの異なる意味を持っています:数値型の場合、それは "数字を一緒に足す" を意味します。

>>> 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は2つの異なるタイプのシーケンスを連結することを許しません。

>>> [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を使用しているかによって、3つの異なる種類の文字列フォーマットが利用できます 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-strings はさらに強力です(ただし、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 実際には4つですが テンプレート文字列 はほとんど使われず、やや厄介です。


その他のリソース