[Pythonのはじめ方] Part11: ラムダ式と関数の引数化

Python

短い関数をその場で定義!関数をデータのように扱おう!

これまでのステップで、関数の定義方法や呼び出し方を学びましたね!💪 このセクションでは、Pythonの強力な機能である「ラムダ式」と「関数を引数として渡す」方法について学びます。これらをマスターすると、より簡潔で効率的なコードを書けるようになりますよ!

ラムダ式(無名関数)とは? 🤔

ラムダ式は、名前を持たない小さな関数を定義するための簡潔な方法です。無名関数とも呼ばれます。通常のdef文で関数を定義するよりも手軽に、一行で関数を作成できます。

ラムダ式の基本的な構文は次のとおりです。

lambda 引数1, 引数2, ...: 式

lambdaキーワードの後に引数を記述し、コロン:の後にその引数を使った式を記述します。この式の結果が、ラムダ関数の戻り値となります。

通常の関数定義との比較

例えば、受け取った数値を2倍にする関数を考えてみましょう。

通常の関数定義:

def double(x):
  return x * 2

print(double(5))  # 出力: 10

ラムダ式を使った場合:

double_lambda = lambda x: x * 2

print(double_lambda(5)) # 出力: 10

このように、ラムダ式を使うと一行で同じ機能を持つ関数を定義できます。ただし、ラムダ式は単純な処理に限定され、複数行にわたる処理や複雑な文(if文やfor文など)を含むことはできません。

ラムダ式の例

  • 2つの数値を足す: lambda a, b: a + b
  • 文字列の長さを返す: lambda s: len(s)
  • 数値が偶数かどうかを判定する: lambda n: n % 2 == 0
💡 ポイント: ラムダ式は、主に他の関数の引数として一時的な関数を渡したい場合によく利用されます。

関数を引数として渡す (高階関数) 🧐

Pythonでは、関数もオブジェクトの一種として扱われます。これは、関数を変数に代入したり、他の関数の引数として渡したり、関数の戻り値として返したりできることを意味します。関数を引数として受け取ったり、関数を戻り値として返す関数のことを高階関数 (Higher-order function) と呼びます。

関数を引数に取る関数の例

def apply_twice(func, arg):
  """指定された関数を引数に2回適用する"""
  return func(func(arg))

def add_one(x):
  """数値に1を加える"""
  return x + 1

# add_one関数をapply_twiceに渡す
result = apply_twice(add_one, 10)
print(result)  # 出力: 12 (add_one(add_one(10)) と同じ)

# ラムダ式を直接渡すことも可能
result_lambda = apply_twice(lambda x: x * 3, 2)
print(result_lambda) # 出力: 18 ((lambda x: x * 3)((lambda x: x * 3)(2)) と同じ → 3 * (3 * 2) = 18)

上記のapply_twice関数は、第一引数として関数funcを受け取り、第二引数argに対してその関数を2回適用しています。このように、処理内容(関数)を外部から注入できるため、汎用性の高い関数を作成できます。

組み込み関数での利用例

関数を引数として渡す機能は、Pythonの組み込み関数で非常によく使われています。特にmap(), filter(), sorted() などでラムダ式と組み合わせて使われることが多いです。

map()関数

map(function, iterable)は、iterable(リストなど)の各要素にfunctionを適用し、その結果を返すイテレータを生成します。

numbers = [1, 2, 3, 4, 5]

# 各要素を2乗する
squared_numbers = map(lambda x: x**2, numbers)
print(list(squared_numbers)) # 出力: [1, 4, 9, 16, 25]

# mapオブジェクトはイテレータなので、list()でリストに変換しています

filter()関数

filter(function, iterable)は、iterableの各要素にfunctionを適用し、結果がTrueとなる要素だけを集めたイテレータを生成します。

numbers = [1, 2, 3, 4, 5, 6]

# 偶数だけを抽出する
even_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(even_numbers)) # 出力: [2, 4, 6]

sorted()関数

sorted(iterable, key=function)は、iterableをソートした新しいリストを返します。key引数に関数を指定すると、その関数の戻り値に基づいてソートが行われます。

students = [
    {'name': 'Alice', 'score': 85},
    {'name': 'Bob', 'score': 92},
    {'name': 'Charlie', 'score': 78}
]

# score(点数)に基づいて昇順でソートする
sorted_students = sorted(students, key=lambda student: student['score'])
print(sorted_students)
# 出力: [{'name': 'Charlie', 'score': 78}, {'name': 'Alice', 'score': 85}, {'name': 'Bob', 'score': 92}]

# score(点数)に基づいて降順でソートする場合 (reverse=Trueを追加)
sorted_students_desc = sorted(students, key=lambda student: student['score'], reverse=True)
print(sorted_students_desc)
# 出力: [{'name': 'Bob', 'score': 92}, {'name': 'Alice', 'score': 85}, {'name': 'Charlie', 'score': 78}]
⚠️ 注意: map()filter()が返すのはリストではなくイテレータです。結果をリストとして扱いたい場合はlist()で変換する必要があります。

メリット ✨

ラムダ式と関数の引数化を理解し、活用することにはいくつかのメリットがあります。

  • コードの簡潔化: 一時的にしか使わない単純な関数をdefで定義する手間が省け、コードが短くなります。
  • 可読性の向上 (場合による): map, filter, sortedなどと組み合わせることで、何を行っているかが明確になることがあります。ただし、複雑すぎるラムダ式は逆に可読性を下げる可能性もあります。
  • 汎用的な関数の作成: 処理の一部を関数として外部から渡せるようにすることで、再利用性の高い柔軟な関数を作成できます。

まとめ 🎉

今回は、名前のない小さな関数を作るためのラムダ式と、関数自体を値として扱い、他の関数の引数として渡す方法について学びました。

  • ラムダ式は lambda 引数: 式 の形で定義します。
  • 関数はオブジェクトであり、変数に入れたり、引数として渡したりできます。
  • map(), filter(), sorted() などの組み込み関数では、処理内容をラムダ式などで指定することがよくあります。

これらのテクニックは、特にデータ処理やイベント処理などで強力な武器となります。最初は少し難しく感じるかもしれませんが、実際にコードを書いて使ってみることで、その便利さを実感できるはずです! 😉

次のステップでは、Pythonに標準で用意されている便利な機能群「標準ライブラリ」の使い方を学びます。お楽しみに!

参考情報 📚

コメント

タイトルとURLをコピーしました