=========================== lambda式の実践的な使い方 =========================== ``def`` を用いた関数の場合は直接引数として他の関数に渡すことはできず、どこか別の場所で定義してから渡す必要があるのに対し、 ``lambda`` 式はあくまで「式」なので、関数の引数として直接渡すことができる。 ちなみに、lambda式では、先ほどの .. code-block:: python f=(lambda a,b: a*a + b*b)(1,2) という代入式により名前を得ることができ、名前を持った関数 ``f`` も変数として扱うことができるが、無名のまま直接関数に渡される場合が多い。 わかりにくいので、例を紹介する。 lambda式でfor文処理を実装する方法 ----------------------------------- 例えば、様々な商品の価格を抜き出したリストがあり、そのリスト対して、消費税を上乗せした価格情報を取得する処理を実装するとする。 その場合、商品価格のリストをfor文を使用して以下のように実装することができる。 .. literalinclude:: price.py :linenos: :caption: price.py :emphasize-lines: 10-12 実行結果 .. code-block:: python [3240.0, 2700.0, 11340.0, 4644.0] 同じ処理内容を今度はlambda式を利用して実装する。 その際に、合わせて利用する関数が :py:func:`map` 関数である。 .. py:function:: map(function,iterable) pythonの組み込み関数で、 ``function`` の処理を与えて ``iterable`` の全ての要素に適用するイテレータを返します。 :function: 処理内容 :iterable: 処理対象のリスト、ディレクショナリなどの ``iterable`` . .. literalinclude:: pricelamb.py :linenos: :caption: pricelamb.py :emphasize-lines: 10-11 実行結果 .. code-block:: python [3240.0, 2700.0, 11340.0, 4644.0] このようにlambda式とmap関数を併用することで、for文の処理を実装することが可能である。 ちなみにdefを用いて記述すると、 .. literalinclude:: pricedef.py :linenos: :caption: pricedef.py :emphasize-lines: 10-14 実行結果 .. code-block:: python [3240.0, 2700.0, 11340.0, 4644.0] となる。 lambda式でif文処理を実装する方法 ----------------------------------- 次にfor文でリストの要素を一つ一つ処理する際に、if文の条件が入るケースについてもlambda式を活用できる。 同じく例として様々な商品の価格を抜き出したリストがあり、そのリストからある金額以上のものを抜き出し、価格の安い順に並べた情報を取得するプログラムを実装する。 今回はlambda式と合わせて :py:func:`filter` 関数を使用する。 .. py:function:: filter(function,iterable) pythonの組み込み関数で ``iterable`` の要素のうち ``function`` の処理をほどこし真を返す要素でイタレータを構築する(抽出する)。 :function: 関数処理 :iterable: 処理対象のリスト、ディレクショナリなどの ``iterable`` .. literalinclude:: if.py :linenos: :caption: if.py :emphasize-lines: 10-13 実行結果 .. code-block:: python [4300, 10500] これをlambda式を用いて書くと以下のようになる。 .. literalinclude:: iflamb.py :linenos: :caption: iflamb.py :emphasize-lines: 10-11 実行結果 .. code-block:: python [4300, 10500] また、defを用いて記述すると以下のようになる。 .. literalinclude:: ifdef.py :linenos: :caption: ifdef.py :emphasize-lines: 8-13 実行結果 .. code-block:: python [4300, 10500] lambda式でif文処理を実装する方法2 ----------------------------------- 先ほどはリストについてif文の処理を実施した。同じようにディレクショナリでもif文処理を実行することができる。 同じく例として様々な商品の価格を抜き出したリストがあり、そのリストからある金額以上のものを抜き出すプログラムを実装する。 .. literalinclude:: pricedic.py :linenos: :caption: pricedic.py :emphasize-lines: 18-19 実行結果 .. code-block:: python [('a', 3000), ('c', 10500), ('b', 2500), ('d', 4300)] [('c', 10500), ('d', 4300)] sorted関数のkeyパラメータとの使われ方 ---------------------------------------- .. py:function:: sorted(iterable, *, key=None, reverse=False) 組み込み関数で、``iterable`` の要素を並べ替え新たなリストを返す。 :``key``: 比較を行う前にリストの各要素に対して呼び出される関数を指定するパラメータである。 :``iterable``: 処理対象のリスト、ディレクショナリなどの ``iterable`` 並べ替えは、関数の実行結果を使って行われる。 .. literalinclude:: sort.py :linenos: :caption: sort.py 実行結果 .. code-block:: python [[0, 10, 5], [1, 9, 6], [2, 8, 7]] [[2, 8, 7], [1, 9, 6], [0, 10, 5]] 上の :py:func:`map` 関数、 :py:func:`filter` 関数、 :py:func:`sorted` 関数と合わせて活用した ``lambda`` 式は、特に無名関数と呼ばれる使い方となる。 名前がある関数(今回で言うとpayment,checkPrice)を使用した処理とは対照的に、 ``lambda`` 式では関数名を定義せずに使用することができることから無名関数と呼ばれている。 先ほども述べたが、最も重要な違いは、 ``lambda`` 式はあくまで”式”であり、”文”ではないことである。つまり、 ``lambda`` 式は単一行の式しか持つことができず、複数行のブロックを持つことはできない。このため、 ``lambda`` 式で複雑な処理を行うことは困難である。 ``lambda`` 式は、関数で書くと冗長になりがちなちょっとした処理をインラインで書くために使われることが多い。 もしある関数を定義して、その関数を再利用する場合は名前をつけて関数定義する必要があるが、この場限りの使い捨ての関数ということであれば、 ``lambda`` 式を使うことで簡潔に記述することができる。 参考サイト =========== 【Python入門】lambda(ラムダ式)の使い方 https://www.sejuku.net/blog/23677 Pythonの無名関数(ラムダ式、lambda)の使い方 https://note.nkmk.me/python-lambda-usage/