関数型プログラミング

Advertisement

 

関数型プログラミング

 Python はオブジェクト指向言語でありながら、関数型プログラミングとしての機能も備えています。命令を処理するために複数の手法(パラダイム)を備える言語のことをマルチパラダイム言語とよぶことがありますが、Python もそうしたマルチパラダイム言語のひとつです。

 オブジェクト指向において、オブジェクトは内部データとそれを変更するためのメソッドが一体となったカプセルであり、プログラムはメソッドの使用によって内部データを変化させていく手続きです。一方で関数型プログラミングにおいては、できる限り状態の変更を避けるようにして、プログラムは関数同士で受け渡されるデータの流れとして表現されます。

 Python ではこの2種類のパラダイムが結び合わされています。Python においては関数自体も含めてすべてがオブジェクトなので、関数の間で受け渡されるのはオブジェクトです。関数型スタイルでは、このオブジェクトの流れを制御するようにコードが記述されます。
 

関数型で記述するメリット

 オブジェクト指向においてメソッドはオブジェクト自身に備わるものなので、あるオブジェクトのもつ内部データを変更したいと思っても、必ずしも目的に合うようなメソッドが備わっているとは限りません。そうした場合、オブジェクトのデータを異なるクラスのオブジェクトのデータに渡して処理したあとで、もう一度元のクラスのオブジェクトにデータを渡すという手順を踏むことになります。

 関数型プログラミングでは、一般に関数の引数に渡すデータの種類を問わない(あるいは幅広い種類のデータを扱える)ことが多いので、上記のような複雑な手続きを経る必要はなく、より短いコードで処理できます。
 

Python における関数型プログラミング

 Python においては、イテレータ、ジェネレータ、lambda(ラムダ)式、内包表記 (コンプリヘンション)、高階関数、デコレータなどの機能を使って関数型スタイルのコードを記述します。こうしたツールを使いこなせるようになると、驚くほど短く簡潔なコードを書くことができるようになります。
 とはいえ、複雑な処理を一行のコードにまとめてしまうようなやり方が推奨されているわけではありません。コードを短縮しすぎると逆に可読性が落ちるというパラドックスに遭遇します。特にチームで運用するコードであれば過剰な短縮はメンテナンスの障害ともなりえます。時として書いた本人でさえも、時間が経って見直したときにコードの意味がわからなくなることがあります。コードの短縮と可読性のバランスには常に気を配っておく必要があります。