Pythonのlambda式(無名関数)の「使い方」と「def文との違い」

この記事では、Pythonで関数を簡潔に定義できる『lambda式(ラムダ式、無名関数)』について、以下の内容をサンプルコードを用いて分かりやすく解説します。

  • lambda式(ラムダ式、無名関数)とは
  • def文とlambda式の違い
  • lambda式の構文
  • lambda式の使いどころ

lambda式(ラムダ式、無名関数)とは

lambda式(ラムダ式、無名関数)とは

lambda式は、Pythonで無名関数を作成するための構文です。通常、関数はdef文を使って名前を付けて定義しますが、lambda式を使うことでその場で簡潔に関数を定義できます。特に、関数に名前を付ける必要がない場合や、短い処理を一時的に行いたいときに便利です。

def文とlambda式の違い

def文とlambda式には、次のような違いがあります。

  • def
    • 名前付きの関数を宣言するためのステートメントです。関数名を付けて事前に定義します。
  • lambda
    • その場で1行で無名関数を定義できる式です。名前を付ける必要がなく、一時的に関数を作成するのに便利です。

簡単なサンプルコードで、def文とlambda式の違いを見てみましょう。

def文を使った2乗を求める関数

通常の関数はdef文を使って次のように定義します。

def square(x):
    return x * x

print(square(3))  # 出力: 9

lambda式を使った2乗を求める関数

一方、lambda式を使うと、同じ処理をもっとシンプルに記述できます。

square = lambda x: x * x
print(square(3))  # 出力: 9

lambda式を使うと関数名を付ける必要がなく、短く記述できることがわかります。

PEP8でのlambda式に関する注意点

Pythonのコーディング規約PEP8では、lambda式に名前を付けることは非推奨とされています。lambda式は本来、短い処理を匿名で書くためのものであり、関数に名前を付ける場合はdef文を使うべきとされています。例えば、自動チェックツールでは次のような警告が出ることがあります。

Do not assign a lambda expression, use a def

この警告が示す通り、名前付きの関数を作成する場合は、def文を使う方が望ましいとされています。ただし、これはコーディング規約上の推奨であり、文法的にはエラーではなく、実行可能です。

lambda式の構文

lambda式の基本的な構文は次の通りです。

lambda 引数: 処理内容

引数は複数指定することができ、処理内容は1行で書きます。例えば、2つの数を掛け算するlambda式は次のように記述します。

multiply = lambda x, y: x * y
print(multiply(2, 5))  # 出力: 10

注意点として、lambda式は複数行にわたる処理を定義することはできません。複雑な処理にはdefを使う方が適しています。

lambda式の使いどころ

lambda式は関数に名前を付ける必要がない一時的な処理や、短い処理を簡潔に書きたい場合に便利です。特に、filter関数、map関数、sorted関数など、関数を引数に取る関数と組み合わせて使われることが多いです。具体的な使用例をいくつか見ていきましょう。

リストの要素を変更する

例えば、リストの要素をすべて2倍にしたいとき、lambda式を使って次のように記述できます。

numbers = [1, 2, 3]
doubled = list(map(lambda x: x * 2, numbers))
print(doubled)  # 出力: [2, 4, 6]

これをdef文で記述すると、以下のようになります。

def double(x):
    return x * 2

numbers = [1, 2, 3]
doubled = list(map(double, numbers))
print(doubled)  # 出力: [2, 4, 6]

lambda式の方が短く、シンプルに書けることがわかります。

条件に基づいて要素を抽出する

数値リストから特定の条件に合う要素だけを抽出する際にも、lambda式が役立ちます。

numbers = [10, 25, 30, 45]
filtered = list(filter(lambda x: x > 20, numbers))
print(filtered)  # 出力: [25, 30, 45]

これをdef文で記述すると、以下のようになります。

def is_greater_than_20(x):
    return x > 20

numbers = [10, 25, 30, 45]
filtered = list(filter(is_greater_than_20, numbers))
print(filtered)  # 出力: [25, 30, 45]

lambda式を使うことで、条件に合った要素を簡潔に抽出できます。

リストをソートする

lambda式は、リストをソートする際にも便利です。たとえば、次のように学生のリストを年齢でソートできます。

students = [('John', 25), ('Alice', 22), ('Bob', 23)]
sorted_students = sorted(students, key=lambda student: student[1])
print(sorted_students)  # 出力: [('Alice', 22), ('Bob', 23), ('John', 25)]

これをdef文で記述すると、以下のようになります。

def get_age(student):
    return student[1]

students = [('John', 25), ('Alice', 22), ('Bob', 23)]
sorted_students = sorted(students, key=get_age)
print(sorted_students)  # 出力: [('Alice', 22), ('Bob', 23), ('John', 25)]

このように、lambda式を使うとリストのソート処理を簡潔に記述することができます。

本記事のまとめ

この記事では『lambda式(ラムダ式、無名関数)』について、以下の内容を説明しました。

  • lambda式(ラムダ式、無名関数)とは
  • def文とlambda式の違い
  • lambda式の構文
  • lambda式の使いどころ

お読み頂きありがとうございました。