🙄

【初心者向け】Pythonの無名関数(ラムダ式)をわかりやすく解説(map関数、filter関数、sorted関数の説明も)

2024/10/16に公開

Pythonの無名関数(lambda式)について理解することは、Pythonプログラミングの効率を上げ、より簡潔なコードを書く上で役立ちます。本記事では、Pythonの無名関数(lambda式)の基本から実践的な使い方までを解説します。

無名関数(lambda式)とは?

無名関数とは、名前を持たない関数のことです。通常の関数は def キーワードを使って定義され、名前が付けられますが、無名関数はその名の通り、名前を持たずに一行で簡潔に記述されます。

Pythonにおける無名関数は lambda キーワードを使って定義され、特に簡単な関数を一時的に使用したい場合に便利です。lambda 式は、以下のような構文を持ちます。

lambda 引数:

サンプル

#通常の関数定義
def add(x,y):
    return x + y

#lambda式
add_lambda = lambda x, y: x + y

#両方の関数を使ってみる
print(add(3, 5))
print(add_lambda(3, 5))

無名関数を使う場面

lambda 式は短く、シンプルな計算や処理を行いたい場合に特に有効です。以下は、典型的な使用場面です。

  1. 関数の引数として使用
    無名関数は、関数の引数として渡す場合に便利です。たとえば、map や filter、sorted といった高階関数の中で、わざわざ別に関数を定義せずに一時的な処理を行いたいときに使います。

map():配列の全要素にアクセスして、関数を適応させることができます。

# リスト内の要素に2をかける関数
numbers = [0, 1, 3, 5, 7]
doubled = list(map(lambda x: x * 2,numbers))
print(doubled) # 出力:[0, 2, 6, 10, 14]
  1. フィルタリング
    lambda 式は、条件に基づいてリストをフィルタリングするのにも使われます。

filter():リストやタプルなど(イテラブル)から条件を満たす要素を抽出したり削除したりできます。

# 偶数のみをフィルタリングする
numbers = [1, 2, 3, 4, 5 ,6 ,7]
evens = list(filter(lambda x: x % 2 ==0,numbers))
print(evens) # 出力: [2, 4, 6]
  1. ソートのカスタマイズ
    sorted 関数や sort メソッドでは、キーを指定してソート順をカスタマイズできます。
    a.sort():元のリスト(a)自体をソートしたものに書き換えます。
    降順にソートしたい場合は、py a.sort(reverse = True) とします。
    sorted(a):引数にリストを指定するとソートされたリストを返す。元のリストは変更されません

これらには引数keyがあります。
引数keyにはlambda関数などを指定でき、要素に何らかの処理を行った結果をもとにソートができます。
例えば、絶対値や文字数でソートができます。

# リストを第2要素でソートする
tuples = [(1, 'one'), (2, 'two'), (3, 'three'), (15, 'fifteen')]
sorted_tuples = sorted(tuples, key = lambda x: x[1]) #x[1]つまり(2番目:oneとかtwoとか)の要素を基にソートされる
print(sorted_tuples)  # 出力: [(15, 'fifteen'), (1, 'one'), (3, 'three'), (2, 'two')]

lambda 式の制約

便利な lambda 式ですが、いくつかの制約があります。

  1. 単一の式しか書けない
    lambda 式は単一の式しか含むことができません。複数の文を実行したい場合や、複雑なロジックを必要とする場合には、通常の関数定義を使うべきです。

  2. 可読性
    lambda 式は短く簡潔に書ける反面、長くなると可読性が低下します。短くても分かりやすいコードを書くことが重要です。

lambda 式と通常の関数の使い分け

lambda 式は非常に便利ですが、すべての場面で使用すべきではありません。コードの可読性や保守性を考慮して、以下のガイドラインに従うと良いでしょう。

簡単な処理や一時的な関数が必要な場合は lambda 式。
複雑な処理や複数行のロジックが必要な場合は通常の関数定義。

応用例:条件付きソート

以下は、lambda 式を使ってカスタマイズされた条件でリストをソートする例です。

# 長さが偶数かどうかでソートし、同じ長さならアルファベット順にソート
strings = ['apple', 'banana', 'pear', 'kiwi']
sorted_strings = sorted(strings, key=lambda s: (len(s) % 2, s))
print(sorted_strings)  # 出力: ['pear', 'kiwi', 'apple', 'banana']

この例では、文字列の長さが偶数か奇数かによってまずソートし、さらに同じ長さのものはアルファベット順に並び替えています。

まとめ
Pythonの無名関数(lambda 式)は、簡単な関数を一時的に使いたい場面で強力なツールです。ただし、コードの可読性を維持するため、適切な場面での使用が重要です。単純な処理を一行で書きたい場合には lambda 式を使い、複雑な処理には通常の関数定義を使うと良いでしょう。

これで、lambda 式を使いこなして、さらにPythonのコードを効率的かつ簡潔に書くことができるはずです。

Discussion