こんにちは!ぼりたそです!今回は無名関数についてまとめた記事を作成してみました。
以前、関数についてご紹介しましたが、その仲間だと思っていただいて構いません。Pythonを学び始めた方はあまり馴染みがないかもしれませんが、使えると便利であること間違いなしなのでぜひみていって下さい。
無名関数とは?
無名関数とはその名の通り名前のない関数です。関数の仲間ですが、関数との違いは一行で表すことができるので処理が速く、コードを簡易的に記述することができます。
用途によっては使用することは無いかもしれませんが、データサイエンティストを目指す人は使用することが多いと思います。
無名関数の生成
無名関数はラムダ(lambda)式とも言われ、通常の関数と同じように定義する必要があります。記述方法は以下のようになります。
lambda 引数:処理
以下具体例を用いて解説していきます。
無名関数の定義
無名関数は関数のようにdefとして定義の宣言をする必要はありません。関数を記述して変数に代入すれば使用できます。以下に引数に対して4乗する処理を無名関数と関数でそれぞれ記述してみました。
#引数を4乗する無名関数
f = lambda x: x**4
print(f(25))
#出力結果
#390625
#引数を4乗する関数
def fourth_power(number):
y = number**4
return y
print(fourth_power(25))
#出力結果
#390625
無名関数でも関数でも結果は同じですが、無名関数の方がコードが少なく、見やすいですね。
無名関数の応用
無名関数についてご紹介しましたが、具体的にどの場面で使用されるのかイマイチ分からなかった方もいるのではないでしょうか。そこで無名関数の実際の応用例をいくつかお見せします。無名関数は他の関数に使用されることが多く、主に以下に示す関数に使用されます。
- sorted関数
- filter関数
- map関数
以下それぞれ具体例を交えて紹介します。
sorted関数
sorted関数は下に示すように第一引数にリストなどのオブジェクトを、第二引数にkeyを設定することができます。このkeyは並び替え方法を表す引数になります。このkeyにラムダ式を使用するとソートの幅がぐんと広がります。
sorted(オブジェクト, key=関数)
何を言っているか分からない方もいるかと思いますので、具体例を交えていきましょう。以下のコードはリスト要素の3番目の文字を使用してソートしています。第一引数にリスト渡し、第二引数にkeyとしてラムダ式を記述しています。
ラムダ式の中身を見ると引数がx、処理はxの3番目の文字を呼び出す記述になっています。そのため、処理としてはlというリストを要素の3番目の文字を使用してソートすることになります。
#リスト要素の3番目の文字を基に昇順で並び替える
l1 = ['boritaso', 'spider', 'dog', 'cow', 'human']
l2 = sorted(l1, key=lambda x:x[2])
print(f'元のリスト : {l1}\n並び替え後のリスト : {l2}')
#出力結果
#元のリスト : ['boritaso', 'spider', 'dog', 'cow', 'human']
#並び替え後のリスト : ['dog', 'spider', 'human', 'boritaso', 'cow']
filter関数
filter関数は以下のように第一引数に関数を第二引数にリストなどのオブジェクトを渡すことで関数が真になるオブジェクトの要素のみを抽出してくれます。
filter(関数, オブジェクト)
実際に以下にサンプルコードを示します。このコードはリストにおいて4文字以上の要素のみを抽出するコードになります。
#リスト要素が4文字以上のみを抽出
l1 = ['boritaso', 'spider', 'dog', 'cow', 'human']
l2 = filter(lambda x: len(x)>=4, l1)
print(f'元のリスト : {l1}\nフィルタリング後のリスト : {list(l2)}')
#出力結果
#元のリスト : ['boritaso', 'spider', 'dog', 'cow', 'human']
#フィルタリング後のリスト : ['boritaso', 'spider', 'human']
map関数
map関数は以下のように第一引数に関数、第二引数にリストなどのオブジェクトを渡すことで、リストに対して一律で関数に従った処理が実行されます。
map(関数, オブジェクト)
以下に示すのはリストの要素にfamily(〜科)を付け足すコードになります。
#リスト要素にfamilyを付け足す
l1 = ['boritaso', 'spider', 'dog', 'cow', 'human']
l2 = map(lambda x: x+'_family', l1)
print(f'元のリスト : {l1}\n処理後のリスト : {list(l2)}')
#出力結果
#元のリスト : ['boritaso', 'spider', 'dog', 'cow', 'human']
#処理後のリスト : ['boritaso_family', 'spider_family', 'dog_family', 'cow_family', 'human_family']
終わりに
以上が無名関数についての解説になります。恐らく最初はよく分からんというのが正直なところだと思います。小生もそうでしたので。ですが、使いこなせれば非常に便利な関数なのでぜひマスターしてみて下さい。