実践で身につくタイプの練習問題を用意しました。
目的:読みやすく・保守しやすい変数名を付けられるようになること。
各レベルごとに問題・ヒント・解答(解説付き)を用意しています。まずは 基礎 → 応用 → 実務的リファクタ の順で解いてみてください。答えを見てもOK。手を動かして直すのが一番身につきます。
初級(ルールを身につける)
各問題は「このコードの変数名をもっと良くしてください」。変更後のコードと短い理由を書いてください。
問1
x = 10
y = 3.14
z = "Taro"
print(x, y, z)
Pythonヒント:何を表す値か分かる名前に。
解答例
age = 10
pi_value = 3.14
name = "Taro"
print(age, pi_value, name)
Python解説:x,y,z は意味がない。age や name のように中身を表す名前にするとコード理解が早い。
問2
list = [1,2,3]
sum = 6
avg = sum / len(list)
Pythonヒント:組み込み名は上書きしない。
解答例
numbers = [1, 2, 3]
total = 6
average = total / len(numbers)
Python解説:list や sum は組み込み関数名なので別名にする(numbers, total)。
問3
a1 = 100
a2 = 200
a3 = a1 + a2
Pythonヒント:何の合計?
解答例
apple_price = 100
orange_price = 200
total_price = apple_price + orange_price
Python解説:a1 等は何を表すか不明。*_price など意味を含める。
中級(命名の慣習・型が分かる名前)
型や用途が明確になる命名、真偽値の命名、複数形などを練習します。
問4(Boolean の命名)
value = True
if value:
print("ok")
Pythonヒント:真偽値は is_ / has_ / should_ の接頭語が読みやすい。
解答例
is_valid = True
if is_valid:
print("ok")
Python解説:value より is_valid の方が条件の意味が明確。
問5(複数形・コレクション)
user = ["alice", "bob", "carol"]
for u in user:
print(u)
Pythonヒント:コレクションは複数形、ループ変数は単数形が自然。
解答例
users = ["alice", "bob", "carol"]
for user in users:
print(user)
Python解説:users(複数形)と user(各要素)で読みやすくなる。
問6(短縮語と略語)
dt = "2025-11-04"
cfg = {"a": 1}
Pythonヒント:略語はチームで合意があればOKだが、初学者は避ける。
解答例
date_str = "2025-11-04"
config = {"a": 1}
Python解説:dt, cfg は慣れないと意味が分からない。date_str, config のほうが明快。
上級(スコープ・コンテキストを意識した命名、リファクタ)
実務で起きるちょっと複雑なケース。リファクタ前・後のコードと理由を書いてください。
問7(関数内の変数が外の意味と衝突)
items = ["apple", "orange"]
def process(items):
items = items + ["banana"]
return items
Pythonヒント:関数引数名と外側の変数名が同じ場合、呼び出し側が混乱することがある。
解答例
cart_items = ["apple", "orange"]
def add_banana(items):
return items + ["banana"]
new_cart = add_banana(cart_items)
Python解説:外側は cart_items、関数名を具体的にして副作用の有無が分かるようにすると安全(ここは非破壊的に新しいリストを返す)。
問8(定数・大文字)
pi = 3.14159
Pythonヒント:定数は大文字で書く慣習。
解答例
PI = 3.14159
Python解説:変更されない値は UPPER_SNAKE_CASE にして、定数であることを表す。
問9(型情報を含めるか否か)
data = {"id": 1, "name": "Alice"}
Pythonヒント:data は曖昧。用途を考える。
解答例
user_record = {"id": 1, "name": "Alice"}
Python解説:user_record の方が何のデータかが一目で分かる。
実践的リファクタ問題(実際のコードを改善する)
以下のコードを読みやすく・バグを防げるようにリネームしてください。変更点は箇条書きで。
問10
def f(a, b):
c = a * b
return c
res = f(10, 20)
print(res)
Pythonヒント:関数名・引数名・戻り値の意味を明確に。
解答例
def multiply(x, y):
product = x * y
return product
result = multiply(10, 20)
print(result)
Python改善点
f→multiply(何をする関数か明示)- 引数
a, b→x, y(もう少し説明的ならwidth, height等に) c→product、res→result(意味が明確)
問11(大きめの断片:ログ変数など)
log = []
for i in range(3):
log.append(i * 2)
print(log)
Pythonヒント:log は「ログ」だがここでは単に結果のリスト。名前を正確に。
解答例
doubled_numbers = []
for i in range(3):
doubled_numbers.append(i * 2)
print(doubled_numbers)
Python解説:doubled_numbers の方が中身が直感的に分かる。
✅ 命名チェックリスト(いつでも使える短縮版)
コードレビューや自分のコードを見直すときにこの順でチェック。
- その名前で「何をしているか」が一瞬で分かるか?
- 予約語・組み込み名を上書きしていないか?
- コレクションは複数形、要素は単数形か?
- 真偽値は
is_/has_/should_の接頭語を検討したか? - 定数は
UPPER_SNAKE_CASEにしているか? - 略語を使うならチームで合意しているか・誰でも分かるか?
- スコープ(グローバル/ローカル)で名前の衝突はないか?
- 名前が長すぎないか(だが短すぎて意味がわからないのはNG)
- 型が重要なら
_str/_listのようなサフィックスで明示するのは役立つか?(乱用は禁物)
