スポンサーリンク

コードが書ける!数式が書ける!AAが書ける!スタンプが貼れる!

無料の匿名掲示板型SNS「このはちゃんねる

新規会員募集中!

【Python】ラムダ式(lambda)の書き方【入門第45回】

154, 2019-09-05

目次

ラムダ式とは?

こんにちは、narupoです。
今回はPythonのラムダ式(lambda)をやっていきます。
ラムダ式は、小さい名前のない関数を作るときに使います
これを知っておくと、sorted関数などを便利に使うことができます。

ラムダ式について、具体的には↓を見ていきます。

  • ラムダ式の書き方
  • 関数オブジェクトを変数に入れる
  • 関数オブジェクトを実行する
  • 関数オブジェクトに引数を渡す
  • sorted関数でラムダ式を使う

ラムダ式の書き方

ラムダ式は↓のように書きます。

lambda: 式

例えば1 + 1を計算するラムダ式は↓のように書きます。

lambda: 1 + 1

ラムダ式は基本的には1行で書きます。
なので複数行のラムダ式はサポートされていません。
複数行で書きたい場合は↓のように改行をエスケープします。

lambda: 1 \
    + \
    1

↑は先ほどと同様に1 + 1を計算するラムダ式です。

関数オブジェクトを変数に入れる

↓のようにするとラムダ式で作られた関数オブジェクトを変数に入れることができます。

func = lambda: 1 + 1

変数funcは関数オブジェクトです。
print(type(func))でタイプを出力すると↓のようになります。

<class 'function'>

function(関数)ですね。

関数オブジェクトを実行する

↓のような関数オブジェクトを実行するには、ふつうに関数を呼び出すように実行します。

func = lambda: 1 + 1

func()

↑のfunc()で関数オブジェクトを実行しています。

ここでラムダ式の特徴について解説します。
ラムダ式には↓のようにreturn文は書けません。

lambda: return 1

ラムダ式は式ですので、↓のような1 + 1の演算結果はそのまま参照することができます。

lambda: 1 + 1

これはどういうことかいうと、たとえば↓のように関数オブジェクトを実行してみましょう。

func = lambda: 1 + 1

print(func())

↑の結果は2になります。
ラムダ式にはreturn文などはありませんが、関数オブジェクトの実行結果はちゃんと返ってきてます。
ですので↓のように演算することも可能です。

func = lambda: 1 + 1
result = func() * 3
print(result)

↑のコードの実行結果は6になります。

関数オブジェクトに引数を渡す

リレー

関数オブジェクトには関数のように引数を渡すことも出来ます。
ラムダ式では引数を受けるときにどのように書くのかと言うと、↓のように書きます。

lambda 引数: 式
lambda 引数, 引数, ...: 式

たとえば引数xを取りたい場合は↓のように書きます。

lambda x: x * 2

↑は引数xを単純に2倍にするラムダ式です。

複数の引数、たとえばxyを取りたい場合は↓のようにします。

lambda x, y: x * y

↑のように複数の引数を書くときはカンマ(,)で区切ります。

↓のような複数の引数を取る関数オブジェクトを呼び出すときは、ふつうの関数呼び出しと同じです。

func = lambda x, y: x * y
result = func(2, 3)
print(result)

↑のコードの実行結果は6になります。

あとはラムダ式の引数にも、関数と同じように引数のデフォルト値や、*args**kwargsなども書くことができます。

lambda x=2: x * 2
lambda *args: len(args)
lambda *args, **kwargs: len(kwargs)

sorted関数でラムダ式を使う

ラムダ式の実践的な使用例として、sorted関数によるリストのソートの例を紹介します。
sorted関数はリストなどをソートする関数です。
例えば↓のようにするとリストを昇順にソートすることができます。

lst = [3, 1, 2]
sorted_lst = sorted(lst)
print(sorted_lst)

↑のコードの実行結果は↓のようになります。

[1, 2, 3]

↑のような数値のリストは簡単にソートできますが、↓のように独自クラスのインスタンスが入っているリストのソートはどうなるでしょうか。

class Cat:
    def __init__(self, age):
        self.age = age

cats = [
    Cat(3),
    Cat(1),
    Cat(2),
]

sorted_cats = sorted(cats)

↑のコードの実行結果は↓のようになります。

Traceback (most recent call last):
  File ".\sample.py", line 11, in <module>
    sorted_cats = sorted(cats)
TypeError: '<' not supported between instances of 'Cat' and 'Cat'

このように、普通にソートしようとしてもsortedはインスタンスをソートしてくれません。
なぜかというと、sorted関数はインスタンスを何をキーにしてソートしたらいいのかわからないからです。

こういったインスタンスのリストをソートしたい場合は、sorted関数のkey引数を使います。
key引数に関数オブジェクトを渡して、ソートのキーになる値を参照させるようにします。
たとえば↓のようにです。

sorted(cats, key=lambda cat: cat.age)

↑では、sorted関数のkey引数にラムダ式を書いて関数オブジェクトを渡しています。
sorted関数はソートするときに、この関数オブジェクトを参照して、引数にリストの要素を渡して呼び出します。
lambda cat:のように第1引数がcatになっていますが、これがソート時に参照されているリストの要素です。
この要素、つまりCatクラスのインスタンスを参照して、cat.ageの値を参照するようにしています。
こうすることで、sorted関数はソートするときに、cat.ageの値をキーにしてソートします。

ですので↓のコードの実行結果は、

class Cat:
    def __init__(self, age):
        self.age = age

cats = [
    Cat(3),
    Cat(1),
    Cat(2),
]

sorted_cats = sorted(cats, key=lambda cat: cat.age)
for cat in sorted_cats:
    print(cat.age)

↓のようになります。

1
2
3

catsを昇順にソートできてますね。
他には、Catクラスで演算子をオーバーロードする方法もありますが、ここでは解説を割愛します。

おわりに

ラムダ式は書けるとなかなかお洒落かもしれません。
カフェでコードを書いてて、何を書いてるの? と言われて「ラムダ式だよ(どやぁ」と答えることができます。
かっちょいいですね。

……

以上、次回に続きます。

また見てね

関連動画

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク