閉じる

Pythonの文字列結合と繰り返しの基本(+と*の使い方)

Pythonでは文字列をつなげる+と、同じ文字列を繰り返す*がとてもよく使われます。

どちらも直感的ですが、数値との結合でのエラーや効率の落とし穴があります。

本記事では結合の基本から繰り返し、区切りの扱い、実用的なサンプルやつまずきの回避策まで、初心者の方にもわかりやすく丁寧に解説します。

Pythonの文字列結合の基本

+演算子の使い方

文字列の結合は+で行います

Pythonの文字列は不変(immutable)なので、結合すると新しい文字列が作られます。

変数を使った結合でも同様です。

Python
# 基本的な結合
a = "Hello"
b = "World"
msg = a + " " + b  # スペースも明示的に入れる
print(msg)

# 変数を含む結合
first = "Python"
second = "入門"
title = first + " " + second
print(title)
実行結果
Hello World
Python 入門

注意点として、+は自動でスペースを入れてくれません

必要なら自分で" "を挟みます。

スペースや改行を入れるコツ

文章を読みやすくするには、スペースや改行を適切に挿入します。

改行は"\n"で表現します。

Python
# スペースと改行の挿入
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になります。

理由は文字列と数値は別の型であり、暗黙変換が行われないからです。

Python
# これはエラーになります
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(数値)で文字列に変換します。

これが最もシンプルな方法です。

Python
age = 20
msg = "年齢: " + str(age) + "歳"
print(msg)

# 複数の数値を扱うときも同様
year = 2025
month = 9
text = "今日は " + str(year) + "/" + str(month)
print(text)
実行結果
年齢: 20歳
今日は 2025/9

数値が複数なら、変換漏れに注意してください。

混在すると再びTypeErrorになります。

複数の結合はjoinが効率的

要素をたくさんつなぐ場合、joinが効率的です。

+は都度新しい文字列を作るため、回数が多いと遅くなりがちです。

Python
# 多くの部分をつなぐときは 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の文字列の繰り返し

*演算子の使い方

同じ文字列を繰り返したいときは*を使います。

整数回数だけ繰り返されます。

Python
# 繰り返しの基本
laugh = "ha"
print(laugh * 3)

# 指定幅の区切り線
line = "-" * 20
print(line)
実行結果
hahaha
--------------------

0回や負の回数の挙動

回数が0以下だと空文字列になります。

例外にはなりません。

Python
print("ha" * 0)   # 空文字列
print("ha" * -3)  # 空文字列
print(len("ha" * -1))  # 長さで確認
実行結果
 
0
回数結果
0空文字列
負の整数空文字列
正の整数nその文字列がn回連結

区切りを付けて繰り返す

同じ単語を区切り付きで繰り返したい場合、joinが便利です。

末尾の区切りを消す処理が不要になります。

Python
# 区切り付きの繰り返し
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、装飾パターンなら*という意識が役立ちます。

実用サンプル

区切り線や飾り枠の生成

見出しや強調に便利な飾り枠を、*で簡単に作れます。

Python
# 任意の幅の飾り枠を作る
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 -------------
==============================

メッセージを結合して出力

複数の値を読みやすく結合し、改行も加えて出力します。

Python
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()を忘れないことが重要です。

表の行を繰り返し作る

表の罫線や行を繰り返して、整形したテキスト表を作ります。

Python
# 簡易テーブルの作成
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|
+-----+----------+------+

罫線を*で、セル内容をljustrjustで整えると見やすくなります。

よくあるつまずきと対策

Noneは結合できない

Noneは文字列ではありません

そのまま+で結合するとエラーになります。

空文字に置き換える、またはstr(None)にするなど明示的に処理しましょう。

Python
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で見せるかを選びます。

ループでの+連結は遅い

文字列は不変なので、+でループ連結すると毎回新しい文字列が作られます。

リストに集めてjoinで一気に連結する方が効率的です。

Python
# 遅くなりがちなやり方
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を検討してください。

改行やスペースの混入に注意

見えないスペースや改行が意図せず混ざると、表示や比較で問題になります。

どこでスペースや改行を入れているかを明示し、不要ならstrip()で除去します。

Python
# 意図せぬ余分なスペース
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点を習慣にすると、文字列処理がぐっと安定します。

この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!