無名関数「lambda」を紐解く

puzzlePython

関数は通常、

def func():

…..

などと定義されるますが、Pythonには名前をつけない関数があることはご存知でしょうか

名前を付けない関数を、無名関数、

lambda関数

と呼んでいます

聞いたこと無い!という方や、

聞いたことあるけどよくわからない!

という方はまず下記をご覧ください

ranking = [(‘Wakki’, 3), (‘Yu’, 4), (‘Christiano’, 2), (‘So Takei’, 1)]

ranking.sort(key=lambda rank: rank[1])

>>> ranking

[(‘So Takei’, 1), (‘Christiano’, 2), (‘Wakki’, 3), (‘Yu’, 4)]

太字の部分でlambda関数を使っています

僕は最初見たとき、

???????

と全く理解できませんでした

本日の記事では、これが一体なんなのか?を説明していきます

lambda関数の基本

一番簡易的なlambda関数は下記のようなものになります

lambda(引数無し)

hello_func2 = lambda: print('hello')

実行すると、

>>> hello_func2()

hello

本来ですと、

def hello_func1():
    print('hello')

という関数となりますが、lambdaを使って、

hello_func2 = lambda: print('hello')

と1行になっています

lambdaは

lambda:

のあとに実行したい関数を定義することができます

今回の場合は、

print(‘hello’)

ですね!

lambda(引数有り)

引数はどのように扱うのでしょうか?

例えば下記の関数

def hello_to1(person):
    print(f'hello, {person}!!')

>>> hello_to1(‘Yu’)

hello, Yu!!

をlambdaで表すには?

hello_to2 = lambda person: print(f'hello, {person}!!')

となり、実行すると、

>>> hello_to2(‘Yu’)

hello, Yu!!

と通常の関数と同じものになります

lambaで引数を受け取るには、

lambda <引数>: 実行する関数

となります!

本題の関数を解説

記事冒頭のlambda関数も引数をとっています

ranking = [('Wakki', 3), ('Yu', 4), ('Christiano', 2), ('So Takei', 1)]
ranking.sort(key=lambda rank: rank[1])

key=lambda rank: rank[1]

rankがこのlambda関数の引数であり、

引数「rank」へ代入された値のオフセット[1]を取り出していることになります

つまり、この全体の関数の中では、

変数「rank」はranking(リスト)内の一つ一つの要素であるタプル(例:(‘Yu’, 4))を示していて、

rank[1]

により、要素であるタプルのオフセット[1]、つまり順位を示すint型を返す関数となっています

それを受け取りsortメソッドでsortしているということです

これが成り立つとすると、もちろん通常の関数での代用もできる

def rank(ranking):
    return ranking[1]

ranking.sort(key=rank)

これでも同様の結果が得られます

ご理解いただけましたでしょうか!?

これが、正体です!

(補足)lambdaの応用

本題である関数の意味は理解いただいたかと思いますが、せっかくlambdaに触れたのでもう少し深堀していきます

lambdaは引数が2つ以上も可能

>>> someone_said = lambda person, sentence: print(f'{person} said “{sentence}”‘)

>>> someone_said(‘Yu’, ‘I will make 100 apps by python’)

Yu said “I will make 100 apps by python”

ここでは、

person

sentence

が引数になりますね!

関数の中にlambdaを入れる

def f(a,b,c):
    return lambda x: (a+b+c) ** x

f関数fはa,b,cと3つの引数を取り、その合計をlambdaの引数x乗した値を返します

>>> calc = f(1,2,3)

f関数へa,b,cに値を代入しています

>>> calc(5)

()内に5を代入することで、f関数で返された

lambda x: (1+2+3) **x

にx=5の値を代入して結果を求めます

7776

結果が返されます

xに他の数字を代入すると、

>>> calc(3)

216

>>> calc(4)

1296

同様に別の結果が返ってきます

一行でまとめてすべて実行することもできます

>>> f(3,4,5)(5)

248832

いちいちlambdaに名前をつける作業をせずとも関数は実行できました!

おわりに

lambdaの基本につきましての解説は以上になります

いかがでしたでしょうか?

最初は無理やりでも使ってみる場面を探して使っていると、

どこでは使うべきで使わないべきか、が見えてくるかと思います

前回ご紹介した自作アプリでは、lambdaを使っていますのでもしご覧になりたい方は、下記のリンクで見てみてください!

全体のコードも記載しています

前回ご紹介した自作アプリ↓

【自作】Pythonゲーム紹介 何桁まで覚えられますか?

本日もありがとうございました!

タイトルとURLをコピーしました