1: 2016-12-03 (土) 14:07:49 njf[4] [5] [6] | 現: 2016-12-03 (土) 23:37:54 njf[4] [7] [8] | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | *ラムダ式とは [#v031df04] | + | *Pythonのラムダ式とは [#v031df04] |
+ | |||
+ | Pythonのラムダ式は以下のような記法で書かれる式のことです。 | ||
+ | |||
+ | lambda 引数:戻り値 | ||
+ | |||
+ | 例えば、引数の第二要素を取得するのなら、 | ||
+ | |||
+ | lambda d:d[1] | ||
+ | |||
+ | となり、実際に使うのは | ||
+ | |||
+ | (lambda d:d[1])("abcdef") | ||
+ | |||
+ | 結果 | ||
+ | b | ||
+ | |||
+ | とします。 | ||
+ | |||
+ | 他の言語で言うところの、無名関数のようなものです。 | ||
*通常の関数定義との差 [#v799ceac] | *通常の関数定義との差 [#v799ceac] | ||
+ | |||
+ | 通常の返値のある関数との差は特にありません。 | ||
+ | |||
+ | 例えば | ||
+ | |||
+ | get2 = lambda d:d[1] | ||
+ | |||
+ | と変数に入れてやると、 | ||
+ | |||
+ | get2("abcdef") | ||
+ | |||
+ | 結果 | ||
+ | b | ||
+ | |||
+ | となり、関数と全く同じように使えます。 | ||
+ | |||
+ | def get2Func(x): | ||
+ | return x[1] | ||
+ | |||
+ | get2Func("abcdef") | ||
+ | |||
+ | 結果 | ||
+ | |||
+ | b | ||
+ | |||
+ | となります。また関数は変数に入れることもできるので、 | ||
+ | |||
+ | get2 = get2Func | ||
+ | |||
+ | get2("abcdef") | ||
+ | |||
+ | 結果 | ||
+ | b | ||
+ | |||
+ | となり、ラムダ式も関数も定義の仕方が異なるだけで、全く同じように使えます。 | ||
+ | |||
+ | 「ラムダ式は変数に入れられるところが便利」という記述を見たことがありますが、それは誤解です。他の多くの言語と同様に、通常の関数でも変数に入れられます。 | ||
+ | |||
+ | 異なるのは定義の時にそのまま変数に入れられない、ということだけです。 | ||
*ラムダ式のメリット [#q9f534a7] | *ラムダ式のメリット [#q9f534a7] | ||
+ | |||
+ | ラムダ式のメリットはおそらく次の2つです。 | ||
+ | |||
+ | -短い処理なら記法が簡便となる | ||
+ | -管理すべきものを減らせる | ||
+ | |||
+ | 一つ目の「短い処理なら記法が簡便となる」はそのままです。 | ||
+ | 先ほどの例なら、ラムダ式なら | ||
+ | |||
+ | lambda d:d[1] | ||
+ | |||
+ | 一方関数なら、 | ||
+ | def get2Func(x): | ||
+ | return x[1] | ||
+ | |||
+ | となり、少しラムダ式の方が短く書けます。 | ||
+ | |||
+ | 二番目の「管理すべきものを減らせる」を見るために、文字列の二番目の要素でソートする処理を考えてみます。ラムダ式でのコードは以下のようになります。 | ||
+ | |||
+ | testList = ["2134","1200","3991","1234","4444"] | ||
+ | |||
+ | testList.sort(key=lambda d:d[1]) | ||
+ | |||
+ | 一方、関数で書くと以下のようになります。 | ||
+ | |||
+ | testList = ["2134","1200","3991","1234","4444"] | ||
+ | |||
+ | def get2Func(x): | ||
+ | return x[1] | ||
+ | |||
+ | testList.sort(key=get2Func) | ||
+ | |||
+ | もしこの処理が何万行もあるプログラムの中で、ここでしか使わないものであったとしましょう。 | ||
+ | |||
+ | そのような場合でも、関数として「get2Func」を定義してしまうと、他の場所からもこの関数を呼び出せてしまうため、この関数を管理する必要が出てきます。 | ||
+ | |||
+ | たとえば、関数の内部の書き換えるときには、思わぬ影響がでないように他の場所で使われていないことを確認しなければなりません。またこれと同じ名前の関数は使えませんし、まぎらわしい名前の関数も使うべきではないでしょう。 | ||
+ | |||
+ | ラムダ式なら、そもそも他から参照できる名前を持たないので、そのような管理の煩雑さはなくなります。無名関数の無名であるゆえのメリットと言えます。 | ||
*まとめ [#h903d6f1] | *まとめ [#h903d6f1] | ||
+ | |||
+ | Pythonのラムダ式は他の言語の無名関数のようなもので、コンパクトな記法で関数を定義せずに処理を書けます。 | ||
+ | |||
+ | 使いどころとしては、一回限りの小さな処理などに便利です。 | ||
+ | |||
+ | 複雑な処理や何度も使う処理なら関数の方が便利です。 |
(This host) = https://njf.jp