Python: 高階関数と Lambda

最終更新:2026-09-22

Python では、関数も「値」です——変数に代入したり、他の関数に渡したりすることが、数値や文字列と同じようにできます。これにより非常に簡潔でエレガントなコードが可能になります。高階関数は、他の関数を引数として受け取ったり、関数を返したりする関数です。このレッスンはあなたに新しい世界を開くでしょう。


関連する組み込み関数:filter() sorted() list() lambda map() max() sum() False True None

1. 関数は第一級オブジェクト

Python では、関数は他の値と同じように操作できます:

▶ サンプル:関数を値として扱う

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功
💡 「関数が第一級オブジェクトである」とはどういう意味ですか? 関数が整数、文字列、リストと同じレベルにあることを意味します——変数に代入したり、リストに入れたり、引数として渡したり、値として返したりできます。このプログラミングパラダイムを「関数型プログラミング」と呼びます。



2. map():一括変換

map() はシーケンス内のすべての要素に関数を適用し、新しいイテレータを返します:

▶ サンプル:map による一括変換

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 执行成功

map() はリスト内包表記と同等: map(f, seq) ≈ [f(x) for x in seq]。どちらを使うかは好みの問題です——内包表記の方がより「Python らしい」です。



3. filter():一括フィルタリング

filter() は関数が True を返す要素を選択します:

▶ サンプル:filter によるデータ抽出

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 执行成功

filter() も内包表記と同等: filter(f, seq) ≈ [x for x in seq if f(x)]。関数として None を使うと、すべての falsy な値(""、0、None、False など)を除去することと同等です。



4. 高度な sorted() の使い方

レッスン 11 では sorted() の key パラメータを学びました。さらに深く掘り下げましょう:

▶ サンプル:sorted を使ったカスタムソート

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 执行成功

▶ サンプル:マルチレベルソート(難易度 ⭐⭐)

▶ 試してみよう

出力:

TEXT 📖 参照専用
Bob: 92
Diana: 92
Alice: 85
Charlie: 85


5. reduce():累積計算

reduce() はシーケンス内の要素を累積し、一度に 2 つの要素に関数を適用します。組み込み関数ではなく、functools からインポートします:

▶ サンプル:reduce による累積計算

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 执行成功

(1) reduce() の実行過程

PYTHON
# 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 通常関数

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功

(2) 完全な Lambda 構文

PYTHON
lambda parameters: expression
# ↑ 以下と同等
def anonymous_function(parameters):
    return expression

(3) 複数パラメータ

▶ サンプル:複数パラメータの Lambda

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 执行成功

(4) Lambda を使うタイミング

▶ サンプル:Lambda のユースケース

TEXT 📖 参照専用
# ✅ 良い使い方:高階funcの引数としてのシンプルな 1 行変換
numbers = [1, 2, 3, 4]
result = list(map(lambda x: x ** 2, numbers))

# ❌ 悪い使い方:複数行必要な複雑なロジック — 通常の def funcを使用
💡 Lambda の経験則: ロジックが複数の式や if-elif 分岐を必要とするなら、lambda を使わず通常の関数を書きましょう。Lambda のエレガントさはその「ミニマリズム」にあります。



7. よくあるユースケース


関連する組み込み関数:filter() sorted() list() lambda map() max() sum() False True None

❓ よくある質問

Q map() とリスト内包表記、どちらが優れていますか?
A Python コミュニティはリスト内包表記を好みます——より直感的で、より Python らしいです。map() の利点:① 既存の関数名がある場合に短い(map(str.upper, seq) vs [s.upper() for s in seq])。② 遅延イテレータを返すため、大規模データでメモリを節約。ほとんどの場合、リスト内包表記が良い選択です。
Q reduce() は現代の Python でも使われていますか?
A あまり使われていません。Guido 自身が reduce() を好んでおらず、理解が難しいと考えていました。ほとんどの reduce() のシナリオはループやより直接的な関数(sum()、max() など)で置き換えられます。ただし、reduce() は関数型プログラミングにおける重要な概念です。

📖 まとめ


📝 練習問題

  1. 基本(難易度 ⭐):nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] として、map() と filter() を使って:奇数のみを抽出し、その平方を計算してください。ヒント:最初に filter で奇数を抽出、次に map で平方を計算。

  2. 中級(難易度 ⭐⭐):辞書のリスト products = [{"name": "A", "price": 100}, {"name": "B", "price": 80}, {"name": "C", "price": 120}] が与えられたとき、sorted() を使って価格の降順でソートし、名前と価格を出力してください。

  3. 挑戦(難易度 ⭐⭐⭐):reduce() を使って flatten(nested_list) 関数を実装してください。ネストしたリストを 1 レベル平坦化します。例:flatten([[1, 2], [3, 4], [5]]) は [1, 2, 3, 4, 5] を返します。ヒント:reduce で毎回 + を使って 2 つのリストを結合。次に同じものをリスト内包表記で実装し、アプローチを比較してください。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%