こんにちは。今回は久々にPythonの無名関数( lambda )についての記事です。私は仕事では主にMatlabを使用しているのです。職場の方が書くコードを見ていると、簡単な関数演算をわざわざ関数ファイルを用いて定義している状態によく遭遇します。個人的には別ファイルに関数を定義するのは、複雑な関数の時だけにしてくれ。。と思うのですが、作成した方の話を聞くと、「別に関数で問題なく動作してるから大丈夫」と大抵の方が仰ります。
様々なプログラミング・数値計算ソフトで使用される「無名関数」があることをプログラミングに触れている方はご存知かと思いますが、使わなくても業務に差し支えないことで敬遠している方が多い印象です。
無名関数は自分からも、第三者から見てもコードがわかりやすい・読みやすい、といったメリットがあるほか、Pythonでは他のメリットもありますので、この記事で紹介していきたいと思います。
lambda式とは
Python初学者の方にとって「関数」といえばdefで定義するものと認識しているはずです。
これは、関数に関する最も基本的な構文であり、単純に関数を作るものとなります。
しかし、単純な関数を作る以外に、もっと高度なプログラミングの位置付けとして、def以外で関数を作成できるようになっています。その代表例が、lambda関数、map関数、リスト内包表記、ジェネレータ関数、ジェネレータ式といったものになります。
さて、ここで登場してきたlambda式ですが、これはdefステートメントど同様に、関数を作成するために使う手段となります。「lambda」という名前はLISP(1958年にジョン・マッカーシーが考案した言語)の類似のツールから由来しています。元々は数学のλと呼ばれる論理体型に由来しますが、結局のところは単なる関数名です。
defステートメントとの違い
先ほど、lambda式はdefステートメントと同様の立ち位置であることを記載しましたが、明確な違いがあります。
それは、「作成された関数が、式の戻り値となる」ということです。戻り値を変数に設定しない限り、関数には名前がないことになります。これが、lambda式が無名関数たる所以です。
また、もう一つ大きな違いとして、lambda式は関数を引数に設定可能であることです。
lambda式の基本形
lambda式は以下のような形式で記述します。
lambda 引数 : 式
引数に関しては、defステートメントと同様に定義ができます。
もちろん、複数の引数でもlambda式を記述可能です。
lambda 引数a, 引数b, 引数c : 式
このように、lambda式はdefステートメントのようにreturnコマンドが必要なく、一つの変数として結果が出力されます。
lambda 式の特徴
通常の関数を使用したい場合、defステートメントで事足りる訳ですが、「シンプルな関数を組み込みたい」場合に便利です。上節で述べたように、lambda式は出力が変数となることから、単純な関数の場合、一行で記載可能となります。そのため、コードが簡潔にまとめられる、すなわち、第三者が見てわかりやすいコードになります。社会人となり、同僚のコードを見る機会が増えたことで、だれが見てもわかるコードを記載することが重要だと思い知りました。lambda関数を用いることで、関数処理に関してわかり易くなりますのでオススメです。
また、少し難易度があがる話になりますが、ジャンプテーブルを作成の際にlambda式を用いることができます。ジャンプテーブルとは「要素がオブジェクトではなく、処理を組み込んだリストやディクショナリのこと」です。例を以下に示します。
act=[(lambda a:a**a),(lambda a:a*a**a)]
print L[0](1) #4が出力される
lambda 式コード実装例
それでは、lambda式が実際にどのように使われているか確認します。
まずは、簡単な関数を例として、defステートメントとの違いを確認していきましょう。
def function(a,b,c):
return(a*b*c)
function(2,3,4) #24が出力される
次に、lambda式で同じ関数を記載します。
func=lambda a,b,c:a*b*c
func(2,3,4) #24が出力される
違いを見れば一目瞭然ですね。変数と関数が纏めて記述されているlambda式の方が圧倒的にわかりやすい上、1行コードを削減できます。
続いて、関数を用いて、出力がリストとなる処理をして、defステートメントとの違いを確認していきます。
def square(x):
return x**2
list(map(square,[0,1,2,3,4,5])) #[0, 1, 4, 9, 16, 25]が出力
同様に、lambda式で表現します。
f=list(map(lambda x:x**2, [0,1,2,3,4,5])) #[0, 1, 4, 9, 16, 25]が出力
このような形で、一行で記載できます。ここで、lamda以外の高度な関数であるmap関数がありますが、これは関数処理をリストやディクショナリに対して適用できる関数になります。(今回はそんなに重要なものとして扱わないため、そういう関数があるんだ程度に考えて結構です。)
以上、2つの例で示しましたが、簡単な関数が一行で記載できることの魅力が伝われば幸いです。
まとめ
今回はPythonで使用する、無名関数について記事を書きました。無名関数の立ち位置(defステートメントとの区別)やその使い方についてできるだけ詳細に記述しました。もしも質問やわからないことがありましたらお気軽にお問い合わせください。
Python初学者はオライリーが出版している「初めてのPython」という書籍がオススメです。Pythonと他の言語の違いから始まり、一から学べる良書ですので、ぜひご覧ください。
コメントを残す