Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】How to use reduce function in Python

2025年09月19日に「Dev.to」が公開したITニュース「How to use reduce function in Python」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Pythonの`reduce`関数は、リストなどの複数の要素を関数で繰り返し結合し、1つの値に集約する。これにより、合計や積、文字列の連結など、繰り返し処理を簡潔に記述できる。利用するには`functools`モジュールからインポートする必要がある。

出典: How to use reduce function in Python | Dev.to公開日:

ITニュース解説

Pythonのreduce関数は、リストやタプルといった複数の要素を持つデータ群(これをプログラミングでは「イテラブル」と呼ぶ)に対して、ある特定の操作を繰り返し適用し、最終的に一つの値に集約する強力な機能である。この関数を使うと、通常はループ文(for文など)を使ってイテラブルの要素を一つずつ処理するところを、より簡潔で機能的なスタイルで記述できる点が特徴だ。簡単に言えば、たくさんの値を「減らして」最終的な一つの結果にまとめるイメージを持つと分かりやすいだろう。これは、例えば多くの数値の合計を計算したり、リスト内のすべての文字列を結合したりといった累積的な操作を行う際に特に役立つ。

reduce関数を利用するためには、まずfunctoolsという標準ライブラリのモジュールからreduceをインポートする必要がある。reduceはPythonの「組み込み関数」(Pythonをインストールしたらすぐに使える関数)ではないため、from functools import reduceという行をコードの先頭に書く必要がある。reduce関数の基本的な構文はreduce(function, iterable[, initializer])という形をとる。ここで指定する引数それぞれが特定の役割を持っている。

一つ目の引数であるfunctionは、二つの引数を受け取り、一つの値を返す関数を指定する。reduce関数はこのfunctionをイテラブルの要素に順次適用していく。例えば、数値の加算を行う関数や、文字列を結合する関数などがこれに該当する。二つ目の引数iterableは、reduce関数が処理する対象となるデータ群で、リストやタプルなどが含まれる。このイテラブルの各要素が、順次functionに渡されて処理される。そして三つ目の引数initializerはオプションで、これは計算の開始点となる初期値を指定する。もしこのinitializerが提供されなかった場合、イテラブルの最初の要素が初期値として使われ、二番目の要素からfunctionの適用が始まる。reduce関数の最終的な戻り値は、指定された関数がイテラブルの全ての要素に適用された結果として得られる単一の値となる。

具体的なコード例を通して、reduce関数の動作をより深く理解しよう。例えば、リスト内の数値の合計を計算する場合を考える。

1from functools import reduce
2
3def add(x, y):
4    return x + y
5
6numbers = [2, 4, 6, 8]
7result = reduce(add, numbers)
8print(result)  # 出力: 20

このコードでは、add関数がnumbersリストの要素に対して順次適用される。まず、numbersの最初の二つの要素である2と4がadd関数に渡され、結果として6が返される。次に、この計算結果である6とリストの次の要素である6がadd関数に渡され、12が返される。さらに、この12とリストの最後の要素である8が渡され、最終的に20という結果が得られる。このように、reduce関数は前の計算結果と次の要素を組み合わせていく形で処理を進め、一つの累積的な結果を生成する。

次に、リスト内の数値の積を計算する例を見てみよう。

1from functools import reduce
2
3def multiply(x, y):
4    return x * y
5
6numbers = [1, 3, 5, 7]
7product = reduce(multiply, numbers)
8print(product)  # 出力: 105

この場合も同様に、multiply関数がnumbersリストの要素に適用される。まず1と3が掛け合わされて3になり、次にこの3とリストの次の要素である5が掛け合わされて15になり、最後にこの15とリストの最後の要素である7が掛け合わされて105という最終結果が得られる。加算の例と同じように、前の計算結果が次のステップの入力として使われる累積的な処理が行われているのがわかる。

文字列を結合する際にもreduce関数は便利に使える。

