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式の位置が明示されますが、処理の内容が分かりにくくなることがあります。
補足
他の応用例については、今後追加していきます。