Python × 入門 | #04 文字列を操ろう

数値だけを扱えるようになったので、今度は「文字」を扱ってみましょう。Pythonでは文字列(テキスト)も変数に入れたり、結合したり、整形したりできます。数値と文字列を組み合わせると、出力がぐっと読みやすくなります。

この記事では、文字列の基本から結合・繰り返し・f文字列まで、ブロックで体験しながら身につけます。

文字列の操作

まずはPycoBlocksを開こう

下のPycoBlocksで直接作業するか、別タブで開き、生成されるPythonコードを見ながら進めてください。

文字列とは何か

Pythonでは、テキストを "(ダブルクォート)か '(シングルクォート)で囲んだものを文字列と呼びます。数値の 80 と文字列の "80" は見た目が似ていますが、Pythonの中では別物として扱われます。

用語 意味
文字列(string) "..."'...' で囲んだテキストデータ "Hello"
結合(concatenation) + で文字列をつなげること "A" + "B""AB"
f文字列(f-string) f"...{変数}..." の形式で変数を文字列に埋め込む機能 f"点数:{score}点"

ステップ1:文字列を表示しよう

PycoBlocksの「テキスト」カテゴリにあるテキストブロックを「値を表示」にはめると、文字列をそのまま出力できます。

ブロック例:文字列を表示
print("Hello, Python!")
print('シングルクォートでもOK')

ステップ2:文字列を結合しよう

文字列どうしは + でつなげることができます。数値の足し算と同じ記号ですが、文字列の場合は「くっつける」動きになります。

first_name = "太郎"
last_name = "山田"
full_name = last_name + " " + first_name
print(full_name)
ブロック例:文字列を結合して表示

注意点として、数値(int)を文字列と + でつなごうとするとエラーになります。数値を文字列に変換するには str() を使います。

score = 85
print("得点:" + str(score) + "点")

ステップ3:f文字列で整形しよう

str() を使う方法でも動きますが、f文字列(フォーマット文字列)を使うとよりスッキリ書けます。文字列の先頭に f を付けて、変数を {} で囲むだけです。

ブロック例:f文字列で整形
name = "山田 太郎"
score = 85

print(f"名前:{name}")
print(f"得点:{score}点")
print(f"{name}さんの得点は{score}点です。")

{} の中には変数だけでなく計算式も書けます。たとえば f"平均:{(80 + 90) / 2}点" のように使うこともできます。

ステップ4:文字列の繰り返し

文字列と整数を * でつなぐと、その文字列を指定した回数だけ繰り返せます。区切り線を簡単に作るときなどに便利です。

print("=" * 20)
print("  成績レポート")
print("=" * 20)
print("国語:85点")
print("数学:92点")
print("=" * 20)

コーディングモードで書いてみよう

コーディングモードでは、f文字列の {} 内に書式指定もできます。たとえば小数点以下の桁数を揃えたい場合は {値:.2f} のように書きます。

total = 85 + 72 + 90
average = total / 3

print(f"合計:{total}点")
print(f"平均:{average:.1f}点")   # 小数第1位まで表示

:.1f は「小数点以下1桁の浮動小数点数(float)として表示」という意味です。:.2f にすれば2桁になります。

スライス・len()・replace()

スライスは文字列の一部を取り出す構文です。text[start:stop] で start 番目から stop の手前までを取り出せます。インデックスは 0 始まりで、マイナスを使うと末尾から数えます。

text = "PycoBlocks"
print(text[:4])     # Pyco(先頭から4文字)
print(text[4:])     # Blocks(4文字目以降)
print(text[::-1])   # skcolBocyP(逆順)

# len():文字列の長さを返す
print(len(text))    # 10

# replace():文字列を置き換える
msg = "Pythonは楽しい"
print(msg.replace("Python", "PycoBlocks"))  # PycoBlocksは楽しい

演習課題

課題4-1:自己紹介文を作ろう

変数 name(自分の名前)・age(年齢)・hobby(趣味)を作り、f文字列を使って「○○です。○歳です。趣味は○○です。」と3行で表示してください。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

模範解答:f文字列で自己紹介
name = "山田 太郎"
age = 16
hobby = "ロボット製作"

print(f"{name}です。")
print(f"{age}歳です。")
print(f"趣味は{hobby}です。")

解説: f文字列を使えば str(age) の変換なしに数値をそのまま埋め込めます。

