おつかれさまです!記事を読んでくださりありがとうございます🌞
「そのコード、”Pythonらしさ”ありますか??」
Pythonに慣れてくると、こんな状態になってきます。
「書けるけどなんか冗長、動くけど自信ないな、他の人のコードの方がスッキリしているな、、、」
それ、もしかすると「Pythonicじゃない」コードかもしれません。
Pythonには流儀があることをご存じでしょうか?🤔
(私も最近知りました、、、)
ただ動くコードを書くのではなく「Pythonらしい=Pythonic」な書き方をすることで
読みやすく、伝わるコードになります!!
この記事では、初心者から脱却するためのPythonicなコード改善を具体例を交えて紹介していきます。
読みやすいコードは上級者への第一歩です!
一緒に”Pythonic”を学んでいきましょう!
それでは、ゆっくりしていってください🐱
・Pythonが少し書けるようになったけど、今の書き方に不安がある人
・他の人のコードと比べて、自分のコードが見づらく感じる人
・初心者っぽくない読みやすいコードを書きたい人
⭐️ Pythonicという考え方がわかる!
⭐️ 読みやすく、保守しやすいコードを書くコツがわかる!
⭐️ 具体的なコード例ですぐに試せる!
Zen of Python:Pythonが大切にしている”美学”
「そもそもZen of Pythonって何それ??」
「Zen??日本っぽいね!」
プログラミングを始めたばかりの方はなかなか耳にするタイミングはないと思いますが、
超重要な考え方なので、コード書けるようになってきた方でも知ったおいてほしいです🙆
そもそも、Zen of Pythonとは何なのかというところから説明していきます!
Pythonには「哲学がある」
Pythonを使っていると、ときどき「この書き方、本当に正しいのかな?」と迷うことがあります。
そんなときの道しるべとなるのが、
Pythonに組み込まれている“美学”――Zen of Python(Pythonの禅)です。
Pythonインタプリタで以下のコマンドを入力すると、その内容が確認できます:
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
隠しコマンドみたいで面白いですよね😊
(皆さんはご存知でしたか??)
このように20行ほどの詩のような文章が表示されます。
これは、Pythonの設計思想を簡潔に表現したものです🙌
Zen of Pythonから学ぶ、Pythonicな考え方
すべてを覚える必要はありませんが、特にPythonicな書き方を意識するうえで重要なフレーズをいくつかピックアップして紹介します。
Beautiful is better than ugly.
「醜いより美しい方が良い」
それはそうだ、、、となりそうですが、思想なのでご了承ください🙇♂️
コードは動けばいい…ではなく、見て美しいかどうかも重視しましょう。
整ったコードは、読み手にとっても自分にとっても優しいです。
Simple is better than complex.
「複雑よりシンプルな方が良い」
複雑な処理を詰め込むのではなく、できるだけシンプルに。
読みやすく、理解しやすいコードは、ミスも減ります。
Readability counts.
「読みやすさは大切」
Pythonは特に可読性を重視する言語です。
他人のためにも、未来の自分のためにも「読みやすい書き方」を選びましょう。
There should be one– and preferably only one –obvious way to do it.
「やるべきことには、1つ(できれば明白な)やり方があるべき」
同じ処理を複数の書き方で表せるとしても、誰が見ても納得する書き方を選ぶのがPython流です。
Zen of Pythonは、コードの判断基準
迷ったとき、「Zen of Pythonに照らして、この書き方はどうだろう?」と考えることが、
Pythonicな思考への第一歩です。
このあとのセクションでは、実際にどんな書き方が「非Pythonic」で、どう改善すればよいのか、
具体例で比較して解説していきます。
よくある「非Pythonic」コードと改善例
ここからは具体的にどんなコードがPythonicなのか見ていきましょう!
イメージしやすいように、
ユーザーの年齢と趣味をもとに、プロフィールを整形・表示するプログラムを作りました!
まずは、改善前のコードです!
みなさんならどこをどんな風に修正して、読みやすいコードにしますか??
def process_user_profile(user):
# ユーザーが存在するか確認
if user is not None:
if "age" in user and user["age"] > 0:
# 年齢によるカテゴリ分け
if user["age"] >= 18:
category = "adult"
else:
category = "minor"
# 趣味を大文字に
hobbies = []
if "hobbies" in user:
for h in user["hobbies"]:
hobbies.append(h.upper())
else:
hobbies = []
# 位置情報の取得
if "location" in user:
location = user["location"]
else:
location = "Unknown"
# 名前の入れ替え
if "first_name" in user:
first_name = user["first_name"]
else:
first_name = ""
if "last_name" in user:
last_name = user["last_name"]
else:
last_name = ""
tmp = first_name
first_name = last_name
last_name = tmp
# 好きな色の確認
if "favorite_color" in user:
favorite_color = user["favorite_color"]
else:
favorite_color = "none"
if favorite_color == "red" or favorite_color == "blue" or favorite_color == "green":
color_status = "valid"
else:
color_status = "invalid"
# 出力
print("User: " + first_name + " " + last_name)
print("Age category: " + category)
print("Location: " + location)
print("Favorite color: " + favorite_color + " (" + color_status + ")")
print("Hobbies:")
for i in range(len(hobbies)):
print(str(i + 1) + ". " + hobbies[i])
return "Profile processed successfully"
return "Invalid user data"
具体的な改善点を見ていく!
非Pythonicなコードでした!どうでしょうか??
「ちょっと見にくいかも、、、自分もこんな書き方してた、、、」
「ここ改善すればいいんじゃないかな??」
いろんなことが見つかったのではないでしょうか?
でも安心してください!具体的な改善点を確認しながら使えるようになっていけば大丈夫です🙆
条件分岐と値の設定 ↔︎ 冗長なif文
🙅 非Pythonic
if user["age"] >= 18:
category = "adult"
else:
category = "minor"
🙆 Pythonic
category = "adult" if user["age"] >= 18 else "minor"
✅ if / else を使った値の代入には三項演算子が使えると、コードがスッキリします。
リスト内包表記 ↔︎ appendベースのリスト生成
🙅 非Pythonic
upper_hobbies = []
for h in user["hobbies"]:
upper_hobbies.append(h.upper())
🙆 Pythonic
upper_hobbies = [h.upper() for h in user["hobbies"]]
✅ 短くて読みやすいだけでなく、意図(変換)と構造(繰り返し)が一目で分かります。
変数のスワップ ↔︎ 一時変数を使う
🙅 非Pythonic
tmp = first_name
first_name = last_name
last_name = tmp
🙆 Pythonic
first_name, last_name = last_name, first_name
✅ Pythonならワンライナーで変数の入れ替えができます。意外と多用されるテクです。
辞書アクセスとデフォルト値 ↔︎ ifキー確認
🙅 非Pythonic
if "location" in user:
location = user["location"]
else:
location = "Unknown"
🙆 Pythonic
location = user.get("location", "Unknown")
✅ .get()は辞書のキー確認 + デフォルト値設定を一行でできて、非常に便利です。
条件による早期リターン ↔︎ ネストが深いreturn
🙅 非Pythonic
def validate(user):
if user is not None:
if "age" in user and user["age"] > 0:
return True
return False
🙆 Pythonic
def validate(user):
if user is None or user.get("age", 0) <= 0:
return False
return True
✅ ネストを避けて早めにreturnするスタイルは、可読性が格段に上がります。
複数の値との比較 ↔︎ orを並べる
🙅 非Pythonic
if color == "red" or color == "blue" or color == "green":
print("valid color")
🙆 Pythonic
if color in {"red", "blue", "green"}:
print("valid color")
✅ 複数条件を in でまとめることで、見た目も論理もシンプルに。
enumerateの活用 ↔︎ rangeとインデックスで繰り返す
🙅 非Pythonic
for i in range(len(user["hobbies"])):
print(f"{i+1}. {user['hobbies'][i]}")
🙆 Pythonic
for i, hobby in enumerate(user["hobbies"], 1):
print(f"{i}. {hobby}")
✅ enumerate は「番号付きで繰り返す」ときの最適解。開始番号を指定できるのも強みです。
Before/Afterで見る:Pythonicな全体改善例
これまで紹介してきた書き方を反映させた修正版は次になります!!
def process_user_profile(user):
# バリデーション(年齢が0以下またはNoneなら終了)
if user is None or user.get("age", 0) <= 0:
return "Invalid user data"
# 年齢によってカテゴリを分類(条件分岐と値の設定)
category = "adult" if user["age"] >= 18 else "minor"
# 趣味を大文字に変換(リスト内包表記)
hobbies = [hobby.upper() for hobby in user.get("hobbies", [])]
# ユーザー名の並びを入れ替え(変数のスワップ)
first_name = user.get("first_name", "")
last_name = user.get("last_name", "")
first_name, last_name = last_name, first_name # 入れ替え
# 位置情報がなければデフォルトを設定(辞書.getの活用)
location = user.get("location", "Unknown")
# 好きな色が特定の候補に含まれるかチェック(複数の比較)
valid_colors = {"red", "blue", "green"}
favorite_color = user.get("favorite_color", "none")
color_status = "valid" if favorite_color in valid_colors else "invalid"
# 出力(enumerateで番号付きで表示)
print(f"User: {first_name} {last_name}")
print(f"Age category: {category}")
print(f"Location: {location}")
print(f"Favorite color: {favorite_color} ({color_status})")
print("Hobbies:")
for i, hobby in enumerate(hobbies, 1):
print(f" {i}. {hobby}")
return "Profile processed successfully"
どうでしょうか??
改善前のコードに比べて、だいぶ読みやすくなったのではないでしょうか??👀
これらの改善はどれも小さな工夫ですが、積み重なるとコード全体がPythonらしく美しいものに変わります。その結果、読みやすく・書きやすく・保守しやすいコードが自然に書けるようになります。
ちなみに、どんな出力になるかを示しておきます!
次のテストデータを使うとこんな感じになります!
user_info = {
"first_name": "Alice",
"last_name": "Smith",
"age": 25,
"hobbies": ["reading", "cycling", "coding"],
"location": "Tokyo",
"favorite_color": "blue"
}
result = process_user_profile(user_info)
print(result)
# 出力
User: Smith Alice
Age category: adult
Location: Tokyo
Favorite color: blue (valid)
Hobbies:
1. READING
2. CYCLING
3. CODING
Profile processed successfully
💡 初心者が意識しておくべきPythonic習慣まとめ
・条件式や代入は「簡潔に、意図が明確に」
・ネストは浅く、処理の流れは直線的に
・組み込み関数やイディオムを積極的に使う
・「誰が読んでも理解できる」コードを目指す
まとめ:Pythonicを知るとコードが“通じる”ようになる
Pythonには「こう書くと自然で読みやすい」という“文化”や“感覚”があります。
それがまさに Pythonic(パイソニック)。(なんかパナソニックみたいですね👀)
Pythonicな書き方は、単に“短い”や“おしゃれ”な書き方ではありません。
・読み手にとって意図が伝わりやすい
・バグを生みにくい
・Pythonという言語の哲学(Zen of Python)に沿っている
つまり、Pythonicを知ることは
「自分のコードが他のPythonistaに“通じる”ようになる」ということ。
あなたがもし、他人のPythonコードを読んで「なんか分かりやすいな」「美しいな」と感じたことがあるなら、それはおそらくPythonicな考え方に基づいたコードだったはずです。
Pythonicな書き方は一朝一夕でマスターするものではありませんが、
意識して書くこと、他人のコードを読むことを通じて、少しずつ身についていきます。
✅ まずは1つ、自分のコードで改善してみましょう。
ここまで読んでいただきありがとうございました!🎉
入門書などにはなかなか書いてない内容なので、知ってるだけで脱初心者できるかも??
これからも、プログラミングについてやエンジニアの仕事のリアルなどを発信していきます!
他の記事も読んでいただけると嬉しいです😊
Pythonの概念よくわからない、、、という方にはこちらがおすすめです👀
プログラミングについてもっとやっていきたいという方はAtcoderもおすすめです!
コメント