短い関数をその場で定義!関数をデータのように扱おう!
これまでのステップで、関数の定義方法や呼び出し方を学びましたね!💪 このセクションでは、Pythonの強力な機能である「ラムダ式」と「関数を引数として渡す」方法について学びます。これらをマスターすると、より簡潔で効率的なコードを書けるようになりますよ!
ラムダ式(無名関数)とは? 🤔
ラムダ式は、名前を持たない小さな関数を定義するための簡潔な方法です。無名関数とも呼ばれます。通常のdef
文で関数を定義するよりも手軽に、一行で関数を作成できます。
ラムダ式の基本的な構文は次のとおりです。
lambda 引数1, 引数2, ...: 式
lambda
キーワードの後に引数を記述し、コロン:
の後にその引数を使った式を記述します。この式の結果が、ラムダ関数の戻り値となります。
通常の関数定義との比較
例えば、受け取った数値を2倍にする関数を考えてみましょう。
通常の関数定義:
def double(x):
return x * 2
print(double(5)) # 出力: 10
ラムダ式を使った場合:
double_lambda = lambda x: x * 2
print(double_lambda(5)) # 出力: 10
このように、ラムダ式を使うと一行で同じ機能を持つ関数を定義できます。ただし、ラムダ式は単純な処理に限定され、複数行にわたる処理や複雑な文(if文やfor文など)を含むことはできません。
ラムダ式の例
- 2つの数値を足す:
lambda a, b: a + b
- 文字列の長さを返す:
lambda s: len(s)
- 数値が偶数かどうかを判定する:
lambda n: n % 2 == 0
関数を引数として渡す (高階関数) 🧐
Pythonでは、関数もオブジェクトの一種として扱われます。これは、関数を変数に代入したり、他の関数の引数として渡したり、関数の戻り値として返したりできることを意味します。関数を引数として受け取ったり、関数を戻り値として返す関数のことを高階関数 (Higher-order function) と呼びます。
関数を引数に取る関数の例
def apply_twice(func, arg):
"""指定された関数を引数に2回適用する"""
return func(func(arg))
def add_one(x):
"""数値に1を加える"""
return x + 1
# add_one関数をapply_twiceに渡す
result = apply_twice(add_one, 10)
print(result) # 出力: 12 (add_one(add_one(10)) と同じ)
# ラムダ式を直接渡すことも可能
result_lambda = apply_twice(lambda x: x * 3, 2)
print(result_lambda) # 出力: 18 ((lambda x: x * 3)((lambda x: x * 3)(2)) と同じ → 3 * (3 * 2) = 18)
上記のapply_twice
関数は、第一引数として関数func
を受け取り、第二引数arg
に対してその関数を2回適用しています。このように、処理内容(関数)を外部から注入できるため、汎用性の高い関数を作成できます。
組み込み関数での利用例
関数を引数として渡す機能は、Pythonの組み込み関数で非常によく使われています。特にmap()
, filter()
, sorted()
などでラムダ式と組み合わせて使われることが多いです。
map()関数
map(function, iterable)
は、iterable
(リストなど)の各要素にfunction
を適用し、その結果を返すイテレータを生成します。
numbers = [1, 2, 3, 4, 5]
# 各要素を2乗する
squared_numbers = map(lambda x: x**2, numbers)
print(list(squared_numbers)) # 出力: [1, 4, 9, 16, 25]
# mapオブジェクトはイテレータなので、list()でリストに変換しています
filter()関数
filter(function, iterable)
は、iterable
の各要素にfunction
を適用し、結果がTrue
となる要素だけを集めたイテレータを生成します。
numbers = [1, 2, 3, 4, 5, 6]
# 偶数だけを抽出する
even_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(even_numbers)) # 出力: [2, 4, 6]
sorted()関数
sorted(iterable, key=function)
は、iterable
をソートした新しいリストを返します。key
引数に関数を指定すると、その関数の戻り値に基づいてソートが行われます。
students = [
{'name': 'Alice', 'score': 85},
{'name': 'Bob', 'score': 92},
{'name': 'Charlie', 'score': 78}
]
# score(点数)に基づいて昇順でソートする
sorted_students = sorted(students, key=lambda student: student['score'])
print(sorted_students)
# 出力: [{'name': 'Charlie', 'score': 78}, {'name': 'Alice', 'score': 85}, {'name': 'Bob', 'score': 92}]
# score(点数)に基づいて降順でソートする場合 (reverse=Trueを追加)
sorted_students_desc = sorted(students, key=lambda student: student['score'], reverse=True)
print(sorted_students_desc)
# 出力: [{'name': 'Bob', 'score': 92}, {'name': 'Alice', 'score': 85}, {'name': 'Charlie', 'score': 78}]
map()
やfilter()
が返すのはリストではなくイテレータです。結果をリストとして扱いたい場合はlist()
で変換する必要があります。メリット ✨
ラムダ式と関数の引数化を理解し、活用することにはいくつかのメリットがあります。
- コードの簡潔化: 一時的にしか使わない単純な関数を
def
で定義する手間が省け、コードが短くなります。 - 可読性の向上 (場合による):
map
,filter
,sorted
などと組み合わせることで、何を行っているかが明確になることがあります。ただし、複雑すぎるラムダ式は逆に可読性を下げる可能性もあります。 - 汎用的な関数の作成: 処理の一部を関数として外部から渡せるようにすることで、再利用性の高い柔軟な関数を作成できます。
まとめ 🎉
今回は、名前のない小さな関数を作るためのラムダ式と、関数自体を値として扱い、他の関数の引数として渡す方法について学びました。
- ラムダ式は
lambda 引数: 式
の形で定義します。 - 関数はオブジェクトであり、変数に入れたり、引数として渡したりできます。
map()
,filter()
,sorted()
などの組み込み関数では、処理内容をラムダ式などで指定することがよくあります。
これらのテクニックは、特にデータ処理やイベント処理などで強力な武器となります。最初は少し難しく感じるかもしれませんが、実際にコードを書いて使ってみることで、その便利さを実感できるはずです! 😉
次のステップでは、Pythonに標準で用意されている便利な機能群「標準ライブラリ」の使い方を学びます。お楽しみに!
参考情報 📚
- Python 公式ドキュメント – ラムダ式: https://docs.python.org/ja/3/tutorial/controlflow.html#lambda-expressions
- Python 公式ドキュメント – 組み込み関数 (map, filter, sortedなど): https://docs.python.org/ja/3/library/functions.html
コメント