「リストの全要素を2倍にしたい」「条件に合う要素だけを取り出したい」「合計や積を一発で求めたい」——そんなとき、for文をゴリゴリ書く時代はもう終わりです。Pythonには map・filter・reduce という3つの強力な高階関数が用意されていて、わずか1行でリストや集合への一括処理を表現できます✨
これらを使いこなせるようになると、コードが短く・読みやすく・バグも生まれにくくなります。レビューで「きれいなコードだね」と褒められる未来も、すぐそこです🎉
高階関数とは「引数や戻り値に関数自体を取れる関数」のこと。Pythonでは関数もオブジェクトとして扱われるため、関数を別の関数に渡したり、関数を返したりすることが自然にできます。最初は定義が抽象的に感じるかもしれませんが、標準で用意されている map・filter・reduce を実際に動かしてみると、感覚的にスッと理解できるようになります。
ポイントは「ループの代わりに、処理そのものを関数として渡す」という発想の転換。これに慣れると、コードを書く速度がぐっと上がります🚀
リストや集合などの繰り返し可能オブジェクトに対して、すべての要素へ同じ処理を一括で適用したいときに使います。書き方は map(関数, イテラブル)。たとえば数値リストの全要素を2倍にしたいなら、2倍にする関数 twice を作って list(map(twice, x)) と書くだけ。list(map(lambda n: n*2, x)) のようにラムダ式でも書けますし、list(map(abs, x)) のように組み込み関数をそのまま渡すこともできます。
filter(関数, イテラブル) は、関数の戻り値が True になる要素だけを残してくれます。たとえば「3の倍数だけ取り出したい」なら、n % 3 == 0 を返す関数を作って filter に渡すだけ。list(filter(lambda n: n % 3 == 0, x)) のようにラムダ式で書けば1行で完結します。第2引数には map で作ったオブジェクトを渡すこともできるので、map と filter を組み合わせて「+1してから3の倍数だけ取り出す」といった処理もスマートに書けます。
reduce は functools モジュールから from functools import reduce で読み込みます。リストの先頭から順に「直前の結果」と「次の要素」を関数に渡し、最終的に1つの値へ畳み込んでくれます。たとえば全要素の積を求めたいなら、2つの値を掛け合わせる関数 multiply を作って reduce(multiply, x)。これも reduce(lambda a, b: a*b, x) のようにラムダで書けばコンパクトです。
map・filter・reduceは「読んで終わり」ではなく、手を動かして初めて自分のものになります。学びを加速させる書籍と道具を厳選しました📚
関数・リスト・ラムダ式の基礎をしっかり押さえてあると、高階関数の理解は何倍もスムーズになります。図解と演習が豊富な入門書なら、初学者でもつまずかずに読み進められます。
「動くコード」から「美しいコード」へ進化したい人にぴったりの中級書。内包表記・ジェネレータ・関数型のテクニックも体系的に学べるので、map・filter・reduceの理解がさらに立体的になります。
map・filter・reduceの考え方は、pandasのapplyやquery、aggなどでも大活躍します。データ分析・集計に挑戦したい人は、関連書籍を1冊揃えておくと学習効率が一気に上がります。
関数を量産する日々には、指先の負担を減らしてくれるキーボードが頼もしい味方になります。静音タイプのメカニカルキーボードなら、夜の学習タイムでも周囲を気にせず集中できます🌙
左にエディター、右にPython公式ドキュメント、という贅沢な配置はモバイルモニター1枚で実現できます。USB-Cで繋ぐだけで、自宅でもカフェでも開発環境がぐっと快適になります。
シンプルな変換やフィルタはリスト内包表記の方が読みやすい場面も多いです。一方で、組み込み関数や既存の関数オブジェクトをそのまま使い回したいときや、関数型のスタイルでパイプライン的に書きたいときはmap・filter・reduceが便利です。
もちろん大丈夫です。defで普通に関数を定義して渡しても、まったく同じ結果になります。再利用しない短い処理ならラムダ式が便利、という程度に捉えておけばOKです。
Python 3からはreduceが組み込みから外れ、functoolsモジュールへ移されました。可読性の観点で「reduceよりループや内包表記の方が読みやすい場面が多い」と判断されたためです。必要なときだけimportして使いましょう。
Python 3ではmapオブジェクトやfilterオブジェクトという「遅延評価される反復子」が返ります。リストとして扱いたいときはlist(...)で囲んであげればOKです。
劇的に速くなるわけではありませんが、組み込み関数を渡したmapはfor文より高速になることがあります。本当に高速化したい場合はNumPyやpandasのベクトル演算の出番です。
map・filter・reduceは、Pythonにおける関数型エッセンスの入り口です。最初は「for文で書けばいいのに」と感じるかもしれませんが、慣れてくると「変換」「抽出」「集約」という意図がそのままコードに現れる気持ちよさに気づくはずです。
書籍で土台を固め、快適なデバイス環境で手を動かせば、明日からのコードは確実に変わります。今日学んだ map・filter・reduce を、まずは身近なリストに使ってみてください🐍✨