Python 関数内関数

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

少しずつ学習内容が難しくなってきて内容を理解するのに時間がかかるようになってきました。

これがああなって、そこがここに代入されて。。。

という感じで、プログラムが実行される流れを追いながら確認していくのですが、これってどうなってんの?ということが多いんです。

わからないところはWebでも調べてしっかりと理解できるようにしていますが、ちょっと気を抜くと頭に入ってこなくなります。

時間だけはたっぷりあるので、しっかりと時間をかけて理解していきたいと思います。

それでは、今日もPython学習をすすめていきましょう!

昨日の復習

昨日は、PythonのDocstringsについて学習しました。

関数をどのように定義しているのかを記載する文書で、関数定義のすぐ下に記載することで、ドキュメントメソッド(.__doc__)で出力することができました。

また、記載方法もいくつかのスタイルがあり、酒井さんの講座では、Googleスタイルで記載されていました。

def example_func(param1, param2):
    """"Example function with types documented in the docstring.
 
    Args:
        param1 (int): The first parameter.
        param2 (str): The second parameter.
 
    Returns:
        bool: The return value. True for success, False otherwise.
    """
    return True

“(ダブルクォーテーション)3つで囲んで記述しますが、基本は英語での記述が推奨されています。

ただ、日本人を対象として日本人しか関わらない環境であれば、日本語の記述でも問題はありません。

個人で学習するだけなら、日本語で自分がわかるように書いておいたほうがいいと思いますし、無理に英語で書いて、意味が違うことを書いてしまっていては本末転倒です。

当然ながら、グローバルに活躍するプログラマーを目指すのであれば、英語の学習も兼ねて英語で記載したほうがいいのは間違いありません。

とりあえず、書いた本人だけじゃなく、他の人が後で見たときに、どんな関数なのかわかるような内容にしておきましょう。

関数内関数

これこそまさに、読んで時のごとく、関数の中にある関数です。

外側の関数の中だけで関数を使いたいときにつかうもので、外の関数の引数を中の関数で利用することが可能です。

def outer(a, b):
    def inner(c, d):
        print(c + d)
    return inner(a, b)
 
outer(1, 2)

出力結果

3

この関数の流れをみてみましょう!

  1. outer関数の引数aに1、引数bに2を代入して実行する。
  2. outer関数の返り値がinner(1, 2)となる。
  3. inner関数の引数cに1、引数dに2が代入される。
  4. inner関数の返り値(1 + 2)がprint出力される。

アウター関数の外側からインナー関数を実行することはできませんので、もし実行しようとしたときは、定義されていないエラーになってしまいます。

この一連の流れはわかるのですが、いまはどうしてこんな面倒なことが必要なのかがわかりません。

関数内関数の使いどころ

関数内関数は、関数の中でのみ有効な関数なので、中の関数を繰り返し使う際に使えるということで、このあたりのこともきちんと理解するには時間がかかります。

def outer(a, b):
    def inner(c, d):
        print(c - d)
    inner(a, b)
    inner(b, a)
 
outer(1, 2)

出力結果

-1
1

中のinner関数で、引数aとbを入れ替えて代入して出力しています。

このコードでは、inner関数の実行で引き算をしているので、inner(a, b)は、(1 – 2)の出力になり、inner(b, a)は、(2 – 1)の出力になります。

アウター関数を1回実行する間に、インナー関数を複数回実行したいという場面で使うとのことでしたが、具体的な使いどころに出会わないとイマイチピンと来ない感じがしました。

実践が大切

Web上の記事でも同じことなのですが、Pythonの使い方の解説を網羅すればするほど、ひとつひとつの説明が細分化されて、余計にわかりにくくなってしまいます。

実践的な使い方は、実践で学習するので、基本的な使い方をわかりやすく解説してくれているのはわかるのですが、なぜこのような使い方をするのかがちょっと分かりづらい気がします。

実践はもっと複雑になってくると思うので、今はなんとなくこんな感じというだけでいいのかもしれませんが、Webの記事でもストンと腑に落ちるような解説には巡り会えていません。

とりあえず、関数の中に入れた関数は、外からは呼び出せないし、中で使いまわしができるということを理解していくくらいでいいのかもしれません。

頭の片隅に、関数内関数は、こんな使い方ができるということをインプットしておいて、複雑な実践の場になって、こんな使い方するんだと思い出せるようにしておきましょう。

ちょっと自分でもしっかりと理解できていないところがあるので、わかりづらくなってしまいましたが、今のところはなんとなくこんな感じということでご了承ください。

それでは、明日もGood Python!