1from functools import reduce
2
3def join_strings(a, b):
4    return a + " " + b
5
6words = ["Python", "reduce", "function", "tutorial"]
7sentence = reduce(join_strings, words)
8print(sentence)  # 出力: "Python reduce function tutorial"

この例では、join_strings関数が文字列の結合を担当し、単語間にスペースを挿入しながら処理を進める。まず"Python"と"reduce"が結合され、"Python reduce"となる。次にこれと"function"が結合され、"Python reduce function"となる。最後に"tutorial"が結合され、"Python reduce function tutorial"という一つの文字列が完成する。reduce関数は数値だけでなく、文字列のような他のデータ型にも適用できる柔軟性を持っている。

initializer引数を使うと、計算の開始点を自由に設定できる。

1from functools import reduce
2
3def add(x, y):
4    return x + y
5
6numbers = [10, 20, 30]
7result = reduce(add, numbers, 100)  # 100から計算が始まる
8print(result)  # 出力: 160

この例では、initializerとして100が指定されている。このため、reduce関数はリストの最初の要素である10から処理を開始するのではなく、まず100numbersの最初の要素である10add関数に渡し、110という結果を得る。次にこの110numbersの次の要素である20add関数に渡し130を得る。最後に130numbersの最後の要素である30add関数に渡し、最終結果として160を得る。initializerを設定することで、もしリストが空であった場合でもエラーを回避できる利点があるため、積極的に活用することが推奨される。

reduce関数は様々な現実世界のシナリオで活用できる。例えば、データ処理の分野では、複数の売上データを合計したり、CSVファイル(カンマ区切りでデータを並べたファイル)の行データを結合したり、センサーからの読み取り値を集計したりといった用途で利用できる。数学的な計算では、階乗の計算(例えば5の階乗は5×4×3×2×1)や累積的な積の算出などに役立つ。文字列操作では、複数の単語を結合して複雑な文字列を整形する際に利用できる。さらに、ログデータの集約や複数の辞書(キーと値のペアを格納するデータ構造)の結合、複数のステップを要するカスタム集計など、多岐にわたる場面でその能力を発揮する。

しかし、reduce関数を使う上でいくつかのベストプラクティスがある。第一に、もしsum()max()のようなPythonの組み込み関数で同じ処理ができるのであれば、そちらを優先して使うべきだ。これらの組み込み関数は一般的にreduceよりもコードの意図が明確で、内部的に最適化されているため、より読みやすく、高速に動作する場合が多い。

次に、reduceに渡す関数は、特に複雑な操作を行う場合は、lambda関数(その場で一時的に定義する小さな無名関数)よりも名前付き関数として定義すると良い。名前付き関数は、その機能が明確に記述されるため、コードの可読性が大幅に向上し、他の開発者も理解しやすくなる。また、functoolsモジュールからのインポートを常に忘れないようにすることが重要だ。Python 3ではreduceは組み込み関数ではないため、インポートなしには使用できない。さらに、iterableが空である可能性がある場合は、エラーを避けるためにinitializerを必ず提供するべきだ。これにより、イテラブルが空のときにreduce関数が起こす可能性のある実行時エラーを防ぐことができる。最後に、reduceに渡す関数は、副作用を持たない「純粋な関数」であることが望ましい。純粋な関数とは、同じ入力に対して常に同じ出力を返し、プログラムの他の部分の状態(例えばグローバル変数の値など)を変更しない関数のことだ。これにより、コードの予測可能性が高まり、デバッグが容易になるという利点がある。

reduce関数は、Pythonプログラミングにおいて、複数のイテラブルな要素を一つの値に集約する操作を簡潔に表現するための非常に価値あるツールである。その構文と動作原理を理解し、明確に定義された関数と組み合わせて使用することで、よりクリーンで機能的なスタイルのコードを書けるようになる。データ集計、数学的計算、文字列操作など、どのような状況においても、reduce関数は洗練された効率的なPythonコードを書く上で頼りになる存在となるだろう。

関連コンテンツ