[解決済み] strとintのオブジェクトを連結する方法は?
質問
以下のようにすると
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つですが テンプレート文字列 はほとんど使われず、やや厄介です。
その他のリソース
関連
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] 文字列をfloatやintにパースするにはどうしたらいいですか?
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Python: TypeError: cannot concatenate 'str' and 'int' objects [duplicate] Python: TypeError: cannot concatenate 'str' and 'int' object [duplicate
-
[解決済み】PythonのTypeErrorはintではなくstrでなければならない【重複あり
-
[解決済み] サポートされていないオペランド型(複数可): 'int' および 'str' [重複].
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] Pythonでコード行間にかかる時間を測定するには?
-
[解決済み] PythonでSVGからPNGに変換する
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する