質問: Pythonの入門本で学習を進めている中で、関数内関数の存在意義がよくわからなかったので質問させてください(仕組みや挙動自体については理解できますが、積極的に使うシチュエーションがよくわからないという趣旨の質問です) 入門本にあるのは以下のようなソースコードなのですが ``` def outer(a, b): def inner(c, d): return c + d return inner(a, b) ``` シンプルに以下のように書くか、少し長めの関数であればわざわざ内部関数として定義せずに 通常の関数としてinnerも定義してouter関数内で使い回せばいいよう(そのほうが他の関数からも 参照できてコードの省略になりそう)な気がしてしまいます。 ``` def outer(a, b): return a + b ``` 繰り返しにはなりますが、どのような場合に関数内関数を使うメリットがあるか ご教示願えますと幸いです。
回答: 内部関数を返し、クロージャを利用するのが良くある活用法です。 ``` def make_who_say(who): def who_say(sentence): print(f'{who}: {sentence}') return who_say tom_say = make_who_say('Tom') mary_say = make_who_say('Mary') tom_say('Hi, Mary.') mary_say('Hi, Tom.') ``` **実行結果** Wandbox ``` Tom: Hi, Mary. Mary: Hi, Tom. ``` > > 通常の関数としてinnerも定義してouter関数内で使い回せばいいよう(そのほうが他の関数からも > > 参照できてコードの省略になりそう)な気がしてしまいます。 > > > おっしゃる通りで、他の方法で充分簡潔に代替できる際に積極的に用いることは無いでしょう。 追記 関数の可視性を制御するのはモジュールの役割であって、 それを内部関数で実現するのは本質的ではないように個人的には思います。 共通の変数にアクセスする関数が多くあるのなら、クラスを組めば良いでしょう。 関数内の変数に強く依存したコードを書くなら、コメントをしっかり付けてべた書きすれば良いでしょう。 何度も同じ処理をする必要があるのなら、それが関数内変数に依存するのは設計に問題がありそうです。 内部関数は高階関数を組むときを除いて積極的に使うものでは無いと、私はやはり思うのです。