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行目で変数f
にouter
関数に引数10
と20
を入れていますが、先に記述しているクロージャーで、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行目で引数のx
とy
を加算するinner
関数を定義します。
6行目は、変数p
にfunctools.partial
の引数にinner
と10
と20
を入れたオブジェクトを代入しています。
7行目、8行目で、それぞれp
とp
を実行した値を出力しています。
出力結果
functools.partial(<function inner at 0x7ff115ebd830>, 10, 20)
30
出力結果は、3つの引数(inner
オブジェクトと10
と20
)が代入されたpartial
とinner
関数を実行した値が出力されています。
まとめ
コードが短い場合はクロージャーだけで事足りるのかもしれませんが、モジュール化されたクロージャーのようなfunctools.partial
を使うことでコードが見やすくシンプルにできるので、結構頻繁に使われているそうです。
コードが短くわかりやすくなるのなら、積極的に活用したほうがいいのですが、どのような仕組みで動いているのか理解しておくことも大切です。
とはいえ、車の運転手がエンジンの仕組みを知らなくても車を運転できるのと同じで、コードの仕組みもモジュール化されていれば、どのような処理がされるのかだけ理解しておくといいでしょう。
Pythonの機能を全て知らなくても実用性のあるアプリ開発は可能なので、実践で必要になってくるたびに新しい使い方を学習するスタイルが一番効率がいいのかもしれませんね。
ということで、明日もGood Python!