Pythonのlambda式:コンパクトな無名関数の利用法

Pythonのlambda式は、簡潔なコードを書くための強力なツールです。この記事では、lambda式の基本的な構文から始め、その利用法と便利さについて探っていきます。高階関数への適用や一時的な処理のための使い方、簡潔な関数の表現など、さまざまなケースでのlambda式の活用例を紹介します。さあ、Pythonのlambda式の魅力的な世界に飛び込んでみましょう!

イントロダクション

lambda式は、Pythonにおいて無名関数(名前のない関数)を作成するための構文です。通常の関数定義とは異なり、関数に名前を付けずに直接式を定義することができます。

  • 構文

lambdaキーワードを使用して無名関数を宣言し、引数と式を指定します。引数はカンマで区切って複数指定することもできますが、式は1つしか指定することができません。
lambda式は、引数が与えられるとその場で評価され、結果が返されます。このため、一時的に利用される短い処理に便利です。

lambda 引数: 式

Lambda式の利点

短い処理の簡潔な表現

一行の短い処理を簡潔に表現するための手段です。関数の名前や冗長な構文を省略することで、コードがシンプルで読みやすくなります

高階関数の引数としての活用

map()filter()などの高階関数は、lambda式を受け取ることができます。これにより、リストやイテレータの要素に対して処理を行う際に、関数を簡潔に指定できます。

コードの局所性の強化

lambda式は、関数のスコープが狭くなるため、コードの局所性を高める効果があります。特定の処理の範囲内で使用される関数をlambda式で定義することで、関数の意図が明確になり、コードのメンテナンス性が向上します。



応用例

高階関数の引数として使う例を記載します。

map関数

リストの各要素を2倍して1足す

num_listの各要素に対して特定の操作(2倍して1足す)を行っています。map()関数は、第一引数として指定された関数(ここではlambda関数)を、第二引数で指定されたリストの各要素に適用します。lambda関数の引数はnumであり、num_listの各要素を受け取って処理しています。
map関数の戻り値(イテレータ)をlist関数でlistに変換ししています。

num_list = [2, 5, 7,10,-2]

num_list = list(map(lambda num: num * 2 + 1, num_list))

print(num_list)

lambda式を使わない場合はfor ループ等を使って各要素について、処理を行うことになるので、より簡潔に記述できます

実行結果

[5, 11, 15, 21, -3]

文字列リストの各要素に、追加する

mon_list = ["1","2","3","4","5","6"]

mon_list = list(map(lambda mon: "2023年" + mon + "月", mon_list))

print(mon_list)

実行結果

['2023年1月', '2023年2月', '2023年3月', '2023年4月', '2023年5月', '2023年6月']



Filter関数

リストから偶数を抽出する

num_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

num_list =list(filter(lambda num: num%2 == 0, num_list))

print(num_list)

実行結果

[2, 4, 6, 8, 10, 12]

リストから”ber”で終わる月(英語)を抽出する

mon_list = ["January","February","March","April","May",
    "June","July","August","September","October","November","December"]

mon_list = list(filter(lambda mon: mon[-3:]=="ber", mon_list))

print(mon_list)

実行結果

['September', 'October', 'November', 'December']


制限と注意点

単一の式のみ

lambda式は単一の式しか持つことができません。複数の文や制御構造(if文やループなど)を含むことはできません。

引数の制約

ambda式の引数はカンマで区切って複数指定することができますが、デフォルト引数や可変長引数を指定することはできません。また、キーワード引数もサポートしていません

無名関数

つまり名前を持ちません。そのため、再帰呼び出しや他の関数内での参照ができません。


デバッグ

デバッグ時に特定の関数を追跡することが難しくなります。エラーメッセージにはlambda式の位置が明示されますが、処理の内容が分かりにくくなることがあります。


補足

他の応用例については、今後追加していきます。

いいなと思ったら応援しよう!