2013/01/30

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

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

Python では lambda 式を使って無名関数を定義することができます。

myfunc = lambda x: x ** 2 

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

lambda 式のフォーマットは lambda x: y です。 x が引数で、 y が戻り値です。

上の myfunc の場合

def myfunc(x):
    return x ** 2

と定義をしたのと同等の結果となります。

この myfunc 例だと無名関数を使うメリットはあまりありません。少し実践的なサンプルとして 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 さんのコメント...
このコメントはブログの管理者によって削除されました。