Python科学計算——Functional Programming

2512 ワード

関数式プログラミング(Functional Programming)または関数プログラム設計は、汎関数プログラミングとも呼ばれ、コンピュータ演算を数学的な関数計算と見なし、プログラム状態や可変オブジェクトの使用を避けるプログラミングモデルである.Pythonでは,関数式プログラミングは主にpartial(),lambda(),map(),reduce(),filter()のいくつかの関数の使用から構成される.
partial( )
関数を渡すときに、関数を部分的に適用して新しい関数を作成したい場合があります.この場合、巧みな方法はfunctoolsを利用することです.partial作成.
def exp(base,  power):
      return base ** power #         

上記の二元関数で新しい関数two_を作成したい場合はto_The:その入力はべき乗(power)であり、exp(2,power)の結果を出力する.
def two_to_the(power):
    return exp(2,power)
print two_to_the(3) # 8

別の道を切り開く方法はfunctoolsを使うことだ.partial:
from functools import partial
two_to_the = partial(exp, 2)
print two_to_the(3) # 8

もちろん、パラメータの名前を指定することもできます.
square_of = partial(exp, power=2)
print square_of(3) # 9

lambda( )
Lambda()は主に「行内関数」を定義するために使用され、Matlabの「匿名関数」に似ています.具体的な操作は以下の通りです.
f = lambda x : x + 2 #      f(x)=x+2
g = lambda x, y : x + y #      g(x, y)=x+y

map( )
map()関数は、逐一遍歴するために使用されます.たとえばlist a=[1,2,3,4]があり、aの各要素に2を加えて新しいlistを得るには、2つの方法があります.
b = [i+2 for i in a] # list comprehension
b = map(lambda x : x+2, a) # map( )

もちろん、複数のリスト操作の場合、複数のパラメータを持つ関数に対してmap()を使用できます.
products = map(lambda x, y : x * y, [1, 2], [3, 4]) # [1*3, 2*4] = [3, 8]

リスト解析(list comprehension)があれば、なぜmap()関数を使うのでしょうか.実は、リスト解析はコードが簡単だが、本質的にはforループコマンドであり、Pythonのforループコマンドは効率が高くないが、map()関数は同じ機能を実現し、効率が高く、原則として、そのループコマンド速度はC言語に相当する.
reduce( )
map()関数と似ていますが、map()関数は逐一遍歴に使用され、reduce()関数は再帰計算に使用されます.
multiply = reduce(lambda x, y : x * y, [1, 2, 3, 4]) # 1 * 2 * 3 * 4 = 24

reduce()はリストの2つの要素を結合し、それらの結果はリストの3番目の要素を結合し、この結果はその後4番目の要素を結合し、単独の結果が得られるまで順次下りた.
def multiply(x, y):
    return x * y
list_product = partial(reduce, multiply) #     multiply        reduce
x_product = list_product([1, 2, 3, 4])

上記のプロセスは、同様に対応する機能を実現することができる.
filter( )
filter()は、リスト内の条件を満たす要素をフィルタします.たとえば、次のようにします.
b = filter(lambda x : x > 5 and x < 8, range(10)) # [6, 7]

上記のfilter()はリスト解析で書くことができます.
b = [i for i in range(10) if i > 5 and i < 8]

明らかにfilter()はリスト解析におけるifの作業を行った.
注意:リスト解析は上記の関数より複雑ではありませんが、簡潔さと効率を両立させるとともに、リスト解析に関数式の代替案を提供する関数partial()、lambda()、map()、reduce()、filter()を使用します.
Stay hungry, Stay foolish. -- Steve Jobs