ユーニックス総合研究所

  • home
  • archives
  • python-lambda

Pythonのlambdaの使い方【無名関数, ラムダ式】

  • 作成日: 2021-04-16
  • 更新日: 2023-12-24
  • カテゴリ: Python

Pythonのlambdaの使い方

プログラミング言語のPythonではlambdaというラムダ式を使うことができます。
ラムダ式は無名関数とも呼ばれており、その名の通り名前のない関数です。

ラムダ式を使うことで組み込み関数をさらに便利に使うことも可能になるし、プログラミングにおけるかゆいところにも手が届くようになります。
この記事ではlambdaについて具体的に↓を見ていきます。

  • ラムダ式とは?
  • lambdaの構造
  • lambdaとdefの比較
  • lambdaとsorted

結論から言うとlambdaは↓のように使います。

l = ['abc', 'f', 'de']  
l = sorted(l, key=lambda s: len(s))  
print(l)  
# ['f', 'de', 'abc']  

ラムダ式とは?

ラムダ式とは無名関数とも呼ばれます。
さきほど解説したように名前のない関数のことを言います。

関数なのに名前がないの? 不便じゃない?
というところですが、関数を使う際に名前がないほうが色々便利な時がプログラミングではあります。
たとえば関数の機能だけを使いたい、名前はどうでもいい、と言うような場合です。

そういう場合は名前を定義しなければ使えない普通のdefの関数に比べて、ラムダ式のほうが便利なので需要が生まれます。
また、ラムダ式はあくまで文ではなく式なので、式の途中に書くことができます。
文の場合は式の途中に書けないので、ちゃんと別の所に文として書く必要がありますが、ラムダ式はそのストレスがありません。

ラムダ式は実際に使ってみないとその便利さがわからないプログラミングの隠れキャラクターと言えます。

🦝 < λって人みたいでかわいいよね

🐭 < 猫背だよね

ラムダ式を使えばコード量を減らすことも出来るかもしれません。
しかし、乱用には注意が必要です。
名前がある関数と名前が無い関数とを比べると、やはりぱっと見では名前のある関数の方が目立つからです。
そのため保守的には普通の関数のほうが上と言えます。
しかしちょっとした短いコードを書きたい時にラムダ式を上手く使えば、コードもわかりやすくなりコード量も減らすことができます。

肝心なのはラムダ式で複雑な処理をしようとしない、ということです。
複雑な処理が必要になったらそれはdefにしましょう。

lambdaの構造

Pythonのlambdaの構造は↓のようになっています。

lambda 引数: 式  

lambdalambdaというキーワードで始まります。
そしてそれに引数が続きますが、この引数は省略することも出来ます。
そしてコロン(:)を挟んで式が続きます。
式は式なので、文を書くことは出来ません。たとえばfor文やif文などです。
しかし内包表記や三項演算子は書くことができます。

lamdbaでは式の結果がそのまま返り値となります。
返り値というのも式なので変なんですが、便宜的にそう表現します。

lambda式を生成すると、その左辺には<class 'function'>が返されます。

l = lambda: 1  
print(type(l))  
# <class 'function'>  

functionは関数と同じように扱うことが出来るので、カッコを付けるとラムダ式を実行することができます。
この時にlambdaに引数を持たせている場合は、その引数を渡すことが出来ます。

func = lambda: 1  
print(func())  
# 1  

func = lambda x: x  
print(func(2))  
# 2  

↑のようにlambdaで生成した関数オブジェクトは関数のように使うことができます。
返り値は式の結果が返ってくるので、なんだか不思議な感じですね。

🦝 < 関数のように使える式

lambdaとdefの比較

ここでlambdadefを比較してみます。
defは↓のように関数を定義します。

def 関数名(引数):  
    処理  

defは関数名があり、処理の部分に式だけでなく文も書けるのが特徴と言えます。
defは私たちが常日頃からよく使う関数なので、いまさらな感じですが。
ではlambdaを見てみましょう。

lambda 引数: 式  

lambdaは関数名が無いのがやはり特徴と言えます。
そして式の部分には文が書けないのも大きな特徴です。
↓のように並べて見てみましょう。

def 関数名(引数):  
    処理  

lambda 引数: 式  

lambdaのほうがdefに比べてタイプ数が多いですね。
ここら辺は好みが分かれそうですね。

lambdaの式に書けるのは基本的には1行の式ですが、括弧を使えば複数行書けます。
しかしこれは本質的には1行の式です。

l = lambda x: (x +  
               x -  
               x)  
print(l(2))  
# 2  

また括弧の他には改行をバックスラッシュ(\)でエスケープすることでも複数行書くことができます。

lambdaとsorted

lambdaの実用的な使用例として組み込み関数のsorted()と組み合わせる例があります。
sorted()関数はオブジェクト内の要素を整列させる関数です。
たとえばリストlの要素を整列(ソート)させたい場合は↓のようにします。

l = [3, 1, 2]  
l = sorted(l)  
print(l)  
# [1, 2, 3]  

たとえば文字列の入ったリストがあるとします。
そしてこの文字列の長さで要素を整列させたいとします。
そういった場合にlambdaはうってつけです。

sorted()のキーワード引数keyにラムダ式を書くと↓のようになります。

l = ['abc', 'f', 'de']  
l = sorted(l, key=lambda s: len(s))  
print(l)  
# ['f', 'de', 'abc']  

sorted()は内部でラムダ式にソート中の要素(文字列)を渡します。それがsです。このsの長さをlen(s)で求めて、その結果を式として返します。
こうするとsorted()は文字列の長さを見てソートしてくれるようになります。
↑を見ると文字列が短い順に整列されているのがわかります。

おわりに

今回はPythonのlambdaについて見てみました。
ラムダ式は知っておくとちょっと便利なので知らなかったという人の参考になれば幸いです。

🦝 < λ<ちょっと通りますよ。。。

🐭 < ラムダ様のお通りだ