pythonのlambda使用

6786 ワード

print sorted(f,key = lambda x:x["name"]).#Lambdaは、以下の説明を参照して使用すると、key(x)という関数を呼び出すことに相当し、xは入力されたオブジェクトとして割り当てられ、ここでは各サブオブジェクト辞書である.戻り値はx[0]で、この戻り値でソートされます.
結果は以下の通りである:[{'age':20,'name':'abc'},{'age':25,'name':'ghi'},{'age':30,'name':'def'}]
Lambdaという匿名関数は、次のように使用されます.
m=lambda x,y,z:(x-y)*z#xはパラメータであり、関数名はマーカーmである.print m(3,1,2)#を使用すると、ラベルmがパラメータ名として、x,y,zがパラメータとして渡されます.結果は4
まとめ,mは関数名,xyzは形パラメータ,式は戻り値である.
  
 
以下はネットワークから引用する:詳細
参照先:http://www.cnblogs.com/coderzh/archive/2010/04/30/python-cookbook-lambda.html
Lambda関数は匿名関数とも呼ばれ、すなわち、関数には具体的な名前がない.まず最も簡単な例を見てみましょう.
def f(x): return x**2 print f(4)
Pythonでlambdaを使うと、こう書きます
g = lambda x : x**2 print g(4)
Lambda式は多くのプログラミング言語で対応する実装がある.例えばC#:
var g = x => x**2 Console.WriteLine(g(4))
では、lambda式は何の役に立つのでしょうか.多くの人が疑問を提起しているが,lambdaは通常の関数に比べて関数名を省くだけで,このような匿名関数は,他の場所で呼び出すことを共有できない.実は間違いなく、lambdaはPythonという動的な言語の中で確かに驚天動地の役割を果たしていない.lambdaの代わりに他の方法がたくさんあるからだ.また、lambdaを使う書き方は、pythonicほどではない場合があります.その後のPythonバージョンではlambdaをキャンセルするという提案も出ている.
振り返ってみると、Pythonのlambdaは本当に武力を使う場所がないのだろうか.実はそうではありません.少なくとも私が考えることができる点は、主に次のとおりです.
1.Pythonを使用して実行スクリプトを書く場合、lambdaを使用すると、関数を定義するプロセスを省くことができ、コードをより簡素化することができます.
2.抽象的で、他の場所で再多重化されない関数については、関数に名前を付けるのも難題であり、lambdaを使用するには名前の問題を考慮する必要はありません.
3.lambdaを使用すると、コードが理解しやすくなります.
Lambdaベース
Lambda文では、コロンの前にパラメータがあり、複数あり、カンマで区切られ、コロンの右側の戻り値があります.Lambda文は、関数オブジェクトとして構築されています.
g = lambda x : x**2 print g at 0x00AFAAF0>
C#3.0からlambda式もありdelegateを使う手間を省きました.C#のlambda式のキーワードは=>で、次の例を見てください.
var array = new int[] {2, 3, 5, 7, 9}; var result = array.Where(n => n > 3);//[5, 6, 9]
C#は拡張手法を用いて,配列オブジェクトにWhere,Sumのような便利な手法を持たせる.Pythonにも、filter,map,reduceという定義されたグローバル関数がいくつかあります.
>>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27] >>>>>> print filter(lambda x: x % 3 == 0, foo)[18, 9, 24, 12, 27] >>>>>> print 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
lambdaじゃなきゃいけないの?
上記の例のmapの役割は、C#のWhere拡張方法と同様に、非常に簡単で便利です.しかし、Pythonはlambdaを使わなければこのような簡潔さはできないのだろうか.オブジェクト遍歴処理において、実はPythonのfor..in..if文法はすでに強く、読みやすくてlambdaに勝っています.例えば、上記のmapの例は、次のように書くことができます.
print [x * 2 + 10 for x in foo]
とても簡潔で分かりやすいです.フィルタの例は、次のように書くことができます.
print [x for x in foo if x % 3 == 0]
同じようにlambdaの方法よりも理解しやすい.
だから、いつlambdaを使うか、いつ使わないか、具体的な状況を具体的に分析する必要があります.表現の意図がはっきりしていればいいのです.一般的に、for..in..ifができることは、私はlambdaを選択しません.
lambda broken?
数学の教育では、lambdaがよく使われています.例えば、ある兄がこのような問題に遭遇しました.彼は関数配列fs=[f 0,...,f 9]where fi(n)=i+nを作成しようとした.そこで、このようなlambda関数を定義した.
fs = [(lambda n: i + n) for i in range(10)]
でも、不思議なことに、
>>> fs[3](4)13 >>> fs[4](4) 13 >>> fs[5](4) 13
結果はこのお兄さんの予想に達しなかった.予想された結果は:
>>> fs[3](4) 7 >>> fs[4](4) 8 >>> fs[5](4) 9
問題は変数iにある.上のコードは、lambdaを使用しない単純な縮小バージョンに変更します.
i = 1 def fs(n): return n + i print fs(1) # 2 i = 2 print fs(1) # 3
これは、lambdaのiが匿名関数以外のグローバル変数を使用しているため、予想された理由に達していないことを示している.修正:
fs = [(lambda n, i=i : i + n) for i in range(10)]>>> fs[3](4) 7 >>> fs[4](4) 8 >>> fs[5](4) 9
 
