PR

【Python】ラムダ関数(lambda)を3分で分かりやすく解説

Python

ラムダ関数とは、Pythonで一行の小さな無名関数を作成するための特殊な構文です。

# ラムダ関数を定義して、変数に割り当てる
double = lambda x: x * 2

# このラムダ関数を使用して、数値を2倍にする
result = double(5)

print(result)  # 出力: 10

ラムダ関数は、そのコードが短く、可読性が高く、プログラムの柔軟性を向上させることができるという特長を持つため、エンジニアにとって非常に便利。

これらの関数は一行で表現されるため、「無名関数」とも呼ばれ、一時的な使用に非常に適しています。

参考 Pythonの特徴

この記事では、ラムダ関数の基本的な使い方から、具体的な使用例、そして注意点について説明します。ラムダ関数がPythonの強力なツールの1つであることを理解し、それを適切に活用できるようになることを目指します。

このページで学べる内容
  • ラムダ関数(lambda)とは?
  • ラムダ関数の使い方
  • 一般的な関数(def)との違い
  • ラムダ関数の利用方法と注意点

Pythonエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。

参考 Pythonの基本的な書き方・構文ルール

スポンサーリンク

Python:ラムダ関数(lambda)とは?

超・簡単に一言で説明すると、ラムダ式(lambda)は関数を短く書けるようにした仕組みです。

Pythonのラムダ関数の構文は非常にシンプルで、以下の形式をとります。

lambda 引数:処理

lambda」はPythonのキーワードであり、ラムダ関数の定義を開始します。それに続く「引数」は、関数の入力となる引数で1つ以上指定することができます。「処理」は、ラムダ関数が計算を行う式を示します。

この式の評価結果がラムダ関数の戻り値となります。

早速ラムダ関数のサンプルコードを確認してみましょう。

# 引数が一つのラムダ関数
f = lambda x: x * 2
print(f(3))  # 出力: 6

# 引数が二つのラムダ関数
add = lambda x, y: x + y
print(add(3, 4))  # 出力: 7

# 引数が三つのラムダ関数
calc = lambda x, y, z: (x + y) * z
print(calc(1, 2, 3))  # 出力: 9

参考 変数の使い方 / print関数

上記の例では、引数が1つ、2つ、そして3つのラムダ関数をそれぞれ定義しています。これらのラムダ関数はそれぞれ入力された引数に対して計算を行い、その結果を戻り値としています。

ラムダ関数の特徴はそのシンプルさにありますが、一方で、ラムダ関数内には一つの式しか書くことができないという制限があります。

前提:Pythonの関数

ラムダ関数をしっかり理解するためには、その基本となるPythonの関数(def文)についての理解が必須です。

関数とはある特定のタスクや計算を実行する一連の命令をまとめたもの。必要な時に何度でも呼び出すことができるため、同じコードを何度も書くことなく、一度定義した関数を何度でも再利用できます。こうした再利用性は、コードの効率性と可読性を大いに向上させます。

図1:Pythonの関数

Pythonで関数を定義するためには、defというキーワードを使用します。その後に関数名と引数を記述します。

# 'add'関数の定義
def add(a, b):
    return a + b

# 'add'関数を呼び出し、その結果を'result'変数に格納
result = add(3, 5)

# 'result'の値を表示
print(result)  # 8

この例では、add関数に引数35を渡し、その結果をresultという変数に格納しています。

Python:無名関数

無名関数とは読んで字のごとく「名前を持たない関数」を指します。Pythonのラムダ関数はその典型的な1つの例です。

プログラミング言語では、通常、関数を作成するときには名前(識別子)を定義します。たとえば、Pythonの場合、defキーワードを使って関数を定義する必要があります。

def double(x):
    return x * 2

上記の例では、doubleという名前の関数を定義しています。

しかし、一部の場合では、関数が一時的にしか使われない、あるいは関数の動作が非常にシンプルで、それを独立させる必要がないとき、無名関数(ラムダ関数)を使うことがあります。

これは、一時的な関数を定義するための便利な方法であり、コードをよりコンパクトに、そしてしばしばより可読性の高いものにすることができる方法です。

以下は、先ほどの関数を無名関数(ラムダ関数)に置き換えた例です。

# 通常の関数
def double(x):
    return x * 2

# ラムダ関数
double = lambda x: x * 2

ここで、lambda x: x * 2 は、入力値 x を2倍にする無名関数です。doubleという名前をつけていますが、これは一時的な変数であり、関数自体は名前を持ちません。

Python:ラムダ関数 vs 通常の関数

ここではラムダ関数と通常の関数の違いをより詳細に解説します。

Pythonの関数は基本的に def キーワードを用いて定義されます。これに対し、ラムダ関数は lambda キーワードを用いて一行で表現されます。それぞれの特性と適用範囲について説明します。

ラムダ関数

ラムダ関数は、名前を定義せずに迅速に関数を作成できます。これは、コード内で一度だけ使用するような一時的な関数や、シンプルな操作をする関数に対して特に有用です。

# ラムダ関数の例
multiply = lambda x, y: x * y
print(multiply(2, 3))  # 出力: 6

通常の関数

通常の関数(defを使用した関数)は名前を持ち、より複雑な処理や複数の操作を含むことができます。また、文(if文やfor文など)を含むことも可能です。

# 通常の関数の例
def multiply(x, y):
    result = x * y
    return result

print(multiply(2, 3))  # 出力: 6

まとめると、ラムダ関数と通常の関数の主な違いは以下の通りです