課題4-2:成績表を整形しよう

3教科の点数(国語・数学・英語)を変数に入れ、合計・平均を計算して、区切り線付きの成績表形式で表示してください。平均は小数第1位まで表示しましょう。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

模範解答:成績表を整形
kokugo = 85
math = 92
english = 78

total = kokugo + math + english
average = total / 3

print(f"国語:{kokugo}点")
print(f"数学:{math}点")
print(f"英語:{english}点")
print(f"合計:{total}点")
print(f"平均:{average}点")

解説: "=" * 20 で区切り線を作ると、幅を変えたいときに数値を1か所変えるだけで済みます。

課題4-3:名札ジェネレーターを作ろう

名前・学年・クラスを変数に入れ、下のような枠付き名札を表示するプログラムを作ってください。枠の幅は名前の文字数に合わせて自動調整できると上級です(len() を使います)。

山田 太郎
2年 Aクラス

(実際の枠はプログラムで表示されます)

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

模範解答:名札ジェネレーター
name = "山田 太郎"
grade = "2年"
cls = "Aクラス"

width = max(len(name), len(grade + " " + cls)) + 4
line = "─" * width

print(f"┌{line}┐")
print(f"│  {name}{' ' * (width - len(name) - 2)}│")
print(f"│  {grade} {cls}{' ' * (width - len(grade) - len(cls) - 3)}│")
print(f"└{line}┘")

解説: len() は文字列の長さを返す関数です。幅を計算してスペースを調整することで、名前の長さが変わっても枠が崩れません。

課題4-4:文字列を逆順にしよう

スライス [::-1] を使って文字列を逆順にしてください。たとえば word = "Python" を逆順にすると "nohtyP" になります。
次に text = "level" で試して、前から読んでも後ろから読んでも同じ(回文)かどうかを == で確認してみましょう。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

文字列を逆順にして回文を判定するブロック例
word = "Python"
print(word[::-1])         # → nohtyP

text = "level"
print(text == text[::-1])  # → True(回文)

解説: [::-1] は「末尾から先頭に向かって1文字ずつ」という意味のスライスです。text == text[::-1]True なら回文です。スライスは文字列・リストに共通して使えるPythonの強力な機能です。なお、ブロック図にはスライスを直接表現するブロックがないため、結果の値("nohtyP"True)を直接 print する形で示しています。実際のスライス処理は上のPythonコードで確認してください。

課題4-5:郵便番号を「123-4567」形式に変換しよう

7桁の郵便番号文字列 zipcode = "1234567" を受け取り、"123-4567" の形式に変換して表示してください。スライスを2回使います。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

郵便番号にハイフンを挿入するブロック例
zipcode = "1234567"
formatted = zipcode[:3] + "-" + zipcode[3:]
print(formatted)  # → 123-4567

解説: zipcode[:3] は先頭3文字(インデックス0〜2)、zipcode[3:] は4文字目以降をすべて取り出します。文字列の + は連結なので、間に "-" を挟むだけで変換できます。なお、ブロック図にはスライスを直接表現するブロックがないため、変換後の値("123-4567")を直接 formatted に代入する形で示しています。実際のスライス処理は上のPythonコードで確認してください。

課題4-6:文章から単語を置き換えよう

text = "Pythonはむずかしい。Pythonがきらいだ。" という文章の中の PythonPycoBlocks に、むずかしいたのしい に、きらいすき に置き換えて表示してください。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

文字列を3箇所置き換えるブロック例
text = "Pythonはむずかしい。Pythonがきらいだ。"
text = text.replace("Python", "PycoBlocks")
text = text.replace("むずかしい", "たのしい")
text = text.replace("きらい", "すき")
print(text)

解説: str.replace(old, new) は文字列中のすべての oldnew に置き換えます。text = text.replace(...) のように変数に代入し直すことで、連続して複数箇所を変換できます。テキスト処理の基本パターンです。

まとめ

  • 文字列は "' で囲んで作ります
  • + で文字列をつなげ、* で繰り返せます
  • 数値を文字列と混ぜるには str() または f文字列f"...{変数}...")を使います
  • f文字列の {値:.1f} で小数点の桁数を指定できます

次は input() を使ってキーボードから文字を入力し、対話的なプログラムを作ります。→ Python × 入門 | #05 キーボードから入力しよう

PAGE TOP