例python関数式プログラミングの説明

3925 ワード

関数式プログラミングは一連の関数を使って問題を解決し、一般的なプログラミング思考に従って、問題に直面する時私たちの思考方式は“どのようにします”で、関数式プログラミングの思考方式は私が“何をします”です.関数式プログラミングの特徴はしばらくまとめないで、私たちは直接例を持って関数式プログラミングとは何かを体得します.
Lambda式(匿名関数):
一般関数と匿名関数の定義方法:
 
  
#
def add(a,b):
    return a + b

print add(2,3)


#
add = lambda a,b : a + b
print add(2,3)


#======== ===========
5


匿名関数の命名規則はlamdbaキーワードで識別され、コロン(:)左側は関数が受信したパラメータ(a,b)、コロン(:)右側は関数の戻り値(a+b)を表す.
lamdbaは作成時に名前を付ける必要がないので、匿名関数と言います^^;
Map関数:文字列の長さを計算する
 
  
abc = ['com','fnng','cnblogs']

for i in range(len(abc)):
    print len(abc[i])

#======== ===========
4


abc文字列配列を定義し、abc長を計算し、出力配列内の各文字列の長さをループします.
map()関数がこのプロセスをどのように実現するかを見てみましょう.
 
  
abc_len = map(len,['hao','fnng','cnblogs'])

print abc_len

#======== ===========
[3, 4, 7]


出力の結果は同じですが、形式が異なり、1つ目は単純な数値で、map()関数の出力は配列のフォーマットを維持しています.
大文字と小文字の変換
pythonでは、upper()とlower()を使用して大文字と小文字を変換できます.
 
  
#
ss='hello WORLD!'

print ss.upper()  #
print ss.lower()  #

#======== ===========
HELLO WORLD!
hello world!


map()関数で変換:
 
  
def to_lower(item):
    return item.lower()

name = map(to_lower,['cOm','FNng','cnBLoGs'])
print name

#======== ===========
['com', 'fnng', 'cnblogs']


この例では、伝達された値を変更することなく、伝達された値を簡単に操作して返す関数toUpperを意味していることがわかります.次にmap関数に用いると,私たちが何をしたいのかを明確に記述できる.
文字列の大文字と小文字の変換をどのように実現するかを見てみましょう.
 
  
abc = ['cOm','FNng','cnBLoGs']
lowname = []

for i in range(len(abc)):
    lowname.append(abc[i].lower())

print lowname

#======== ===========
['hao', 'fnng', 'cnblogs']


map()関数にlambda式(匿名関数)を加えると、より強力な機能を実現できます.
 
  
#
#0*0,1*1,2*2,3*3,....8*8
squares = map(lambda x : x*x ,range(9))
print squares

#======== ===========
[0, 1, 4, 9, 16, 25, 36, 49, 64]


Reduce関数:
 
  
def add(a,b):
    return a+b

add = reduce(add,[2,3,4])
print add

#======== ===========


Reduce関数については,毎回2つのデータを処理する必要があるので,2と3を優先し,add関数を加算して5を得,次いで5と4を取り,add関数で処理し,最終的に9を得た.
前のmap関数の例では,map関数は毎回1つのデータのみを処理することを示した.
 
次に,Reduce関数にlambda式を加えた次数乗算がどのように単純であるかを見出した.
 
  
#5
#5!=1*2*3*4*5
print reduce(lambda x,y: x*y, range(1,6))

#======== ===========


Pythonの中にはmapとreduceのほかに、filter、find、all、anyなどの関数が補助されています(他の関数式の言語もあります).コードをより簡潔に、読みやすくすることができます.もっと複雑な例を見てみましょう
 
  
#

number =[2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8]
count = 0
sum = 0

for i in range(len(number)):
    if number[i]>0:
        count += 1
        sum += number[i]

print sum,count

if count>0:
    average = sum/count

print average

#======== ===========
6


関数式でプログラミングすると、この例は次のように書くことができます.
 
  
number =[2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8]
sum = filter(lambda x: x>0, number)
average = reduce(lambda x,y: x+y, sum)/len(sum)
print average
#======== ===========

最後に、関数プログラミングには次のようなメリットがあります.
1)コードが簡単になりました.2)データセット,操作,戻り値が一緒に置かれている.3)コードを読むときに循環体がなくなると,一時変数が少なくなり,変数が逆さまに論理的になる.4)あなたのコードは、どのようにするかではなく、何をするかを説明するようになりました.