もう一つの転自http://blog.chinaunix.net/uid-796091-id-2035380.html
先日、1000の階乗を求めるPythonコードを見ました.
print  reduce(lambda  x,y:x*y,  range(1,  1001))
pythonコードの簡素さとコンパクトさに一気に感心したので,コードの簡単な解析を行った.
reduceもrangeもPythonの内蔵関数です.
range(11001)は、1~1000の連続整数リスト(List)を生成することを示す.
reduce(functionA,iterableB)、functionAは2つの変数を必要とする関数であり、1つの値を返します.iterableBは、リストなどの反復可能な変数である.reduce関数は、Bの要素を左から右に順に関数Aに入力し、関数Aで返された結果を入力パラメータの代わりに繰り返し実行すると、B reduceを単一の値にすることができます.ここでは、1から1000の連続整数リストをlambda関数に入力し、リストの数を2つの数の積で置き換えます.実際の計算手順は、(...((1)×2)×3)×4)×...×1000)、最後の結果は1000の階乗である.
次にlambda関数について説明します.
Lambda関数は,単一行を迅速に定義する最小関数であり,Lispから借りたものであり,任意の関数が必要な場所で使用できる.次の例では、従来の関数とlambda関数の定義方法を比較します.
1 >>>deff(x,y):2 ...    returnx*y3 ...    4 >>>f(2,3)5 66 >>>g=lambdax,y:x*y7 >>>g(2,3)8 6
2つの関数で得られた結果は同じであり,単純な機能を実現する関数ではlambda関数を用いてより簡素で柔軟に定義し,直接関数を1つの変数に割り当て,変数名で関数名を表すこともできる.
  lambda                    (          )。
  lambda          :
lambda              (      )            。
lambda         ,            。
            lambda         。 

01
class
People
:
02
   
age
=
0
03
   
gender
=
'male'
04
05
   
def
__init__
(
self
,
age
,
gender
):
 
06
       
self
.
age
=
age
 
07
       
self
.
gender
=
gender
08
   
def
toString
(
self
):
09
       
return
'Age:'
+
str
(
self
.
age
)
+
'
\t
Gender:'
+
self
.
gender
10
11
List
=
[
People
(
21
,
'male'
),
People
(
20
,
'famale'
),
People
(
34
,
'male'
),
People
(
19
,
'famale'
)]
12
print
'Befor sort:'
13
for
p
in
List
:
14
   
print
p
.
toString
()
15
16
List
.
sort
(
lambda
p1
,
p2
:
cmp
(
p1
.
age
,
p2
.
age
))
17
print
'
After ascending sort:'
18
for
p
in
List
:
19
   
print
p
.
toString
()
20
21
List
.
sort
(
lambda
p1
,
p2
:
-
cmp
(
p1
.
age
,
p2
.
age
))
22
print
'
After descending sort:'
23
for
p
in
List
:
24
   
print
p
.
toString
()
上記のコードはPeopleクラスを定義し、lambda関数によりPeopleクラスを含むオブジェクトのリストをPeopleの年齢に応じて昇順と降順に並べ替えることを実現しました.実行結果は次のとおりです.
Befor sort: Age:21    Gender:male Age:20    Gender:famale Age:34    Gender:male Age:19    Gender:famale After ascending sort: Age:19    Gender:famale Age:20    Gender:famale Age:21    Gender:male Age:34    Gender:male After descending sort: Age:34    Gender:male Age:21    Gender:male Age:20    Gender:famale Age:19    Gender:famale