2.

Python 文字列の連結と反復|+ と * ・join の使いどころ・f-string 整形

編集
この記事の要点
  • Python の文字列演算子は +(連結)と *(反復)の 2 つだけ
  • 数値と文字列は + できないstr() か f-string で明示的に変換する
  • ループでの += 連結は避けて "".join(リスト) を使う(要素数が増えるほど差が出る)
  • 整形は f-string が第一候補。古い % 書式と .format() も読めるようにしておく
  • 文字列リテラルを並べただけで連結される("ab" "cd""abcd")。カンマ抜けのバグ源

連結(+)と反復(*)

s = "Py" + "thon"
print(s)              # Python

print("-" * 20)       # --------------------
print("ab" * 3)       # ababab

# 文字列は不変(immutable)なので、+ は毎回新しい文字列を作る
a = "abc"
b = a
a += "d"
print(a, b)           # abcd abc   ← b は変わらない

数値との連結はエラーになる

n = 5
# print("個数: " + n)
# TypeError: can only concatenate str (not "int") to str

print("個数: " + str(n))   # 個数: 5
print(f"個数: {n}")        # 個数: 5   ← こちらが読みやすい
print("個数:", n)          # 個数: 5   ← print はカンマ区切りで空白が入る

JavaScript や PHP のように暗黙で文字列化はされません。Python は型の混在を明示させる設計です。

ループでの連結は join を使う

words = ["a", "b", "c", "d"]

# 遅い書き方:繰り返すたびに新しい文字列を作る
s = ""
for w in words:
    s += w

# 速い書き方:まとめて 1 回で作る
s = "".join(words)
print(s)                  # abcd

print(", ".join(words))   # a, b, c, d
print("\n".join(words))   # 改行区切り

# join の要素は str でなければならない
nums = [1, 2, 3]
print(",".join(str(n) for n in nums))   # 1,2,3

+= は要素数が少なければ実用上問題ありませんが、数千件を超えると差が出ます。「連結したい列があるなら join」と覚えておくと迷いません。

整形(f-string / format / %)

name, price = "りんご", 128

print(f"{name} は {price} 円")            # f-string(推奨)
print("{} は {} 円".format(name, price))  # .format()
print("%s は %d 円" % (name, price))      # % 書式(古い)

# 桁揃え・書式指定
print(f"{price:,}")        # 128        カンマ区切り
print(f"{3.14159:.2f}")    # 3.14       小数 2 桁
print(f"{42:05d}")         # 00042      ゼロ埋め
print(f"{name:<10}|")     # りんご       |  左寄せ 10 幅
print(f"{name:>10}|")     #       りんご|  右寄せ

# 式や変数名の表示(Python 3.8 以降)
print(f"{price * 2 = }")   # price * 2 = 256

リテラルの暗黙連結に注意

# 隣り合った文字列リテラルは自動で連結される
msg = ("エラーが発生しました。"
       "設定を確認してください。")
print(msg)   # エラーが発生しました。設定を確認してください。

# 便利な一方、リストのカンマを忘れると気づきにくいバグになる
items = [
    "apple",
    "banana"      # ← カンマ忘れ
    "cherry",
]
print(items)   # ['apple', 'bananacherry']   要素が 2 個になる

比較にも演算子が使える

print("apple" == "apple")     # True
print("apple" < "banana")     # True   辞書順(Unicode コードポイント順)
print("Z" < "a")               # True   大文字が先
print("py" in "python")       # True   部分一致は in

# 大小無視で比べたいとき
print("Apple".casefold() == "apple".casefold())   # True

日本語を含む並び替えはコードポイント順になるため、「あいうえお順」にしたい場合は読み仮名を別に持つか pykakasi のような外部ライブラリが必要です。

関連

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 算術演算子
  2. 文字列演算子
  3. 代入演算子
  4. 比較演算子
  5. 論理演算子
  6. ビット演算子