Python入門
lambda(ラムダ式、無名関数)と三項演算子

Pythonの初心者向け入門解説、人気のプログラミング言語Python
公開日:2020-09-20 最終更新日:2022-05-24

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


Python lambda ラムダ式 無名関数

関数は一連の処理をまとめることで再利用可能にした、プログラム内の小さなプログラムのようなものです。
Pythonでの関数の記述方法としてlambda(ラムダ式、無名関数)があります。


lambdaは無名関数を定義するものです。
関数を引数に取る関数(高階関数)を呼び出す場合などで、その場で関数を定義したい場合にlambdaは良く使われます。

三項演算子についても併せて使えるようになっておきましょう。

関数の定義についての基本は以下を参照してください。
第13回.関数の定義(def文)と引数
・関数の呼び出し ・関数オブジェクト ・いろいろな引数指定 ・関数のDocstring
第14回.関数内関数(関数のネスト)とスコープ
・関数内関数(関数のネスト) ・スコープとは ・ローカルスコープ(Local scope) ・エンクロージングスコープ(Enclosing scope) ・グローバルスコープ(Global Scope) ・ビルトインスコープ(Built-in scope) ・ミュータブルのコンテナオブジェクトの値は書き換えられる


目次

lambda(ラムダ式)の基本

def文で関数に名前を付けて定義しますが、
lambda(ラムダ式)は、名前を持たない無名関数を作成できます。

lambda(ラムダ式)は1行で無名関数を作成できるものです。
繰り返し使う事のない関数オブジェクトを作成するときに適していて、
高階関数(関数を引数に取る関数)の引数に関数オブジェクトを渡す場合などに使われます。

lambda(ラムダ式)は通常のdef文で全て書けるものです。
関数を1行で済ますことができ、1回だけ使えば良いという場合に気軽に書けることが良さになります。
複数個所で同じラムダ式を書くのなら、def文で通常の関数にしたほうが良いでしょう。
したがって、使用場面はある程度限られてしまいますが、Pythonをやるなら是非習得しておきたいものです。

lambdaの構文

def 無名(引数1, 引数2=値, ...):
    return 戻り値の式
これをlambda(ラムダ式)で書くと、
lambda 引数1, 引数2, ... : 戻り値の式
lambdaと書いた後に、引数を列挙し、: コロン書いた後に戻り値の式を書きます。

Python lambda ラムダ式 無名関数

デフォルト値を指定した引数や可変長の引数(*args,**kwargs)も使用できます。
lambda 引数1, 引数2=値: 戻り値の式
lambda *args1, **kwargs: 戻り値の式

単純に次のように覚えておけば良いでしょう。

lambda 引数 : 戻り値


lambdaの使い方:print()関数

単純な例でlambda(ラムダ式)の書き方と動作について理解しましょう。

Python lambda ラムダ式 無名関数

これをlambdaで書くと、

Python lambda ラムダ式 無名関数

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

Python lambda ラムダ式 無名関数

lambda式の引数として2を与えています。
結果の6がprint関数に渡されます。

lambdaの使い方:sorted()関数

sorted()関数の構文

詳細は以下を参照してください。
第10回.タプル(tuple型、イミュータブル):タプルの並べ替え(sorted関数)

イテラブルの要素を並べ替えた新たなオブジェクトを返します。
sorted(iterable, *, key=None, reverse=False)

keyには、引数をとる関数を指定します。
リストのそれぞれの要素から比較キーを取り出すのに使います。

まずは普通に書くsorted()関数の使用例

文字列長で並べ替える

lang = ("Python","VBA","GAS","Java","C","JavaScript")
print(sorted(lang,key=len))
Python lambda ラムダ式 無名関数

これらは、strの関数や組み込み関数をkeyに指定したものです。
組み込みに無い方法で並べ替える場合は、自作関数を作成します。

文字を後ろの文字から見た順に並べ替える

まずはdef文で普通に関数を作って指定します。
def rev(s):
    return s[::-1]
lang = ("Python","VBA","GAS","Java","C","JavaScript")
print(sorted(lang,key=rev))
Python lambda ラムダ式 無名関数
※大文字小文字の順に並びます。
※[::-1]、start,stop,stepこのstepに-1だけを指定することで文字列を逆順にしています。

これをlambda(ラムダ式)を使って書き直すと、
lang = ("Python","VBA","GAS","Java","C","JavaScript")
print(sorted(lang,key=lambda s:s[::-1]))
Python lambda ラムダ式 無名関数

sorted()関数の第1引数の値が順次lambda(ラムダ式)に渡されます。
lambda(ラムダ式)は関数なので、受け取った値に対して決められた処理を行い値を返します。
sorted()関数は、第1引数の値とlambda(ラムダ式)の戻り値を使い並べ替えを行います。


三項演算子:lambdaで条件分岐

3項演算子の構文

if 条件式:
    真の式
else:
    偽の式
これを三項演算子を使って書くと、
真の式 if 条件式 else 偽の式
Python lambda ラムダ式 無名関数

if文と違い、三項演算子はあくまで演算子です。
演算子は、各項の値によって何らかの値を返すものです。

ほとんどの演算子は二項演算子です。
二項で演算を行い値を返します。
三項演算子は、三項で演算を行い値を返します。
条件式を評価し、Trueなら第1項の「真の式」を返し、Falseなら「偽の式」を返します。

Python lambda ラムダ式 無名関数

lambda(ラムダ式)は1行で書かなければなりません。
したがって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))
Python lambda ラムダ式 無名関数

三項演算子はネストすることもできます。
ネストの例題は一番最後に掲載しています。


filter()関数とlambda(ラムダ式)

filter()関数

第12回.組み込み関数一覧公式ドキュメント - filter()

iterableの要素のうちfunctionが真を返すものでイテレータを構築します。

filter(function, iterable)

function 引数をとる関数を指定します。
iterable シーケンスか反復をサポートするコンテナかイテレータです。

戻り値は、リストではなくfilterオブジェクトです。

3の倍数だけ出力:1~10

print(list(filter(lambda n:n if n % 3 == 0 else None, range(1,11))))
Python lambda ラムダ式 無名関数

filter()関数の戻り値をlist関数でリストにしてからprintに渡しています。


map()関数とlambda(ラムダ式)

map()関数

第12回.組み込み関数一覧公式ドキュメント - map()

fiterableの全ての要素にfunctionを適応させたイテレータを返します。

map(function, iterable, ...)

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))))
Python lambda ラムダ式 無名関数

map()関数の戻り値をlist関数でリストにしてからprintに渡しています。

FizzBuzz問題をやってみましょう

・3で割り切れるときは"Fizz"
・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 lambda ラムダ式 無名関数




同じテーマ「Python入門」の記事

第12回.組み込み関数一覧
第13回.関数の定義(def文)と引数
第14回.関数内関数(関数のネスト)とスコープ
第15回.lambda(ラムダ式、無名関数)と三項演算子
第16回.Pythonの引数は参照渡しだが・・・
第17回.リスト内包表記
第18回.例外処理(try文)とexception一覧
第19回.import文(パッケージ・モジュールのインポート)
第20回.フォルダとファイルの一覧を取得(os,glob,pathlib)
第21回.CSV読み込みとopen()関数とwith文
第22回.CSV読み書き(csvモジュール)


新着記事NEW ・・・新着記事一覧を見る

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