浅い分析Python関数式プログラミング


Functional Prograamming、関数式プログラミング。Pythonは関数式プログラミングに対して部分的なサポートを提供します。純関数プログラミングの場合、いずれの関数に対しても、入力が確定されている限り、出力は決定され、副作用がないということができます。
一、高次関数
1、変数指向関数
関数の計算結果は、x=abs(-5)などの変数に値を与えることができることを知っています。
同じ原理では、変数は、f=absなどの関数を指すこともできる。
一つの変数が関数を指す場合、直接abs(x)を呼び出してf(x)を実行して返した結果とは全く同じです。
2、関数名も変数です。
関数名をabs()関数のような変数と見なすこともできます。ステートメントabs=-5を実行すると、abs(-5)を呼び出したらエラーが発生します。このときabsは絶対値関数ではなく、整数-5を指しています。
3、関数を形参とします。
変数が関数を指すことができる上、関数も変数として作用することができるので、もう一つの関数は自分の形式パラメータとして受信できます。すなわち高次関数を実現します。たとえば:

>>> def add(x , y , f ): #          。

...   return f(x) + f(y)

>>> add (-5,-2,abs)

7
二、関数式プログラミングの内建関数
1、map(func、seq)
文法:map(func,seq)は、2つのパラメータを受信し、1つは関数funcで、もう一つは反復可能なオブジェクトです。
作用:入ってきたfunc関数をseqシーケンスの各要素にループし、新しい反復可能なオブジェクトを返します。
なお、map()関数は、得られた結果をリスト形式で返すことができます。
くりを挙げます。map()でf(x)=x*xを実現します。

>>> def f(x):

...   return x*x

...

>>> map(f,[1,2,3,4,5])

<map object at 0x0327F670>

>>> list(map(f,[1,2,3,4,5]))   #      f             list()

[1, 4, 9, 16, 25]
もちろん、他の方法でも実現できます。
exp 1:list(map((lamda x:x*),[1,2,3,4,5])
exp 2:[x*x for x in[1,2,3,4,5]
2、reduce(func、list)
文法:reduce(func,list)は、二つのパラメータを受け入れなければなりません。
機能:listシーケンスにfunc関数を作用させます。シーケンスの最初の2つの要素x 1とx 2を取り出して、funcに作用して、取る1つの単一の値、例えばa、更にaとシーケンスの次の要素x 3をfunc演算して、このように繰り返します。その効果はreduce(f,x 1,x 2,x 3)=f(x 1,x 2)、x 3に相当します。
注意:reduce()を使用すると、モジュールfrom functools import reduceを導入しなければなりません。
みんなは自分で栗を探して遊ぶことができます。
3、ファイター()
シンタックス:filter(func,[シーケンス])は、フィルタ関数とシーケンスを受信します。は、Iteratorが反復可能なオブジェクトを返します。
機能:Fnc規則に従ってシーケンスをフィルタリングして、filter()は伝来の関数funcを各要素にそのまま作用させてから、戻り値TrueorFalseに基づいて、Trueの対応する要素として保留します。
注意:map()と同様に、filter()は反復可能なオブジェクトを返すので、得られた結果をlist()を使用して確認し、listタイプに戻る必要があります。
一つのリストで偶数を削除して奇数を残します。

>>> def is_odd(n):

...   return n % 2 == 1 #   0(false)  1(True)

...

>>> list( filter(is_odd,[1,2,3,4,5,6,7,8,9]) )

[1, 3, 5, 7, 9]