Pythonの関数型プログラミング入門!map, filter, reduce の活用方法
生徒
「Pythonでデータをまとめて変換したり、条件で絞り込みたいときって、どうやるんですか?」
先生
「そんなときに便利なのがmap、filter、reduceという関数型プログラミングの機能です。」
生徒
「関数型プログラミングって難しそうですが、初心者でも使えますか?」
先生
「はい、大丈夫です!考え方を覚えれば、リストのループ処理を短く、しかも読みやすく書けますよ。」
1. 関数型プログラミングとは?
関数型プログラミングとは、関数を第一級オブジェクトとして扱うプログラミング手法です。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を使うと関数型プログラミングのスタイルを身につけられ、より高度なデータ処理ができるようになります。