Python functoolsのpartialの使い方

Python学習【365日チャレンジ!】304日目のマスターU(@Udemy11)です。

楽天モバイルの割引プランがもうすぐ終了するので、次のキャリアをどこにするか検討しているのですが、格安SIMのY!mobileにしようかと考え中です。

オンラインでSIMの乗り換えをするのは初めてなので、チャットサービスを活用していろいろと聞いているのですが、これが結構便利なんです。

遅い時間になるとAIの自動応答チャットでサポートしている会社が多い中、Y!mobileは、オペレーターが対応してくれるので、きちんと聞きたいことが聞けます。

ということで、Y!mobileを乗り換えの第一候補として検討中なので、新しいiPhoneは残念ながら予算の関係上次回に持ち越し予定です。

それでは今日も、Python学習を始めましょう。

昨日の復習

昨日は、デコレーターを使った時にdocstringの表示を操作できるfunctools.wrapsを学習しました。

実行する関数にドキュメントを記述しても、デコレーターをつけるとデコレーターのドキュメントが読み込まれるので、functools.wrapsを使って、実行する関数のドキュメントを読み込むことができました。

詳細については昨日の記事をごらんください。

今日は、クロージャーと同じ処理ができるfunctools.partialを学習します。

クロージャーの復習

functools.partialはクロージャーと同じ処理ができるのですが、クロージャーはかなり前に学習しているので、最初に復習しておきましょう。

def outer(x, y):
    def inner():
        return x + y
    return inner

f = outer(10, 20)
print(f)
print(f())

1行目から4行目で、outer関数の中に、アウター関数の引数を使って計算した値を返り値とするinner関数を入れて、outer関数の返り値をinnerオブジェクトを返しています。

6行目で変数fouter関数に引数1020を入れていますが、先に記述しているクロージャーで、inner関数を実行する手前のinnerオブジェクトが返されます。

7行目でfを出力すると、出力結果には、関数innerオブジェクトとなり、8行目はinnerが実行された結果(10+20)である30が出力されます。

出力結果

<function outer.<locals>.inner at 0x7f8ae3ee23b0>
30

これらを踏まえて、functools.partialのコードを書いてみます。

functools.partial

inner関数だけを先に記述して、outer関数の代わりにfunctools.partialと引数を入れるコードになります。

import functools

def inner(x, y):
    return x + y

p = functools.partial(inner, 10, 20)
print(p)
print(p())

最初にfunctoolsをインポートして、3行目4行目で引数のxyを加算するinner関数を定義します。

6行目は、変数pfunctools.partialの引数にinner1020を入れたオブジェクトを代入しています。

7行目、8行目で、それぞれppを実行した値を出力しています。

出力結果

functools.partial(<function inner at 0x7ff115ebd830>, 10, 20)
30

出力結果は、3つの引数(innerオブジェクトと1020)が代入されたpartialinner関数を実行した値が出力されています。

まとめ

コードが短い場合はクロージャーだけで事足りるのかもしれませんが、モジュール化されたクロージャーのようなfunctools.partialを使うことでコードが見やすくシンプルにできるので、結構頻繁に使われているそうです。

コードが短くわかりやすくなるのなら、積極的に活用したほうがいいのですが、どのような仕組みで動いているのか理解しておくことも大切です。

とはいえ、車の運転手がエンジンの仕組みを知らなくても車を運転できるのと同じで、コードの仕組みもモジュール化されていれば、どのような処理がされるのかだけ理解しておくといいでしょう。

Pythonの機能を全て知らなくても実用性のあるアプリ開発は可能なので、実践で必要になってくるたびに新しい使い方を学習するスタイルが一番効率がいいのかもしれませんね。

ということで、明日もGood Python!