Python: 高階関数と Lambda
最終更新:2026-09-22
Python では、関数も「値」です——変数に代入したり、他の関数に渡したりすることが、数値や文字列と同じようにできます。これにより非常に簡潔でエレガントなコードが可能になります。高階関数は、他の関数を引数として受け取ったり、関数を返したりする関数です。このレッスンはあなたに新しい世界を開くでしょう。
1. 関数は第一級オブジェクト
Python では、関数は他の値と同じように操作できます:
▶ サンプル:関数を値として扱う
▶ 試してみよう出力:
# 函数定义成功
2. map():一括変換
map() はシーケンス内のすべての要素に関数を適用し、新しいイテレータを返します:
▶ サンプル:map による一括変換
▶ 試してみよう出力:
# 执行成功
map()はリスト内包表記と同等:map(f, seq)≈[f(x) for x in seq]。どちらを使うかは好みの問題です——内包表記の方がより「Python らしい」です。
3. filter():一括フィルタリング
filter() は関数が True を返す要素を選択します:
▶ サンプル:filter によるデータ抽出
▶ 試してみよう出力:
# 执行成功
filter()も内包表記と同等:filter(f, seq)≈[x for x in seq if f(x)]。関数としてNoneを使うと、すべての falsy な値(""、0、None、Falseなど)を除去することと同等です。
4. 高度な sorted() の使い方
レッスン 11 では sorted() の key パラメータを学びました。さらに深く掘り下げましょう:
▶ サンプル:sorted を使ったカスタムソート
▶ 試してみよう出力:
# 执行成功
▶ サンプル:マルチレベルソート(難易度 ⭐⭐)
▶ 試してみよう出力:
Bob: 92
Diana: 92
Alice: 85
Charlie: 85
5. reduce():累積計算
reduce() はシーケンス内の要素を累積し、一度に 2 つの要素に関数を適用します。組み込み関数ではなく、functools からインポートします:
▶ サンプル:reduce による累積計算
▶ 試してみよう出力:
# 执行成功
(1) reduce() の実行過程
# reduce(lambda x, y: x + y, [1, 2, 3, 4])
# ステップ 1:x=1, y=2 → 3
# ステップ 2:x=3, y=3 → 6
# ステップ 3:x=6, y=4 → 10
# 結果:10
reduce() vs ループ: reduce() でできることは for ループでもできます。reduce() はより簡潔で宣言的です——「どうやるか」ではなく「何をするか」を記述します。欠点は、初心者には理解が難しいことです。
6. Lambda 式の深掘り
Lambda はギリシャ文字の λ にちなんで名付けられ、本質的には無名関数——名前のない小さな関数で、使ったら捨てられます。
(1) Lambda と通常関数の比較
▶ サンプル:Lambda vs 通常関数
▶ 試してみよう出力:
# 函数定义成功
(2) 完全な Lambda 構文
lambda parameters: expression
# ↑ 以下と同等
def anonymous_function(parameters):
return expression
(3) 複数パラメータ
▶ サンプル:複数パラメータの Lambda
▶ 試してみよう出力:
# 执行成功
(4) Lambda を使うタイミング
▶ サンプル:Lambda のユースケース
# ✅ 良い使い方:高階funcの引数としてのシンプルな 1 行変換
numbers = [1, 2, 3, 4]
result = list(map(lambda x: x ** 2, numbers))
# ❌ 悪い使い方:複数行必要な複雑なロジック — 通常の def funcを使用
7. よくあるユースケース
- データパイプライン:
map()→filter()→sorted()を連鎖させてデータ処理 - カスタムソート:
lambdaをkeyパラメータとして様々なソートルールに使用 - イベントコールバック:GUI や Web フレームワークに関数を引数として渡す
- クロージャファクトリ:外側の関数が内側の関数を返して「パラメータ化された」機能を実現
- 遅延評価:高階関数が必要になるまで計算を延期
❓ よくある質問
map() とリスト内包表記、どちらが優れていますか?map() の利点:① 既存の関数名がある場合に短い(map(str.upper, seq) vs [s.upper() for s in seq])。② 遅延イテレータを返すため、大規模データでメモリを節約。ほとんどの場合、リスト内包表記が良い選択です。📖 まとめ
- Python では関数は第一級オブジェクト——代入、受け渡し、返却が可能
map(f, seq)は各要素に関数を適用。list()でリストに変換filter(f, seq)は関数が True を返す要素を選択sorted(seq, key=f)はカスタムソートに関数を受け入れreduce(f, seq)は値を累積。functoolsからインポート- Lambda
lambda params: expressionはシンプルなシナリオ向けの無名 1 行関数
📝 練習問題
-
基本(難易度 ⭐):
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]として、map()とfilter()を使って:奇数のみを抽出し、その平方を計算してください。ヒント:最初にfilterで奇数を抽出、次にmapで平方を計算。 -
中級(難易度 ⭐⭐):辞書のリスト
products = [{"name": "A", "price": 100}, {"name": "B", "price": 80}, {"name": "C", "price": 120}]が与えられたとき、sorted()を使って価格の降順でソートし、名前と価格を出力してください。 -
挑戦(難易度 ⭐⭐⭐):
reduce()を使ってflatten(nested_list)関数を実装してください。ネストしたリストを 1 レベル平坦化します。例:flatten([[1, 2], [3, 4], [5]])は[1, 2, 3, 4, 5]を返します。ヒント:reduceで毎回+を使って 2 つのリストを結合。次に同じものをリスト内包表記で実装し、アプローチを比較してください。