未分類

【Python】第3章第7回:高階関数(map, filter, reduce)の使い方

本記事では、Pythonの高階関数であるmapfilterreduceの基本的な使い方と応用例を解説します。高階関数を活用して、コードを効率的かつ簡潔に記述しましょう。

0. 記事の概要

この記事を読むメリット

  • 高階関数の基本を理解:コードの効率化に役立ちます。
  • シンプルで短いコード:冗長なループを高階関数に置き換えられます。
  • 実践的なスキルの向上:リスト処理やデータフィルタリングを簡単に行えます。

この記事で学べること

  • map, filter, reduceの基本的な使い方
  • 高階関数を活用した応用例
  • Pythonicなコードの記述方法

1. 高階関数の基本

1.1 高階関数とは?

高階関数とは、他の関数を引数として受け取る関数、または関数を返す関数のことです。Pythonのmapfilterreduceがその代表例です。

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}")
動作解説
  1. map: 各要素を平方に変換し、新しいリストを生成します。
  2. filter: 偶数のみを抽出します。
  3. 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. 練習問題

以下の課題に挑戦してみましょう。

  1. リスト内の各要素を2倍にするコードをmapを使って書いてください。
  2. 文字列リストから特定の文字で始まる単語を抽出するコードをfilterで書いてください。
  3. リスト内の数値を全て掛け合わせるコードを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. まとめ

高階関数を使うことで、複雑な操作を簡潔に表現できます。特に、データ処理や分析の際に役立ちますので、ぜひ活用してみてください。