Pythonの関数型プログラミング入門!map, filter, reduce の活用方法
生徒
「Pythonでデータをまとめて変換したり、条件で絞り込みたいときって、どうやるんですか?」
先生
「そんなときに便利なのがmap、filter、reduceという関数型プログラミングの機能です。」
生徒
「関数型プログラミングって難しそうですが、初心者でも使えますか?」
先生
「はい、大丈夫です!考え方を覚えれば、リストのループ処理を短く、しかも読みやすく書けますよ。」
1. 関数型プログラミングとは?初心者でもわかる基礎知識
関数型プログラミングとは、一言でいうと「関数(処理のまとまり)を、データと同じように自由に扱う」というプログラミングのスタイルです。2026年現在のモダンな開発現場でも、コードの再利用性や保守性を高める手法として非常に重視されています。
Pythonでは、関数を「第一級オブジェクト」として扱えるのが大きな特徴です。これは、数値や文字列を変数に代入するのと同じ感覚で、関数そのものを変数に入れたり、別の関数へ引数として渡したり、戻り値として受け取ったりできることを意味します。
料理に例えると、これまでのやり方が「具材を切って、炒めて…」という手順書に従うものだとしたら、関数型は「切る機能」や「焼く機能」という道具(関数)そのものを組み合わせて、効率よく料理を完成させるイメージです。
例えば、関数を変数のように扱う簡単な仕組みを見てみましょう。
# 挨拶をするだけのシンプルな関数
def say_hello(name):
return f"こんにちは、{name}さん!"
# 関数を「message_func」という変数に代入
message_func = say_hello
# 変数経由で関数を呼び出す
print(message_func("Python初心者"))
このように、関数そのものをパーツとして扱えるようになると、複雑なデータ処理も驚くほどシンプルに記述できるようになります。今回詳しく解説するmap、filter、reduceは、まさにこの「関数をパーツとして渡す」仕組みを最大限に活用し、データの変換・絞り込み・集約をスマートに実現するための超重要ツールです。
2. map関数でデータを一括変換
map関数は、指定した関数をリストやタプルの全要素に適用します。
numbers = [1, 2, 3, 4, 5]
# 各要素を2倍にする
doubled = list(map(lambda x: x * 2, numbers))
print(doubled)
[2, 4, 6, 8, 10]
上の例では、lambda(無名関数)を使って短く書いています。for文でもできますが、mapを使えばコード量が減り、意図が明確になります。
3. filter関数で条件に合うデータを抽出
filter関数は、条件を満たす要素だけを取り出します。
numbers = [10, 15, 20, 25, 30]
# 偶数だけを抽出
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)
[10, 20, 30]
条件に合うかどうかはTrueかFalseで判断します。データのフィルタリング(絞り込み)に最適です。
4. reduce関数でデータを集約
reduce関数は、リストの全要素を1つの値にまとめます。Pythonの標準ライブラリfunctoolsからインポートして使います。
from functools import reduce
numbers = [1, 2, 3, 4, 5]
# 合計を計算
total = reduce(lambda x, y: x + y, numbers)
print(total)
15
加算だけでなく、掛け算や最大値・最小値の計算など、さまざまな集約処理に応用できます。
5. map, filter, reduce の組み合わせ例
これらの関数は組み合わせて使うこともできます。
from functools import reduce
numbers = [1, 2, 3, 4, 5, 6]
# 偶数の2乗の合計を求める
result = reduce(
lambda x, y: x + y,
map(lambda x: x**2, filter(lambda x: x % 2 == 0, numbers))
)
print(result)
56
まずfilterで偶数を取り出し、次にmapで2乗し、最後にreduceで合計しています。複雑な処理もこのように簡潔に表現できます。
6. 関数型プログラミングのポイント
mapは「変換」、filterは「抽出」、reduceは「集約」- for文よりもコードが短く、意図が明確になる
- ラムダ式と組み合わせるとさらにスッキリ書ける
Pythonではfor文やリスト内包表記でも同じことができますが、map・filter・reduceを使うと関数型プログラミングのスタイルを身につけられ、より高度なデータ処理ができるようになります。