ラムダ関数 vs 通常の関数
  • 名前の有無:ラムダ関数は無名ですが、通常の関数は名前を持つ。
  • 行数:ラムダ関数は一行で表現される。通常の関数は一行以上で表現される。
  • 複雑さ:ラムダ関数は一つの式しか含めることができません。通常の関数は複数の式や文を含むことができます。
  • 使用場面:ラムダ関数は主に短い一時的な関数や、他の関数(map(), filter(), reduce()など)の引数として使用されます。通常の関数は、一般的なプログラムの構造を形成し、複雑なタスクを実行します。

どちらの関数形式を使用するかは、その特性と、具体的な使用シーンによります。次の章では、ラムダ関数の具体的な使用例について詳しく見ていきます。

ラムダ関数(lambda)の使用例

ラムダ関数の使いどころは、一時的な関数が必要な場合や、関数が他の関数の引数として使われる場合。以下に、ラムダ関数の具体的な使用例をいくつか紹介します。

サンプル1 リストのソート

ラムダ関数は、sort()sorted()のような関数でキー引数として用いられることが多いです。例えば、次のようにリストの各要素(この場合、タプル)を特定の項目に基づいてソートすることができます。

# タプルのリスト
items = [('apple', 3), ('banana', 2), ('orange', 4), ('pineapple', 1)]

# 2番目の要素(個数)でソート
items.sort(key=lambda item: item[1])
print(items)  # 出力: [('pineapple', 1), ('banana', 2), ('apple', 3), ('orange', 4)]

ここでは、ラムダ関数を sort() メソッドの key 引数として使用しています。ラムダ関数 lambda item: item[1] は、引数としてタプルを受け取り、その2番目の要素(タプルのインデックスは0から始まるため)を返します。

これにより、sort() メソッドはタプルの2番目の要素(果物の個数)に基づいてリストをソートします。

サンプル map, filter, reduce関数との組み合わせ

map(), filter(), reduce()などの関数では、ラムダ関数を引数として受け取ることが多いです。これにより、リストに対する操作を一行で表現することができます。

from functools import reduce

numbers = [1, 2, 3, 4, 5]

# map: 各要素を2倍する
doubled = list(map(lambda x: x * 2, numbers))
print(doubled)  # 出力: [2, 4, 6, 8, 10]

# filter: 偶数のみ取り出す
even = list(filter(lambda x: x % 2 == 0, numbers))
print(even)  # 出力: [2, 4]

# reduce: すべての要素の積を計算する
product = reduce(lambda x, y: x * y, numbers)
print(product)  # 出力: 120

ここでは、map(), filter(), reduce() 関数の各々にラムダ関数を引数として渡しています。

map() 関数は、リストの各要素をラムダ関数で指定した操作(この場合、2倍にする)を適用し、新しいリストを生成します。filter() 関数は、ラムダ関数がTrueを返す要素だけを取り出して新しいリストを生成します(この場合、偶数のみ)。

reduce() 関数は、リストのすべての要素に対してラムダ関数で指定した二項演算(この場合、掛け算)を逐次適用し、単一の結果を得ます。

サンプル イベント駆動型プログラミングでのコールバック関数としての使用

GUI (Graphical User Interface) プログラミングや他のイベント駆動型プログラミングでは、特定のイベント(ボタンのクリックなど)が発生したときに実行されるコールバック関数を定義することがよくあります。これらの一時的な関数として、ラムダ関数がよく用いられます。

import tkinter as tk

def create_button(label, command):
    button = tk.Button(text=label, command=command)
    button.pack()

root = tk.Tk()
create_button('Click me', lambda: print('Button clicked!'))
root.mainloop()

このコードでは、'Click me'というボタンを作成しています。

このボタンがクリックされると、ラムダ関数 lambda: print('Button clicked!') が実行され、コンソールに 'Button clicked!' と出力されます。このように、ラムダ関数は一時的なコールバック関数を定義するのに便利です。

Python:lambda(ラムダ関数)の注意点

Pythonのラムダ関数は便利なツールであり、コードを簡潔に書くのに役立つことが多いです。しかし、その一方でラムダ関数の使用には注意が必要。特にラムダ関数はそのシンプルさ故に複雑なロジックを扱うのには不適切です。

# 不適切なラムダ関数の使用例
result = (lambda x: (x % 2 and 'odd' or 'even'))(3)
print(result)  # 出力: odd

上記の例では、数値が奇数か偶数かを判断するラムダ関数を定義しています。ただし、このコードは一見してその機能が理解しにくいです。さらに、複雑な条件判断やエラーハンドリングを導入すると、さらに混乱を招く可能性があります。

ラムダ関数は、簡潔さと便利さから一見魅力的に見えますが、適切な使用法と注意点を理解することが重要です。特に以下の点に注意しましょう。

ラムダ関数の注意点
  • 複雑さ:ラムダ関数は一行の式に限定されるため、複雑なロジックを含む場合や複数の操作が必要な場合は通常の関数を使用すべきです。
  • 可読性:ラムダ関数は一行で記述されるため、適切に使用しないとコードの可読性を損ねる可能性があります。長すぎるラムダ関数や、複数のラムダ関数が連なったコードは読みにくくなりがちです。
  • 再利用性:ラムダ関数は無名関数であるため、その場で一度だけ使うことを前提としています。同じ機能を何度も使う必要がある場合は、通常の名前付き関数を定義すべきです。

これらの点を考慮に入れ、ラムダ関数を適切に使用することで、Pythonのコードをより効率的かつ可読性高く書くことができます。

Pythonを1から学習したい方は

始めてPythonを勉強するのは結構難しいですよね。

でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。

Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!

読者料典 Python入門:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
Python
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました