第15回.lambda(ラムダ式、無名関数)と三項演算子

関数は一連の処理をまとめることで再利用可能にした、プログラム内の小さなプログラムのようなものです。
Pythonでの関数の記述方法としてlambda(ラムダ式、無名関数)があります。
関数を引数に取る関数(高階関数)を呼び出す場合などで、その場で関数を定義したい場合にlambdaは良く使われます。
目次
lambda(ラムダ式)の基本
lambda(ラムダ式)は、名前を持たない無名関数を作成できます。
繰り返し使う事のない関数オブジェクトを作成するときに適していて、
高階関数(関数を引数に取る関数)の引数に関数オブジェクトを渡す場合などに使われます。
関数を1行で済ますことができ、1回だけ使えば良いという場合に気軽に書けることが良さになります。
複数個所で同じラムダ式を書くのなら、def文で通常の関数にしたほうが良いでしょう。
したがって、使用場面はある程度限られてしまいますが、Pythonをやるなら是非習得しておきたいものです。
lambdaの構文
def 無名(引数1, 引数2=値, ...):
return 戻り値の式
lambda 引数1, 引数2, ... : 戻り値の式

lambda 引数1, 引数2=値: 戻り値の式
lambda *args1, **kwargs: 戻り値の式
単純に次のように覚えておけば良いでしょう。
lambdaの使い方:print()関数


lambda(ラムダ式)に名前を付けることはPEP8では推奨されていません。
直接ラムダ式に値を渡してからprintの引数に指定してみます。

結果の6がprint関数に渡されます。
lambdaの使い方:sorted()関数
sorted()関数の構文
第10回.タプル(tuple型、イミュータブル):タプルの並べ替え(sorted関数)
sorted(iterable, *, key=None, reverse=False)
リストのそれぞれの要素から比較キーを取り出すのに使います。
文字列長で並べ替える
lang = ("Python","VBA","GAS","Java","C","JavaScript")
print(sorted(lang,key=len))

組み込みに無い方法で並べ替える場合は、自作関数を作成します。
文字を後ろの文字から見た順に並べ替える
def rev(s):
return s[::-1]
lang = ("Python","VBA","GAS","Java","C","JavaScript")
print(sorted(lang,key=rev))

※大文字小文字の順に並びます。
※[::-1]、start,stop,stepこのstepに-1だけを指定することで文字列を逆順にしています。
lang = ("Python","VBA","GAS","Java","C","JavaScript")
print(sorted(lang,key=lambda s:s[::-1]))

lambda(ラムダ式)は関数なので、受け取った値に対して決められた処理を行い値を返します。
sorted()関数は、第1引数の値とlambda(ラムダ式)の戻り値を使い並べ替えを行います。
三項演算子:lambdaで条件分岐
3項演算子の構文
if 条件式:
真の式
else:
偽の式
真の式 if 条件式 else 偽の式

演算子は、各項の値によって何らかの値を返すものです。
二項で演算を行い値を返します。
三項演算子は、三項で演算を行い値を返します。
条件式を評価し、Trueなら第1項の「真の式」を返し、Falseなら「偽の式」を返します。

したがってif文で分岐させることはできません。
そこで、この三項演算子を使って条件分岐させます。
3の倍数は"OK"、以外は"NG"
print((lambda n:"OK" if n % 3 == 0 else "NG")(3))
print((lambda n:"OK" if n % 3 == 0 else "NG")(5))

ネストの例題は一番最後に掲載しています。
filter()関数とlambda(ラムダ式)
filter()関数
function | 引数をとる関数を指定します。 |
iterable | シーケンスか反復をサポートするコンテナかイテレータです。 |
戻り値は、リストではなくfilterオブジェクトです。
3の倍数だけ出力:1~10
print(list(filter(lambda n:n if n % 3 == 0 else None, range(1,11))))

map()関数とlambda(ラムダ式)
map()関数
function | 引数をとる関数を指定します。 |
iterable | シーケンスか反復をサポートするコンテナかイテレータです。 |
追加のiterable引数が渡されたら、functionはその数だけの引数を取らなければならず、全てのイテラブルから並行して取られた要素に適用されます。
複数のイテラブルが与えられたら、このイテレータはその中の最短のイテラブルが尽きた時点で止まります。
戻り値は、リストではなくmapオブジェクトです。
3の倍数は3倍、以外は2倍:1~10
print(list(map(lambda n:n * 3 if n % 3 == 0 else n * 2, range(1,11))))

FizzBuzz問題をやってみましょう
・5で割り切れるときは"Buzz"
・両方で割り切れるときは"FizzBuzz"
print(list(map(lambda n:"Fizz Buzz" if n % 15 == 0 else "Fizz" if n % 3 == 0 else "Buzz" if n % 5 == 0 else n, range(1,21))))

同じテーマ「Python入門」の記事
第16回.Pythonの引数は参照渡しだが・・・
新着記事NEW ・・・新着記事一覧を見る
イータ縮小ラムダ(eta reduced lambda)|エクセル入門(2023-11-20)
PIVOTBY関数(縦軸と横軸でグループ化して集計)|エクセル入門(2023-11-19)
GROUPBY関数(縦軸でグループ化して集計)|エクセル入門(2023-11-18)
PY関数(Pythonコードをセル内で実行)|エクセル入門(2023-11-17)
画像「セルに配置」のVBAについて(365の新機能)|VBA技術解説(2023-11-13)
スピルのゴーストの範囲を選択するVBA|ツイッター出題回答 (2023-10-31)
エクセル試験3:月間の所定労働時間|エクセル練習問題(2023-10-04)
エクセル試験2:所得税の計算|エクセル練習問題(2023-10-04)
エクセル試験1:曜日別の平均客単価|エクセル練習問題(2023-10-04)
列全体を指定する時のRangeとColumnsの違い|ツイッター出題回答 (2023-09-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.条件分岐(IF)|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。