Python 3におけるlambda式と関数式のプログラミングの説明

2808 ワード

今日はPython 3のlambda式と関数式のプログラミングについて説明します.しかし、関数の名前をつけるのに苦労したくない場合、つまり匿名関数を指します.一般的には、次のような使用方法があります.
1、lambdaの一般的な形式はキーワードlambdaの後ろに1つ以上のパラメータが付いていて、1つのコロンに続いていて、後で式です.Lambdaは文ではなく式です.Python構文でdefが許可されていない場所に表示されます.式としてlambdaは値(すなわち新しい関数)を返します.Lambdaは簡単な関数を記述するために使用され、defはより強力なタスクを処理するために使用されます.例:
f = lambda x,y,z : x+y+z 
print f(1,2,3) 
g = lambda x,y=2,z=3 : x+y+z 
print g(1,z=4,y=5)

結果:
6 
10

2、lambda式はジャンプテーブル(jump table)を書くのによく使われ、動作のリストや辞書である.例:
L = [(lambda x: x**2), 
  (lambda x: x**3), 
  (lambda x: x**4)] 
print L[0](2),L[1](2),L[2](2) 
D = {'f1':(lambda: 2+3), 
  'f2':(lambda: 2*3), 
  'f3':(lambda: 2**3)} 
print D['f1'](),D['f2'](),D['f3']()

結果:
4 8 16 
5 6 8

3、lambda式はネストして使用できますが、可読性の観点から、ネストしたlambda式はできるだけ避けるべきです.
Lambda関数は匿名関数とも呼ばれ、匿名関数は名前のない関数で、関数は名前がなくてもいいですか?もちろんいいですよ.一部の関数は、一時的に使用するだけで、ビジネスロジックも簡単な場合は、名前を付けなければならない必要はありません.Lamdba関数のシーンの正しい使用:
1、関数式プログラミング
Pythonは純粋な関数式プログラミング言語とは言えませんが、それ自体は多くの関数式プログラミングの特性を提供しています.Pythonには、map、reduce、filter、sortedなどの関数がパラメータとしてサポートされているように、定義されたグローバル関数がいくつかあります.lambda関数は関数式プログラミングに応用できます.次のようになります.
from functools import reduce
foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
print (list(filter(lambda x: x % 3 == 0, foo)))
#[18, 9, 24, 12, 27]
print (list(map(lambda x: x * 2 + 10, foo)))
#[14, 46, 28, 54, 44, 58, 26, 34, 64]
print (reduce(lambda x, y: x + y, foo))
#139

2、閉包
閉パケット自体は難解な概念であり,ここでは単純に乱暴に閉パケットとして関数内部に定義された関数であり,閉パケットは変数がその関数の役割ドメイン範囲から離れてもアクセスできるようにする.Lambda関数は、閉パッケージの例として使用されます.
>>> def my_add(n):
...   return lambda x:x+n
>>> add_3 = my_add(3)
>>> add_3(7)
10

ここでlambda関数は閉パケットであり、グローバル役割ドメインの範囲でadd_3(7)は正常に実行でき、戻り値は10です.10を返すのはmy_addローカル役割ドメインでは、変数nの値が閉パケットの役割を果たすため、グローバル役割ドメインにもアクセスできる.
通常の関数に置き換えると、閉パッケージも実現できますが、この方法は少しうるさいだけです.以下のようにします.
>>> def my_add(n):
...   def wrapper(x):
...     return x+n
...   return wrapper
...
>>> add_5 = my_add(5)
>>> add_5(2)
7

しかし、lambda関数は通常の関数よりも明確ではありません.この例を見てください.
f = lambda x: [[y for j, y in enumerate(set(x)) if (i >> j) & 1] for i in range(2**len(set(x)))]

これはある集合のすべてのサブセットを返すlambda関数で、しばらく見てから分かると信じています.
pythonにはExplicit is better than implicit(難解より明らか)という言葉があります.lambda関数でコードをより明確にできない場合は、通常の方法で関数を定義することを考慮します.
最后に皆さんに1つの资源のとてもそろっているpythonの学习の集まりを推荐して、[クリックして入ります]、ここに私が以前の学习の心得を収集して、ノートを学んで、まだ第一線の企业の仕事の経験があって、しかも大定onのゼロの基础にプロジェクトの実戦の资料まであげて、みんなも下で、言叶を残して、分からないことを提出して、みんなはいっしょに学习の进歩の総括
以上はこの文章のすべての内容で、本文の内容はみんなの学習あるいは仕事に対して一定の参考学習価値を持っていることを望んで、