なぜPythonで関数型プログラミングを敢えて選ぶのか?
はじめに
Pythonといえば「シンプルで読みやすい」という特徴が真っ先に挙げられます。直感的な構文や手軽に使える標準ライブラリは、多くのプログラマーにとって魅力的であり、私もその魅力に惹かれた一人です。
しかし、皆さんに問いたいことは、「読みやすさの呪縛」に縛られすぎていませんか?ということです。
プログラミングの本質とは、本来もっとややこしく、考えるだけでワクワクするロジックの醍醐味を味わうことにあるのではないでしょうか?
そこで本記事では、「Python × 関数型プログラミング」の視点から、敢えて複雑な思考回路に挑む楽しさをお届けします。
※上記にもある通り、あくまで「醍醐味を味わう」ことを目的の一環としているので、仕事でこれを取り入れることはおすすめしないです。
関数型プログラミングとは?
関数型プログラミング(Functional Programming)とは、「関数を第一級オブジェクトとして扱い、副作用を最小限に抑える」プログラミングスタイルです。Pythonはもともと手続き型やオブジェクト指向が得意な言語ですが、関数型プログラミングの要素もしっかりサポートしています。
主な特徴
- 関数の第一級オブジェクト性: 関数を変数に代入したり、他の関数に引数として渡せる。
- 不変性(Immutability): データを変更せず、新しいデータを生成して操作する。
- 副作用の排除: グローバル状態やデータの変更を避け、関数は同じ入力に対して常に同じ出力を返す。
なぜあえてPythonで関数型プログラミングをするのか?
「シンプルで読みやすい」に逆らいたい
Pythonの魅力はそのシンプルさ。しかし、時にその「読みやすさ」を追求するあまり、プログラミングの「ややこしいけど面白い部分」を見失うことがあると思います。
関数型プログラミングでは、マップやフィルタ、リスト内包表記、再帰関数などを駆使して、コードが一見して「うわ、難しそう」と感じるレベルに到達します。それこそがプログラミングの醍醐味と思うのです。
実装例
実際に関数型プログラミングで書いていきます。
普通のPythonコード
numbers = [1, 2, 3, 4, 5]
squares = []
for number in numbers:
squares.append(number ** 2)
print(squares) # 出力: [1, 4, 9, 16, 25]
関数型スタイル
numbers = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x ** 2, numbers))
print(squares) # 出力: [1, 4, 9, 16, 25]
さらに関数らしく書く
from functools import reduce
numbers = [1, 2, 3, 4, 5]
sum_of_squares = reduce(lambda acc, x: acc + x ** 2, numbers, 0)
print(sum_of_squares) # 出力: 55
関数型プログラミングでややこしさを楽しむ
関数型スタイルを突き詰めると、以下のようなコードも書くことができます。
再帰関数でフィボナッチ数列
from functools import lru_cache
@lru_cache(None)
def fib(n):
return n if n <= 1 else fib(n - 1) + fib(n - 2)
print([fib(i) for i in range(10)]) # 出力: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
再帰はPythonでは効率が悪い場合もありますが、「考えるプロセス自体」を楽しむことが目的ならアリかなと思います。
関数型スタイルで書くことのメリット
- 頭をひねる快感:
- どう関数を組み合わせれば解けるか?思考力を鍛えられます。
- ロジックが美しい:
- 関数が「パズルのピース」のようにハマっていく様は感動的。
- 自己満足:
- 「書けた自分すごい」という謎の達成感があります。
まとめ
Pythonの読みやすいコードは素晴らしいですが、たまにはその呪縛から解放され、あえてややこしい関数型プログラミングを楽しむのもアリです。ややこしさの中に、新しい発見やプログラミングの本質が見えてきます。
みなさんもぜひ、Pythonで関数型プログラミングを味わってみてください。
では、本日もハッピーハッキングライフを🎉
Discussion