python lambda関数
2440 ワード
「lambda」というコンストラクタを使用すると、Pythonは実行時に匿名関数を作成することをサポートします(つまり、関数に名前がバインドされていません).これは関数プログラミング言語のlambdaとは全く同じではありませんが、これは非常に強力な概念でPythonによく統合されており、filter()、map()、reduce()などの典型的な関数式概念とよく結合して使用されています.
次のコードクリップは、通常の関数定義(「f」)とlambda関数(「g」)の違いを示します.
以下のコードフラグメントはlambda関数の使用を示している.Python 2.2または更新バージョンを使用して、ネストされたカテゴリ(nested scope)をサポートする必要があります.
複数の異なるインクリメンタル関数を作成し、変数に割り当てて独立して使用することができます.最後の文が示すように、関数全体をどこにでも割り当てる必要はありません.すぐに使用することができますが、彼を必要としないときは忘れてもいいです.
以下の部分はさらに一歩進んだ.
もちろん、他の場所で個別の関数を定義して、filter()などの関数のパラメータとしてこの関数の名前を使用することができますが、実際には、この関数を何度も使用したい場合や、この関数を1行に書くのは複雑です.しかし、一度だけ使用すれば簡単です(つまり、上記の例のように1つの式しか含まれていません)、lambda構造を使用して匿名関数を生成し、すぐにfilter()に伝えるのが便利です.これにより、非常にコンパクトで読み取り可能なコードが作成されます.
最初の例では、filter()が私たちのlambda関数を呼び出してリスト内の各要素に作用し、この関数を「真」に戻す要素を含む新しいリストを返します.この例では,3の整数倍のすべての要素を得た.式x%3==0は、xが3で除算された余剰数を計算し、0と比較する.
2つ目の例では、map()は私たちのリストを変換するために使用されます.指定した関数は、元のリストの各要素を呼び出し、lambda関数の戻り値を含む新しい要素を作成します.この例では、各要素に対して2*x+10を計算する.
最後にreduce()関数にはいくつかの特殊なものがあります.この関数の「worker function」は、xとyと呼ばれる2つのパラメータを受け入れなければなりません.パラメータではありません.この関数は、リストの最初の2つのパラメータを呼び出し、リストの要素が完全に遍歴するまで、戻り値と3番目の要素などを呼び出します.これは、このリストにn要素が含まれている場合、私たちの関数がn-1回呼び出されたことを意味します.最後に呼び出された戻り値はreduce()構造の結果である.上記の例から,パラメータを簡単に重畳したので,すべてのパラメータの和を得た.
原文リンク:ここ
複数の異なるものを作成することができます
次のコードクリップは、通常の関数定義(「f」)とlambda関数(「g」)の違いを示します.
>>> def f (x): return x**2
...
>>> print f(8)
64
>>>
>>> g = lambda x: x**2
>>>
>>> print g(8)
64
ご覧のように、f()とg()は完全に同じで、同じ方法で使用することができます.lambda関数には「return」文は含まれていません.常に式が含まれ、返されます.lambdaを任意の所望の関数に定義できることにも気づきました.変数に割り当てる必要はありません.以下のコードフラグメントはlambda関数の使用を示している.Python 2.2または更新バージョンを使用して、ネストされたカテゴリ(nested scope)をサポートする必要があります.
>>> def make_incrementor (n): return lambda x: x + n
>>>
>>> f = make_incrementor(2)
>>> g = make_incrementor(6)
>>>
>>> print f(42), g(42)
44 48
>>>
>>> print make_incrementor(22)(33)
55
上記のコードは、実行時に匿名の関数を作成して返す「make_incrementor」関数を定義しています.返される関数は、作成時に指定した値にパラメータを追加します.複数の異なるインクリメンタル関数を作成し、変数に割り当てて独立して使用することができます.最後の文が示すように、関数全体をどこにでも割り当てる必要はありません.すぐに使用することができますが、彼を必要としないときは忘れてもいいです.
以下の部分はさらに一歩進んだ.
>>> 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
まず,単純な整数値のリストを定義し,次に標準関数filter(),map(),reduce()を用いて異なることを行った.すべての3つの関数は、1つの関数と1つのリストの2つのパラメータを期待します.もちろん、他の場所で個別の関数を定義して、filter()などの関数のパラメータとしてこの関数の名前を使用することができますが、実際には、この関数を何度も使用したい場合や、この関数を1行に書くのは複雑です.しかし、一度だけ使用すれば簡単です(つまり、上記の例のように1つの式しか含まれていません)、lambda構造を使用して匿名関数を生成し、すぐにfilter()に伝えるのが便利です.これにより、非常にコンパクトで読み取り可能なコードが作成されます.
最初の例では、filter()が私たちのlambda関数を呼び出してリスト内の各要素に作用し、この関数を「真」に戻す要素を含む新しいリストを返します.この例では,3の整数倍のすべての要素を得た.式x%3==0は、xが3で除算された余剰数を計算し、0と比較する.
2つ目の例では、map()は私たちのリストを変換するために使用されます.指定した関数は、元のリストの各要素を呼び出し、lambda関数の戻り値を含む新しい要素を作成します.この例では、各要素に対して2*x+10を計算する.
最後にreduce()関数にはいくつかの特殊なものがあります.この関数の「worker function」は、xとyと呼ばれる2つのパラメータを受け入れなければなりません.パラメータではありません.この関数は、リストの最初の2つのパラメータを呼び出し、リストの要素が完全に遍歴するまで、戻り値と3番目の要素などを呼び出します.これは、このリストにn要素が含まれている場合、私たちの関数がn-1回呼び出されたことを意味します.最後に呼び出された戻り値はreduce()構造の結果である.上記の例から,パラメータを簡単に重畳したので,すべてのパラメータの和を得た.
原文リンク:ここ
複数の異なるものを作成することができます