Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonのLambda関数入門:名前のない匿名関数の基本と使い方

PythonのLambda関数(ラムダ関数)は、1行で記述できる匿名関数です。リストのフィルタリング、文字列の大文字・小文字変換、数値の掛け算など、名前を必要としない単純な処理にLambda式を活用すると、コードを簡潔に保つことができます。


なぜ関数が必要なのか

プログラムの中で同じような処理を何度も実行する場合、コードをその都度書き込むのは非効率です。処理の内容を変更したいとき、同じコードが書かれている箇所をすべて修正しなければならず、コードベースが大きくなるほど修正にかかる手間と時間は膨らみます。

そこで役立つのが関数です。Pythonには、素早く関数を宣言できる特別な種類の関数「匿名関数」が用意されており、それがLambda式です。

この記事では、PythonのLambda関数を使って繰り返し処理を効率化する方法を解説します。実際のコード例も2つ紹介するので、読み終わる頃には自分でLambda関数を書けるようになっているはずです。

関数とは何か

プログラミングにおける関数とは、特定のタスクを実行するコードのまとまり(ブロック)のことです。

開発者が関数を使う大きな理由のひとつは、コードの重複を減らせる点にあります。処理を関数としてまとめておけば、プログラム内のどこからでも呼び出せるため、同じコードを何度も書く必要がなくなります。

また、関数を使うとコードの保守性も向上します。処理内容を変更したい場合も、関数の中身を修正するだけで済み、コピペされた複数箇所のコードを書き直す必要がありません。

Pythonの関数の例を見てみましょう。

def say_hello(name):
    print("Hello there, " + name)

say_hello("Arthur")

このコードを実行すると、「Hello there, Arthur」と出力されます。

このような通常の関数は便利ですが、「文字列のリスト内のすべての文字列を小文字にする」といった簡単な処理に関数を定義するのは、やや冗長に感じられます。コードを動かすために、新しい関数に名前を割り当てる必要があるからです。こうした場面で活躍するのがLambda関数です。

Lambda関数とは何か

Lambda関数とは、名前を付けずに定義できる関数のことです。名前が不要であることから「匿名関数」とも呼ばれます。先ほどの関数は「def」を使って名前付きで定義しましたが、Lambda関数は「lambda」というキーワードを使って定義し、名前は必要ありません。

Lambda関数の最大のメリットは、1行で書けることです。何度も実行したい簡単な処理がある場合に特に便利です。Lambda関数が役立つ場面の例をいくつか挙げます。

  • 数値の掛け算
  • 文字列の大文字・小文字への変換
  • リストのフィルタリング

PythonでLambda関数を作成する構文は以下のとおりです。

name = lambda 引数: 式

Lambda関数に指定できる引数の数に制限はありません。具体的な例でLambda関数の動作を確認しましょう。数値を7倍する処理を考えます。通常の関数を使うと、次のように書けます。

def multiply_by_seven(number):
    return number * 7

print(multiply_by_seven(2))

このコードを実行すると「14」が出力されます。

このコードは正しく動作しますが、必ずしも効率的とは言えません。関数名と引数の定義に1行、値の計算と返却に1行を使っています。ここをより効率化するために、Lambda関数を使ってみましょう。

同じ処理をLambda関数で書くと、次のようになります。

multiply_by_seven = lambda n: n * 7

print(multiply_by_seven(2))

実行結果は同じく「14」です。出力は同じですが、通常の関数ではなくLambda関数を使っている点が異なります。このコードの構成要素を分解すると以下のとおりです。

  • lambda:Lambda関数を宣言することを示すキーワード
  • n:関数の引数
  • n * 7:Lambda関数に指定された単一の式

Lambda関数はどんな場面で使うのか

Lambda関数はPythonで幅広い用途に活用できます。先ほどの例では数値の掛け算に使いましたが、それ以外にもよく使われる場面がいくつかあります。

特に多いのが、reduce()関数、map()関数、filter()関数といった組み込み関数と組み合わせて使うパターンです。また、リスト内包表記と併用して繰り返し処理を行うこともあります。

ここで、パン屋を経営していると仮定しましょう。販売している焼き菓子のリストから、パイだけを抽出したリストを作りたいとします。次のようなコードで実現できます。

baked_goods = ['Blondie', 'Chocolate Chip Cookie', 'Apple Pie', 'Pecan Pie', 'Blackberry Pie', 'Scone']

pies = filter(lambda pie: "Pie" in pie, baked_goods)

print(list(pies))

このコードを実行すると、次の結果が出力されます。

['Apple Pie', 'Pecan Pie', 'Blackberry Pie']

処理の流れを分解して見ていきましょう。最初の行では、焼き菓子のリストを定義しています。次に、filter()関数を使って、「Pie」という単語を含む焼き菓子だけを抽出しました。filter()関数により、「baked_goods」リストの各要素を順番に走査し、特定の条件を満たさない項目を除外できます。

条件の判定には、各文字列に「Pie」が含まれているかをチェックし、含まれている場合のみその文字列を返すLambda関数を定義しました。このLambda関数は次の部分です。

lambda pie: "Pie" in pie

この例から分かるように、PythonのLambda関数には名前が不要です。従来の関数と違い、コードの中にインラインで直接記述できます。条件を満たす項目があればLambda式はTrueを返し、満たさなければ何も返しません。

最後に、変数「pies」をリストに変換してコンソールに出力しています。これは、filter()関数が独自のフィルタオブジェクトを返すため、パイの一覧を確認するにはlist()を使ってリストに変換する必要があるからです。

まとめ

Lambda関数(匿名関数)を使うと、名前を付けずに関数を定義できます。コード内で同じ処理を何度も実行したい場合に便利な機能です。

たとえば、数値を別の数値で掛け算したいときや、リストから特定の条件に合う項目だけを抽出したいときに、Lambda関数を活用できます。まずは簡単な処理から試して、Lambda関数の使い方に慣れていきましょう。

  1. Pythonのissubset()関数とは?部分集合の判定方法を実例付きで解説

    本記事では、Python標準ライブラリに用意されているissubset()関数の仕組みと使い方について詳しく解説します。 issubset()メソッドは、あるセット(集合)のすべての要素が、引数として渡した別のセットにも含まれている場合にブール値のTrueを返し、1つでも含まれていない要素があればFalseを返します。 下の図では、BはAの部分集合です。もしAとBが同一のセットであれば、両者は互いに部分集合の関係にあるといえます。つまり、両方のセットがまったく同じ要素を持っているということを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値

  2. Pythonのintersection()関数とは?集合の共通要素(積集合)を求める方法

    この記事では、Pythonのセット(集合)に対して実行できるintersection()関数について詳しく解説します。数学における「積集合(インターセクション)」とは、2つの集合から共通する要素を見つけ出すことを指します。構文<セット名>.intersection(<セットa1>, <セットa2>, …)戻り値引数として渡されたすべての集合に共通する要素(積集合)が、新しいセットとして返されます。使用例set_1 = {t,u,t,o,r,i,a,l} set_2 = {p,o,i,n,t} set_3 = {t,u,t} # 2つの集合の積集合 print