Java/Python 導入ガイド《7》lambda 式を使って

記事一覧入門編基礎編応用編中級編

Java プログラマーのための Python 導入ガイド〈初級/入門編〉《Jython2.5.0》
《7》lambda 式を使って

《著》森こねこ・本間りす・小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2009/04/03

》作業中です《 2006年7月 4日 (火)

■ 概要

Java™ Programming Language〔JPL〕の事例を使って、JavaJython との違いを学びます。

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 から、奇数でない要素を削除します。

集合:set

>>> for e in filter(lambda e: not cond(e), c):
...     c.remove(e)    
>>> c
set([1, 3])

組み込み関数 filter を使って、集合 c から、奇数でない要素を削除します。ここで着目して欲しいのは、先の《例題》で示した list(c) と違って、共通のフレームワークを利用できることです。

写像:dict

>>> for e in filter(lambda e: not cond(e), c):
...     del c[e]    
>>> c
{1: 'B', 3: 'D'}

組み込み関数 filter を使って、辞書 c から、奇数でないキー要素を含む要素対を削除します。ここで着目して欲しいのは、先の《例題》で示した c.keys() と違って、共通のフレームワークを利用できることです。

Last updated♪2009/08/04