Java/Python 導入ガイド《7》lambda 式を使って
Java プログラマーのための Python 導入ガイド〈初級/入門編〉《Jython2.5.0》
《7》lambda 式を使って
》作業中です《 2006年7月 4日 (火)
lambda 式を使って
先の《例題》では、組み込み関数 filter を使うと、条件を満たさない要素を除いた、新たなコレクション(list/set/dict)が得られました。このとき、既存のコレクションには影響しません。そこで、イテレーションの最中に、既存のコレクションから要素を削除する(副作用に主眼を置いた)方法を紹介します。
lambda 式
lambda parameter_list: expression
lambda 式は「名前のない関数」と見なせます。実引数 parameter_list を使って、式 expression を評価した結果をリターン値とする、関数オブジェクトを生成します。すると、他のオブジェクトと同様に変数を介して参照できます。次のような関数定義において、
>>> def foo(s): return s.lower() >>> foo("ABC") 'abc'関数の名前 foo は、関数オブジェクトを参照します。この関数と等価なものは、lambda 式を使うと、次のように記述できます。
>>> foo = lambda s: s.lower() >>> foo("ABC") 'abc'
このとき、変数 foo は、名前のない関数オブジェクトを参照します。関数名/lambda 式はどちらも、関数オブジェクトを参照するという点で同じです。
>>> foo = lambda a,b: a+b >>> foo(3,4) 7
ここでは、2つの引数 a/b の和が得られます。
関数に取って代わる、lambda 式の存在意義は、次の例で確認できます。
>>> def cond(e): return e%2 >>> c [0, 1, 2, 3, 4] >>> filter(cond, c) [1, 3]
組み込み関数 filter の引数に、関数 cond を指定すると、奇数だけを含むリストが得られます。これと等価なものは、lambda 式を使って、次のように記述できます。
>>> filter(lambda e:e%2, c)
[1, 3]
lambda 式を使うと、事前に関数 cond を定義する必要はありません。関数の本体となるコードの断片を「式」として実引数に指定するだけです。たとえば、lambda 式の一部を変更すると、次のように、
>>> filter(lambda e:e>2, c)
[3, 4]
2 より大きな要素だけ含むリストが簡単に得られます。そこで、lambda 式を使うと、
>>> set(filter(lambda e:e%2, c)) set([1, 3]) >>> dict([(e,c[e]) for e in filter(lambda e:e%2, c)]) {1: 'B', 3: 'D'}
どちらも、c に含まれる要素の中から、奇数だけを含む、新たなコレクションが得られます。このとき、既存の c には影響を与えません。そのため、次のようなアプローチが可能です。
リスト:list
>>> c
[0, 1, 2, 3, 4]
>>> for e in filter(lambda e: not cond(e), c):
... c.remove(e)
>>> c
[1, 3]
組み込み関数 filter を使って、リスト c から、奇数でない要素を削除します。