Pythonでは文字列をつなげる+
と、同じ文字列を繰り返す*
がとてもよく使われます。
どちらも直感的ですが、数値との結合でのエラーや効率の落とし穴があります。
本記事では結合の基本から繰り返し、区切りの扱い、実用的なサンプルやつまずきの回避策まで、初心者の方にもわかりやすく丁寧に解説します。
Pythonの文字列結合の基本
+演算子の使い方
文字列の結合は+
で行います。
Pythonの文字列は不変(immutable)なので、結合すると新しい文字列が作られます。
変数を使った結合でも同様です。
# 基本的な結合
a = "Hello"
b = "World"
msg = a + " " + b # スペースも明示的に入れる
print(msg)
# 変数を含む結合
first = "Python"
second = "入門"
title = first + " " + second
print(title)
Hello World
Python 入門
注意点として、+
は自動でスペースを入れてくれません。
必要なら自分で" "
を挟みます。
スペースや改行を入れるコツ
文章を読みやすくするには、スペースや改行を適切に挿入します。
改行は"\n"
で表現します。
# スペースと改行の挿入
name = "Taro"
greeting = "Hello, " + name + "!\n" + "Welcome to Python."
print(greeting)
# 連続する長い文を読みやすく書く方法(丸括弧で改行)
long_msg = (
"これは長いメッセージです。" +
"途中で改行しても丸括弧の中なら1つの式として続けられます。" +
"最後に改行を入れます。\n"
)
print(long_msg)
Hello, Taro!
Welcome to Python.
これは長いメッセージです。途中で改行しても丸括弧の中なら1つの式として続けられます。最後に改行を入れます。
見た目のスペースは必ず明示的に書くと覚えると混乱が減ります。
数値と結合で起きるTypeError
文字列と整数などを直接+
で結合するとTypeErrorになります。
理由は文字列と数値は別の型であり、暗黙変換が行われないからです。
# これはエラーになります
age = 20
# print("年齢: " + age) # コメントを外すとTypeError
try:
result = "年齢: " + age # 故意にエラーを発生させる
except TypeError as e:
print("TypeErrorが発生:", e)
TypeErrorが発生: can only concatenate str (not "int") to str
- 関連記事:文字列と数値の型を変換したい
strで数値を文字列に変換
数値を結合したい場合はstr(数値)
で文字列に変換します。
これが最もシンプルな方法です。
age = 20
msg = "年齢: " + str(age) + "歳"
print(msg)
# 複数の数値を扱うときも同様
year = 2025
month = 9
text = "今日は " + str(year) + "/" + str(month)
print(text)
年齢: 20歳
今日は 2025/9
数値が複数なら、変換漏れに注意してください。
混在すると再びTypeErrorになります。
複数の結合はjoinが効率的
要素をたくさんつなぐ場合、join
が効率的です。
+
は都度新しい文字列を作るため、回数が多いと遅くなりがちです。
# 多くの部分をつなぐときは join を使う
parts = ["Hello", "Python", "World"]
msg_plus = parts[0] + " " + parts[1] + " " + parts[2] # 小規模ならOK
msg_join = " ".join(parts) # 規模が大きくなるほどこちらが有利
print("msg_plus:", msg_plus)
print("msg_join:", msg_join)
# 数値が混ざる場合は str にしてから join
numbers = [2025, 9, 10]
date_text = "-".join(map(str, numbers)) # map(str, ...)で一括変換
print("date_text:", date_text)
msg_plus: Hello Python World
msg_join: Hello Python World
date_text: 2025-9-10
以下は簡単な使い分けの目安です。
場面 | 推奨 |
---|---|
短い固定個数の結合 | + |
多数の要素やループで結合 | separator.join(iterable) |
数値を含む | あらかじめstr に変換、またはmap(str, ...) |
パフォーマンス重視の場面ではjoin
を選ぶと覚えておくと安心です。
Pythonの文字列の繰り返し
*演算子の使い方
同じ文字列を繰り返したいときは*
を使います。
整数回数だけ繰り返されます。
# 繰り返しの基本
laugh = "ha"
print(laugh * 3)
# 指定幅の区切り線
line = "-" * 20
print(line)
hahaha
--------------------
0回や負の回数の挙動
回数が0以下だと空文字列になります。
例外にはなりません。
print("ha" * 0) # 空文字列
print("ha" * -3) # 空文字列
print(len("ha" * -1)) # 長さで確認
0
回数 | 結果 |
---|---|
0 | 空文字列 |
負の整数 | 空文字列 |
正の整数n | その文字列がn回連結 |
- 関連記事:文字列の長さを調べる
区切りを付けて繰り返す
同じ単語を区切り付きで繰り返したい場合、join
が便利です。
末尾の区切りを消す処理が不要になります。
# 区切り付きの繰り返し
token = "abc"
n = 5
with_sep = ",".join([token] * n) # "abc,abc,abc,abc,abc"
print(with_sep)
# パターン自体を繰り返すなら * でOK
pattern = "abc,"
raw = pattern * n # 末尾のカンマが余る
fixed = raw.rstrip(",") # 末尾の余分な区切りを削除
print(raw)
print(fixed)
abc,abc,abc,abc,abc
abc,abc,abc,abc,abc,
abc,abc,abc,abc,abc
要素の列を組み立てるならjoin
、装飾パターンなら*
という意識が役立ちます。
- 関連記事:区切り文字自体を含めて3つに分割する
実用サンプル
区切り線や飾り枠の生成
見出しや強調に便利な飾り枠を、*
で簡単に作れます。
# 任意の幅の飾り枠を作る
title = " MENU "
width = 30
# 上下の線は "=" を幅に合わせて繰り返す
border = "=" * width
# 行内は左右に余白を確保して整形
padding = (width - len(title)) // 2
line = "-" * padding + title + "-" * (width - len(title) - padding)
print(border)
print(line)
print(border)
==============================
----------- MENU -------------
==============================
メッセージを結合して出力
複数の値を読みやすく結合し、改行も加えて出力します。
name = "Hanako"
city = "Tokyo"
age = 23
# + で丁寧に結合し、数値は str に変換
msg = "Name: " + name + "\n" + "City: " + city + "\n" + "Age: " + str(age)
print(msg)
# 複数のパーツを join でまとめる
parts = ["User", name, "from", city]
sentence = " ".join(parts) # スペース区切りで結合
print(sentence)
Name: Hanako
City: Tokyo
Age: 23
User Hanako from Tokyo
数値を含むときはstr()
を忘れないことが重要です。
表の行を繰り返し作る
表の罫線や行を繰り返して、整形したテキスト表を作ります。
# 簡易テーブルの作成
headers = ["ID", "Name", "Score"]
rows = [
["001", "Alice", "89"],
["002", "Bob", "95"],
["003", "Cara", "78"],
]
# 列幅を決める(今回は固定幅)
w_id, w_name, w_score = 5, 10, 6
# 罫線を * で構築
hline = "+" + "-" * w_id + "+" + "-" * w_name + "+" + "-" * w_score + "+"
print(hline)
# ヘッダ行
header_line = "|" + headers[0].ljust(w_id) + "|" + headers[1].ljust(w_name) + "|" + headers[2].rjust(w_score) + "|"
print(header_line)
print(hline)
# データ行
for r in rows:
line = "|" + r[0].ljust(w_id) + "|" + r[1].ljust(w_name) + "|" + r[2].rjust(w_score) + "|"
print(line)
print(hline)
+-----+----------+------+
|ID |Name | Score|
+-----+----------+------+
|001 |Alice | 89|
|002 |Bob | 95|
|003 |Cara | 78|
+-----+----------+------+
罫線を*
で、セル内容をljust
やrjust
で整えると見やすくなります。
よくあるつまずきと対策
Noneは結合できない
Noneは文字列ではありません。
そのまま+
で結合するとエラーになります。
空文字に置き換える、またはstr(None)
にするなど明示的に処理しましょう。
value = None
# これはエラー
try:
print("値: " + value)
except TypeError as e:
print("エラー:", e)
# 安全な対処1: 空文字に置き換える(表示しない)
safe = value or "" # None や空は "" になる
print("値: " + safe)
# 安全な対処2: 明示的に "None" と出したいなら str を使う
print("値: " + str(value))
エラー: can only concatenate str (not "NoneType") to str
値:
値: None
用途に応じて非表示にするかstr
で見せるかを選びます。
- 関連記事:Noneの意味と使い方
ループでの+連結は遅い
文字列は不変なので、+
でループ連結すると毎回新しい文字列が作られます。
リストに集めてjoin
で一気に連結する方が効率的です。
# 遅くなりがちなやり方
words = ["py"] * 5_000 # 例として同じ単語を多数
s = ""
for w in words:
s += w # 都度新しい文字列が作られる
# 推奨のやり方
t = "".join(words)
print(len(s), len(t), s == t)
10000 10000 True
大規模データでは必ずjoin
を検討してください。
- 関連記事:リスト内包表記でfor文を置き換える
改行やスペースの混入に注意
見えないスペースや改行が意図せず混ざると、表示や比較で問題になります。
どこでスペースや改行を入れているかを明示し、不要ならstrip()
で除去します。
# 意図せぬ余分なスペース
a = "Hello "
b = " World"
merged = a + b # "Hello World" ← スペースが2つ
print(repr(merged)) # reprで可視化
# 対策1: 余計な空白を事前に削る
clean = a.rstrip() + " " + b.lstrip()
print(repr(clean))
# 対策2: 区切りは join に任せる
parts = [a.strip(), b.strip()]
joined = " ".join(parts)
print(repr(joined))
# 改行の混入にも注意
line1 = "first line\n"
line2 = "second line"
text = line1 + line2 # 間に改行が入る
print(text)
'Hello World'
'Hello World'
'Hello World'
first line
second line
データ受け渡しの直前や直後にstrip()
で正規化すると安全です。
まとめ
本記事では文字列の結合(+)
と繰り返し(*)
の基本、数値との結合で起きるTypeErrorの回避、str()
による変換、多数結合に強いjoin
、そして繰り返しの0回や負数での挙動までを解説しました。
実用例として区切り線や飾り枠、メッセージ整形、テキスト表の構築も示し、最後にNoneの扱い、ループでの+
の非効率、空白や改行の混入というつまずきを対策とともに確認しました。
まずは小さなスクリプトで手を動かし、「スペースは明示」「数値はstr
」「多数の結合はjoin
」の3点を習慣にすると、文字列処理がぐっと安定します。