前回の記事ではPythonの関数について、基礎的なことを紹介した。

今回は関数の応用編といったところだろうか。
少し変わった関数の扱い方をいくつか紹介していく。

関数自身をオブジェクトとして扱う

Pythonの関数はオブジェクトとして扱うことができるのだ。
つまり、関数自身を変数やリストの要素として定義し、取り扱うことができるというわけだ。

実際の例を見た方が早いかもしれない。

例えば、リストとして定義されたある文字列に対し、特定の処理を全ての要素に適用する場合を考えよう。

4つの都道府県が入ったprefというリストがある。
それぞれ空白や記号などが散乱しており、これを除去する関数を作るとしたら以下のような関数cleanerが考えられる。

pref = ['  東京都 ', '       大阪府!!', '愛知県        ', '福岡県?']

import re # 正規表現を扱うライブラリ

def cleaner(strings):
    result = []
    for value in strings:
        value = value.strip()
        value = re.sub('[!?]', '', value)
        result.append(value)
    return result

cleaner(pref)

cleaner関数ではリストとして受け取ったstringsをforループで回し、strip関数とre.sub関数を実行し、空白や記号を削除している。

このような関数をPythonでは以下のように書くこともできるのだ。

pref = ['  東京都 ', '       大阪府!!', '愛知県        ', '福岡県?']

import re # 正規表現を扱うライブラリ

def remove_mark(value):
    return re.sub('[!?]', '', value)

opt = [str.strip, remove_mark]

def cleaner(strings, opt):
    result = []
    for value in strings:
        for func in opt:
            value = func(value)
        result.append(value)
    return result

cleaner(pref, opt)

この例では二つの関数をoptというリストに入れているが、数が増えてくるとより便利な使い方ができるだろう。

無名関数(ラムダ)

無名関数とは、値を返すような処理を一文で書くことができる関数を言う。

例えば、引数に取った値を二乗して返すような処理を無名関数として書くとき、次のようなコードになる。

func_test = lambda x: x * x

func_test(5) # 25

まずlambdaキーワードを使って無名関数であることを宣言する。

次に引数として取る値を記述してコロンで区切る。

最後に処理を記述し、処理した結果が左辺の変数に代入されるといった仕組みだ。

無名関数では以下のように複数の引数を取ることもできる。

func_test = lambda x, y: x * y

func_test(5, 2) # 10

無名関数の主な使い方

先ほどの例のように、変数に無名関数を代入するよりも、以下のように直接使うことの方が多いようだ。

def do_something(some_list, f):
    return [f(x) for x in some_list]

int_list = [1, 2, 3, 4, 5]

do_something(int_list, lambda x: x * x) # [1, 4, 9, 16, 25]
do_something(int_list, lambda x: x * 2) # [2, 4, 6, 8, 10]

こちらの使い方の方が、コードの意味するところがより明確になり、あらゆる処理を少ないコード量で実現することができる。