Pythonで関数を呼び出し元の下で定義する方法

PHPばかり書いていたのですが、最近Pythonを勉強していて気づいたことがありまして、(pythonを日頃扱っている方からしたら当然のことかもしれませんが)それがPythonでは手続き的に書くと、

関数を呼び出し元の下で定義できない

ということです。


ただ方法はあるみたいだったので、当記事ではPythonで関数を呼び出し元の下で定義する方法について記していきます。




Pythonでは呼び出し元の下で関数を定義できない

関数を呼び出し元の上で定義すると正しく動きますが、

#OK
def foo():
    print("フー")

foo()

#出力:フー


こちらのように呼び出し元より下で定義すると、エラーになるようです。
Pythonでは1行ずつ処理をしていくためこのような結果になるようです。

#NG
hoge()

def hoge():
    print("ホゲ")

#出力:NameError: name 'hoge' is not defined





PHPでは呼び出し元の下で関数を定義できる

関数を呼び出し元の上で定義すると当然動きますが、

#OK
function foo(){
    echo "フー";
}

foo();

#出力:フー


関数を呼び出し元の下で定義しても動きます。

#OK
hoge();

function hoge(){
    echo "ホゲ";
}

#出力:ホゲ



※PythonもPHPもどちらもインタプリタ言語で1行ずつ実行していくので、呼び出し元の下で関数を定義できるPHPが特殊なのかもしれません。
なぜ、PHPではなぜ呼び出し元の下で関数を定義できるのかということについては、こちらの記事が少しだけ説明してくれていました。

PHPの関数が使用前に定義しなくても呼び出せるのはなぜか





Pythonで関数を呼び出し元の下で定義する方法

好みの問題かもしれませんが、自分は、呼び出し元より上で関数を定義するのがなんかすごく嫌だったので、調べてみるとPythonでも呼び出し元の下で関数を定義する方法がありました!

def main():
    hoge()
    foo()


def foo():
    print("フー")

def hoge():
    print("ホゲ")


if __name__ == "__main__":
    main()



一度一番下まで読み込んだ後にmain関数が実行されることによって、呼び出し元より下に関数を定義することが可能になっています!

if name == “main“: は最初なんじゃこりゃと思ってたのですが、importされた時は処理が勝手に走らないようにするために、あるみたいですね。




以上、Pythonで関数を呼び出し元の下で定義する方法でした!

参考記事:
Python Tips: Python で main 関数を定義することのメリット

コメント

タイトルとURLをコピーしました