100行のコードが10行に?Pythonic(パイソンらしい)な書き方への第一歩
プログラミングを始めたばかりの頃、一生懸命に書いたコードを見て、ベテランエンジニアが 「もっと短く、Pythonらしく書けるよ」とアドバイスをくれることがあります。
100行あった処理が、魔法のようにわずか10行に凝縮される。 そんな魔法のような体験ができるのが、Pythonという言語の大きな魅力のひとつです。
この「Pythonらしい」という言葉は、プログラミングの世界では Pythonic(パイソニック) と呼ばれています。 今回は、初心者がまず目指すべき「スマートで読みやすいコード」の書き方について、その一歩を踏み出してみましょう。
エンジニア歴10年の私が、現場で見てきた「汚いコード」を「美しいコード」に変えるための秘訣を余すことなくお伝えします。 コードを短くすることは、単なる自己満足ではなく、メンテナンス性を高めるための重要な技術なのです。
なぜ「短く書くこと」が重要なのか¶
プログラミングにおいて、コードの行数が多ければ多いほど素晴らしいという考えは、実は大きな間違いです。 行数が増えるということは、それだけバグが潜む場所が増え、読み手が理解するのに時間がかかることを意味します。
Pythonicな書き方を目指す理由は、単にタイピングの量を減らすためだけではありません。 読みやすく、意図が明確で、かつ実行効率が良いコードこそが、プロの世界で求められる質の高いコードだからです。
読みやすさは「正義」である¶
Pythonの設計思想には、読みやすさは重要であるという強い信念が込められています。 複雑なことを複雑なまま書くのではなく、誰が見ても一目で何をしているかわかるシンプルさを追求します。
【関連記事】綺麗なコードって何?初心者から一歩抜け出す「リーダブルコード」の3つの基本
メンテナンスコストを劇的に下げる¶
将来、あなたや他の誰かがそのコードを修正するとき、100行の迷路を解くのと10行の地図を読むのでは、どちらが楽でしょうか。 コードを短く洗練させることは、未来の自分への最高のプレゼントになるのです。
Pythonicへの第一歩「リスト内包表記」¶
初心者がまず習得すべき最強の武器が、この リスト内包表記 です。 これを知るだけで、リストの作成や加工に関するコードが、驚くほどスッキリと生まれ変わります。
例えば、あるリストの中から特定の条件に合う数字だけを抜き出して、新しいリストを作りたい場面を想像してみてください。 多くの初心者は、空のリストを作ってから、for文とif文を組み合わせて1行ずつ追加していく方法をとります。
従来の書き方(冗長なループ)¶
まずは、多くの言語で見られる一般的な書き方を見てみましょう。 これでも正しく動きますが、Pythonとしては少し「おしゃべり」すぎる書き方です。
# 0から9までの数字から、偶数だけを取り出したリストを作る
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
even_numbers = []
for n in numbers:
if n % 2 == 0:
even_numbers.append(n)
print(even_numbers)
Pythonicな書き方(リスト内包表記)¶
同じ処理をリスト内包表記で書くと、たった1行で完結します。 英語の文章を読むように「nを取り出す。もしnが偶数なら。この範囲から。」という流れで理解できます。
# リスト内包表記でスマートに
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
even_numbers = [n for n in numbers if n % 2 == 0]
print(even_numbers)
どうでしょうか。 数行にわたっていた処理がギュッと凝縮され、何をしているかが一目でわかるようになったはずです。
組み込み関数を使い倒す¶
Pythonには、標準で用意されている非常に便利な 組み込み関数 がたくさんあります。 これらを活用することで、自分で一からロジックを組み立てる必要がなくなる場面が多々あります。
初心者のうちは、つい「自分で計算式を書こう」としてしまいがちです。 しかし、Pythonが用意してくれている関数を使う方が、速くてバグも少なく、何よりコードが短くなります。
zip関数で複数のリストを同時に扱う¶
2つの関連するリストを同時にループで回したいとき、あなたならどうしますか? 添え字(インデックス)を使ってアクセスするのは、Pythonではあまり推奨されない、少し古い書き方です。
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
# 非推奨:インデックスを使う方法
for i in range(len(names)):
print(f"{names[i]} is {ages[i]} years old")
# Pythonic:zip関数を使う方法
for name, age in zip(names, ages):
print(f"{name} is {age} years old")
zip関数を使えば、複数のリストを「ファスナーを閉めるように」ペアにして取り出すことができます。 インデックスを管理する手間が省けるため、記述ミスを防ぐことができるのが大きなメリットです。
enumerate関数でインデックスと値を同時に得る¶
ループの中で「今、何番目の要素を処理しているか」を知りたいときは、enumerate関数が役立ちます。 カウンター用の変数をループの外で定義して、ループ内で1ずつ足していくような手間はもう不要です。
fruits = ["apple", "banana", "cherry"]
# インデックスと要素を同時に取得
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
このように、Pythonらしい道具を知っているかどうかで、コードの「濃度」は大きく変わってきます。
コードは「書く」より「削る」ほうが難しい¶
私はこれまで、数えきれないほどのコードレビューを行ってきました。 そこで気づいたのは、スキルの高いエンジニアほど、コードを短くすることに心血を注いでいるという事実です。
初心者の頃は、複雑なロジックを組み立てることに知的な快感を感じるかもしれません。 しかし、プロの現場では、その複雑さをいかに排除して、シンプルに保つかが勝負になります。
50行のパース処理を3行に書き換えた日¶
ある時、新人のエンジニアがCSVファイルを解析するために、50行近い独自のロジックを書いて持ってきました。 一文字ずつ読み込んで、カンマの位置を探し、改行を判定する……という非常に苦労した跡が見えるコードでした。
私は彼に、Pythonの標準ライブラリである csv モジュールを紹介しました。
結果として、彼の50行の苦労は、わずか3行のコードに置き換わってしまったのです。
【関連記事】DRY・KISS原則を意識してコードを磨く方法を解説!なぜ私のコードは汚いのか?
「車輪の再発明」を避ける勇気¶
Pythonの世界には「車輪の再発明をしない」という格言があります。 あなたが今苦労して作ろうとしている機能は、すでに誰かがより完璧な形で提供している可能性が非常に高いです。
それを探し出し、正しく使いこなすことも、Pythonicなエンジニアになるための大切な資質です。 自分で書くコードが少なければ少ないほど、あなたのプログラムは安定し、信頼されるようになります。
Pythonicなコードと従来のコードの比較一覧¶
ここで、よくある処理がどのようにPythonicに進化するかを表にまとめてみました。 自分のコードがどちらに近いか、確認してみてください。
| 処理の内容 | 従来の書き方(冗長) | Pythonicな書き方(スマート) |
|---|---|---|
| リストの作成 | forループで append する |
リスト内包表記を使う |
| 要素の存在確認 | forループで1つずつ比較する | in 演算子を使う |
| 複数リストのループ | range(len()) で回す |
zip() 関数を使う |
| 辞書の安全な取得 | if key in dict: で確認する |
.get() メソッドを使う |
| 文字列の結合 | + で1つずつ足していく |
''.join() メソッドを使う |
| ファイルの読み書き | f = open() して最後に close() する |
with 構文(コンテキストマネージャ)を使う |
表の右側にある書き方を意識するだけで、あなたのコードの品質は格段に向上します。 最初は難しく感じるかもしれませんが、一度慣れてしまうと、もう左側の書き方には戻れなくなるはずです。
Pythonの哲学「The Zen of Python」に触れる¶
Pythonには、言語そのものに込められた哲学が存在します。 それが、The Zen of Python(Pythonの禅) と呼ばれる19の指針です。
この哲学を理解することは、Pythonicな書き方を習得するための最短距離になります。
あなたのターミナルで import this と入力してみてください。
【関連記事】Pythonの禅とは?「import this」に隠された秘密を徹底解説
「シンプルは複雑より良い」という教え¶
禅の教えの冒頭には「Beautiful is better than ugly(美しいことは、醜いことより良い)」という言葉があります。 そしてその後に続くのが「Simple is better than complex(シンプルは、複雑より良い)」です。
この思想が根底にあるからこそ、Pythonは他の言語よりも短く、直感的に書けるように設計されているのです。 迷ったときは「よりシンプルな方はどちらか?」と自分に問いかけてみてください。
「読みやすさは大切だ」¶
もうひとつ重要なのが「Readability counts(読みやすさは重要だ)」という一節です。 たとえ1行で書けたとしても、それが他人に理解できない難解な1行であれば、それはPythonicではありません。
短くすることは目的ではなく、あくまで「読みやすくするため」の手段であることを忘れないでください。 スマートさと分かりやすさのバランスを取ることこそが、真のPythonicへの道です。
初心者がPythonicになるための3つの習慣¶
最後に、明日から実践できる、あなたのコードをPythonicに変えていくための習慣を提案します。 いきなり完璧を目指す必要はありません。
まずは、少しずつ自分の書き方をアップデートしていく楽しさを味わってください。
1. 他人の書いた美しいコードを「写経」する¶
GitHubなどのオープンソースプロジェクトで、多くの人に使われているライブラリのコードを読んでみましょう。 「こんな書き方があったのか!」という驚きが、あなた自身の血肉になります。
特に、Pythonの標準ライブラリのソースコードは、まさにPythonicの教科書です。 自分が普段使っている関数の裏側を覗くだけでも、大きな学びがあります。
2. 標準ライブラリのドキュメントを定期的に眺める¶
Pythonには膨大な数の標準ライブラリが同梱されています。 「こんな便利なものがあったのか」と知っているだけで、自作する手間が省けます。
特に collections や itertools といったモジュールは、ループ処理を劇的に短くする魔法の道具箱です。
すべてを覚える必要はありませんが、存在を知っていることが武器になります。
3. 書いた直後にリファクタリングする¶
一度動くコードが書けたら、そこがゴールではありません。 「もう少し短くできないか?」「標準関数で置き換えられないか?」と見直す時間を5分だけ作ってください。
その5分の積み重ねが、あなたのエンジニアとしての直感を鋭く磨き上げていきます。 リファクタリングを繰り返すうちに、最初からPythonicなコードが自然と書けるようになっていくでしょう。
まとめ¶
Pythonicな書き方を追求することは、決してテクニックの自慢ではありません。 それは、そのコードを次に読む人への「思いやり」そのものです。
短く、美しく、読みやすいコードは、チームのコミュニケーションを円滑にし、プロジェクトを成功へ導きます。 100行の迷路を10行の並木道に変える力。
その力を手にしたとき、あなたはただの初心者から、真のPythonエンジニアへと進化しています。 完璧主義に陥らず、まずは「今日より一行だけ短く、美しく」を合言葉に、コードを磨いていきましょう。
ここまでお読みいただきありがとうございます。