2013/01/30

Python の無名関数( lambda )の使い方

Python での無名関数の使い方についてご説明します。

Python では、「 lambda 式」を使って無名関数を作ることができます。
myfunc = lambda x: x ** 2 

myfunc(5)  # 25
myfunc(6)  # 36

これは、「def」を使って
def myfunc(x):
    return x ** 2
と定義したときと同じ処理となります。つまり、「 lambda x: y 」という形のうち、「 x 」が引数、「 y 」が戻り値となります。

上にあげた例だとあえて無名関数を使うメリットがあまりないのですが、他の関数と組み合わせて使ったりする場合に無名関数は便利です。

例として、 sorted()map()filter() とあわせて使う場合の例をあげてみます。

例: sorted()

sorted() は、与えられたリストをソートしてくれる関数です。与えられたリストそのものは変更せずに、ソート済みのコピーを返してくれます。たとえば、
l1 = [(7, 2), (3, 4), (5, 5), (10, 3)]
というリストがあって、この各タプルのふたつめの要素でソートしたい場合は、次のように書きます。
l2 = sorted(l1, key=lambda x: x[1])

結果は次のようになります。
print l2  # [(7, 2), (10, 3), (3, 4), (5, 5)]

例: map()

次に、 map() と組み合わせる例を見てみます。 map() は、リストやタプルの各要素に対して同じ処理を施して、同じ長さのリストにそのすべての結果を格納して返してくれる関数です。 map(関数, リスト) という形で使います。
l1 = [1, 3, 5]

l2 = map(lambda x: x ** 2, l1)

print l2  # [1, 9, 25]

このようにすると、各要素を二乗したものをリストとして得ることができます。ちなみにこれはリスト内包で次のように書いても同じ結果が得られます。
l2 = [x ** 2 for x in l1]

例: filter()

最後に、 filter() と組み合わせる例を見てみます。 filter() は、与えられたリストから条件に合うもののみを抽出してリストにしてくれる関数です。

たとえば、次のようなクラスと、そのインスタンスを並べたリストがあるとします。
class Album(object):
    def __init__(self, title, artist):
        self.title = title
        self.artist = artist
a1 = Album("A Hard Day's Night",
           'The Beatles')
a2 = Album('The Rolling Stones', 
           'The Rolling Stones')
a3 = Album("Abbey Road", 
           'The Beatles')

albums = [a1, a2, a3]

このリスト albums の中からアトリビュート artist が「 The Beatles 」のもののみを抽出したい場合は、次のように書けば OK です。
albums_beatles = filter(lambda album: album.artist == 'The Beatles', albums)

結果は次のように、条件にあったものだけのリストとなるはずです。
for a in albums_beatles:
    print a.artist, '-', a.title
# The Beatles - A Hard Day's Night
# The Beatles - Abbey Road

1 件のコメント:

Frederick Guyton さんのコメント...
このコメントはブログの管理者によって削除されました。