【Python】第3章第7回:高階関数(map, filter, reduce)の使い方
本記事では、Pythonの高階関数であるmap
、filter
、reduce
の基本的な使い方と応用例を解説します。高階関数を活用して、コードを効率的かつ簡潔に記述しましょう。
0. 記事の概要
この記事を読むメリット
- 高階関数の基本を理解:コードの効率化に役立ちます。
- シンプルで短いコード:冗長なループを高階関数に置き換えられます。
- 実践的なスキルの向上:リスト処理やデータフィルタリングを簡単に行えます。
この記事で学べること
map
,filter
,reduce
の基本的な使い方- 高階関数を活用した応用例
- Pythonicなコードの記述方法
1. 高階関数の基本
1.1 高階関数とは?
高階関数とは、他の関数を引数として受け取る関数、または関数を返す関数のことです。Pythonのmap
、filter
、reduce
がその代表例です。
1.2 それぞれの基本的な動作
map
: イテラブル(リストなど)の各要素に関数を適用します。filter
: 条件を満たす要素だけを抽出します。reduce
: イテラブルの要素を累積的に処理します(functools
モジュールからインポートが必要)。
# 高階関数の基本例
from functools import reduce
numbers = [1, 2, 3, 4, 5]
# mapの例
squared_numbers = list(map(lambda x: x ** 2, numbers))
# filterの例
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
# reduceの例
sum_of_numbers = reduce(lambda x, y: x + y, numbers)
print(f"平方リスト: {squared_numbers}")
print(f"偶数リスト: {even_numbers}")
print(f"合計: {sum_of_numbers}")
動作解説
map
: 各要素を平方に変換し、新しいリストを生成します。filter
: 偶数のみを抽出します。reduce
: リストの全要素を累積加算します。
2. map, filter, reduceの応用例
2.1 map関数の応用例
複数のリストを結合し、対応する要素を計算します。
# 2つのリストの要素を加算
list1 = [1, 2, 3]
list2 = [4, 5, 6]
summed_list = list(map(lambda x, y: x + y, list1, list2))
print(f"加算結果: {summed_list}")
2.2 filter関数の応用例
特定の文字を含む文字列をフィルタリングします。
# 指定文字を含む文字列を抽出
words = ["apple", "banana", "cherry", "date"]
filtered_words = list(filter(lambda word: "a" in word, words))
print(f"フィルタリング結果: {filtered_words}")
2.3 reduce関数の応用例
最大公約数を求めます。
# リスト内の最大公約数を求める
from math import gcd
from functools import reduce
numbers = [48, 64, 16]
gcd_result = reduce(lambda x, y: gcd(x, y), numbers)
print(f"最大公約数: {gcd_result}")
3. 高階関数を使用する際の注意点
3.1 ラムダ関数の簡潔性と読みやすさ
ラムダ関数を使いすぎると、コードが読みにくくなる可能性があります。必要に応じて名前付き関数を使用しましょう。
3.2 適切な使用場面を選ぶ
高階関数は便利ですが、場合によってはリスト内包表記やループの方が分かりやすいこともあります。
4. 練習問題
以下の課題に挑戦してみましょう。
- リスト内の各要素を2倍にするコードを
map
を使って書いてください。 - 文字列リストから特定の文字で始まる単語を抽出するコードを
filter
で書いてください。 - リスト内の数値を全て掛け合わせるコードを
reduce
で書いてください。
5. 練習問題の解答と解説
問1の解答例
# 各要素を2倍にする
numbers = [1, 2, 3, 4, 5]
doubled_numbers = list(map(lambda x: x * 2, numbers))
print(f"2倍のリスト: {doubled_numbers}")
問2の解答例
# 特定の文字で始まる単語を抽出
words = ["apple", "banana", "cherry", "apricot"]
filtered_words = list(filter(lambda word: word.startswith("a"), words))
print(f"フィルタリング結果: {filtered_words}")
問3の解答例
# 全ての数値を掛け合わせる
from functools import reduce
numbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers)
print(f"積: {product}")
6. まとめ
高階関数を使うことで、複雑な操作を簡潔に表現できます。特に、データ処理や分析の際に役立ちますので、ぜひ活用してみてください。