PythonにおけるFunctional Programmingの底堀り
James Reed
Infrastructure Engineer · Leapcell

Functional Programmingの概要
Functional programmingは、コードのすべての部分が不変であり、純粋な関数で構成されるスタイルを指します。純粋な関数とは、他の関数とは独立しており、同じ入力が与えられた場合、常に同じ出力を生成する関数のことです。
さらに、functional programmingには、関数を別の関数の引数として渡したり、関数を返したりできるという特徴があります。
純粋な関数の例
たとえば、リスト内の要素の値を2倍にするには、次の関数を使用できます。
def multiply_2(list): for index in range(0, len(list)): list[index] *= 2 return list
このコードは、リスト内の要素の値が変更されるため、純粋な関数の形式ではないことに注意してください。multiply_2()
関数を複数回呼び出すと、毎回結果が異なります。
multiply_2()
を純粋な関数にするには、次のように新しいリストを作成して返す必要があります。
def multiply_2_pure(list): new_list = [] for item in list: new_list.append(item * 2) return new_list
Functional Programmingの利点と欠点
Functional programmingの利点は、主に、純粋な関数と不変の特性により、プログラムがより堅牢になり、デバッグとテストが容易になるという点にあります。欠点は、主に多くの制限があり、記述が難しいことです。
純粋なFunctional Programming言語(Scalaなど)では、記述された関数に変数がないため、入力が決定されれば、出力が決定されることが保証されることに注意してください。変数の使用を許可するプログラミング言語では、関数内の変数の状態が不確実なため、同じ入力でも異なる出力になる可能性があります。
Pythonでは変数の使用が許可されているため、純粋なFunctional Programming言語ではありません。Pythonは、Functional Programmingの部分的なサポートのみを提供し、主に3つの関数map()
、filter()
、およびreduce()
が含まれています。これらは通常、lambda
匿名関数と一緒に使用されます。次に、これら3つの関数の使用法を1つずつ紹介します。
PythonのFunctional Programmingサポート関数
Python map()関数
map()
関数の基本的な構文は次のとおりです。
map(function, iterable)
ここで、function
パラメーターは、渡される関数を表します。これは、組み込み関数、カスタム関数、またはlambda
匿名関数にすることができます。iterable
は、リストや文字列など、1つ以上のiterableオブジェクトを表します。
map()
関数の機能は、iterableオブジェクト内の各要素に対して指定された関数を呼び出し、map
オブジェクトを返すことです。
関数はmap
オブジェクトを返すことに注意してください。これは、直接出力できません。for
ループまたはlist()
関数を使用して表示できます。
[例1]リスト内の各要素に2を掛ける
listDemo = [1, 2, 3, 4, 5] new_list = map(lambda x: x * 2, listDemo) print(list(new_list))
実行結果は次のとおりです。
[2, 4, 6, 8, 10]
[例2]複数のiterableオブジェクトをパラメーターとしてmap()関数に渡す
listDemo1 = [1, 2, 3, 4, 5] listDemo2 = [3, 4, 5, 6, 7] new_list = map(lambda x,y: x + y, listDemo1,listDemo2) print(list(new_list))
実行結果は次のとおりです。
[4, 6, 8, 10, 12]
map()
関数はC言語で直接記述されているため、実行時にPythonインタープリターを介して間接的に呼び出す必要がなく、内部で多くの最適化が行われていることに注意してください。したがって、他の方法と比較して、この方法は実行効率が最も高くなります。
Python filter()関数
filter()
関数の基本的な構文は次のとおりです。
filter(function, iterable)
この形式では、funcition
パラメーターは渡される関数を表し、iterable
はiterableオブジェクトを表します。
filter()
関数の機能は、function
関数を使用してiterable
内の各要素を判別し、True
またはFalse
を返すことです。最後に、True
を返す要素が新しいトラバーサル可能なコレクションに結合されます。
[例3]リスト内のすべての偶数を返す
listDemo = [1, 2, 3, 4, 5] new_list = filter(lambda x: x % 2 == 0, listDemo) print(list(new_list))
実行結果は次のとおりです。
[2, 4]
[例4] filter()関数は複数のiterableオブジェクトを受け入れる
listDemo = [1, 2, 3, 4, 5] new_list = map(lambda x,y: x-y>0,[3,5,6],[1,5,8] ) print(list(new_list))
実行結果は次のとおりです。
[True, False, False]
Python reduce()関数
reduce()
関数は、通常、コレクションに対していくつかの累積操作を実行するために使用されます。その基本的な構文は次のとおりです。
reduce(function, iterable)
ここで、function
は2つのパラメーターを持つ関数である必要があり、iterable
はiterableオブジェクトを表します。
reduce()
関数はPython 3.xで削除され、functools
モジュールに配置されているため、この関数を使用する前にfunctools
モジュールをインポートする必要があることに注意してください。
[例5]リスト内の要素の積を計算する
import functools listDemo = [1, 2, 3, 4, 5] product = functools.reduce(lambda x, y: x * y, listDemo) print(product)
実行結果は次のとおりです。
120
まとめ
一般に、コレクション内の要素に対して何らかの操作を実行する場合、操作が非常に単純な場合(加算、累積など)、最初にmap()
、filter()
、およびreduce()
を検討する必要があります。さらに、データ量が非常に大きい場合(機械学習アプリケーションなど)、Functional Programming表現は通常、効率が高いため優先されます。
もちろん、データ量が大きくない場合は、for
ループなどのメソッドも使用できます。ただし、コレクション内の要素に対して、より複雑な操作を実行する必要がある場合は、コードの可読性を考慮して、通常はfor
ループが使用されます。
Leapcell:Webホスティング、非同期タスク、およびRedisの次世代サーバーレスプラットフォーム
最後に、Pythonアプリをデプロイするための最適なプラットフォームをお勧めします:Leapcell
1. 多言語サポート
- JavaScript、Python、Go、またはRustで開発します。
2. 無料で無制限のプロジェクトをデプロイする
- 使用量に対してのみ支払い — リクエストなし、料金なし。
3. 比類のないコスト効率
- アイドル料金なしで従量課金。
- 例:25ドルで、平均応答時間60ミリ秒で694万のリクエストをサポートします。
4. 合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI / CDパイプラインとGitOps統合。
- 実用的な洞察のためのリアルタイムメトリックとロギング。
5. 容易なスケーラビリティと高性能
- 高い同時実行性を簡単に処理するための自動スケーリング。
- 運用上のオーバーヘッドゼロ — 構築に集中するだけです。
Leapcell Twitter:https://x.com/LeapcellHQ