Pythonのファイルの終わりで関数を宣言する


92

最初に完全に定義せずに関数を呼び出すことはできますか?これを試行すると、「function_nameが定義されていません」というエラーが表示されます。私はC ++の出身ですので、この問題は私を困らせます。

機能する前に関数を宣言する:

def Kerma():
        return "energy / mass"    

print Kerma()

ただし、最初に定義せずに関数を呼び出そうとすると、問題が発生します。

print Kerma()

def Kerma():
    return "energy / mass"

C ++では、関数の前にヘッダーを配置すると、呼び出し後に関数を宣言できます。

ここで何か不足していますか?


5
Pythonでは、「宣言」はありません。定義がある(完全でなければならない)か、何もありません。
S.Lott 09/10/20

2
「困る」と言う。詳しく説明していただけますか?
マーティンデルヴェッキオ


誰かが疑問に思っている場合:Kerma is an acronym for "kinetic energy released per unit mass"
anon

1
私はこれが非常に古いことを知っていますが、なぜ関数を別の.pyファイルに入れてインポートすることを推奨しないのですか?意図しない結果はありますか?
カイル

回答:


144

Pythonでの一種の慣用的な方法の1つは、次のように書くことです。

def main():
    print Kerma()

def Kerma():
    return "energy / mass"    

if __name__ == '__main__':
    main()

これによりmain、最後に関数を呼び出し続ける限り、好きな順序でコードを書くことができます。


4
@Muhammad:これは実行可能なアプローチですが、Pythonでは慣用的ではありません。まったく逆ですが、ほとんどのmain関数は通常最後に配置されています。
Eli Bendersky

14
@Eli Bendersky:私はif __name__ == '__main__':スイッチが一般的な慣用的な部分だと思います。
S.Lott 09/10/20

2
@Eli:慣用的な部分は最後のif句です。モジュールのトップレベルにコードはありません。モジュールがmainの場合、最後にmain関数を呼び出します。
Ned Batchelder、2010

1
@Eli:慣用的な部分はif ... __main__':です。をmainコードの残りの部分の上に配置する必要があるとは言いませんでした。重要な部分は_\_main__最後に呼び出すことだと私は言いました、そしてあなたがその定義をどこに置くかは問題ではありません。
Muhammad Alkarouri、2009

2
if name == ' main ':スイッチを使用すると、関数の順序付けとは無関係になります。それは正しいことです(TM)。
MKesper

18

Pythonモジュール(.pyファイル)が実行されると、その中の最上位のステートメントが、出現順に上から下(最初から最後まで)に実行されます。つまり、定義するまでは参照できません。たとえば、次の場合はエラーが表示されます。

c = a + b  # -> NameError: name 'a' is not defined
a = 13
b = 17

他の多くの言語とは異なりdefclassステートメントは単なる宣言ではなくPythonで実行可能であるため、参照することもabそれが発生して定義されるまで参照することもできません。これが、最初の例で問題が発生する理由です。ステートメントが実行されて本体が処理され、結果の関数オブジェクトが関数の名前にバインドされるKerma()前に関数を参照しdefているため、スクリプトのその時点では定義されていません。

C ++のような言語のプログラムは通常、実行前に前処理され、このコンパイル段階では、プログラム全体と#includeそれが参照するすべてのファイルが一度に読み取られて処理されます。Pythonとは異なり、この言語は宣言ステートメントを備えており、関数の名前と呼び出しシーケンス(または変数の静的タイプ)を使用前に宣言(ただし、定義なし)できるため、コンパイラは、名前に遭遇したときに、それらをチェックするのに十分な情報を得ることができます。使用法。主に型チェックと型変換が必要ですが、実際のコンテンツやコード本体を定義する必要はありません。


動的言語がそれを行うことができないということではありません。Perlは動的言語であり、定義する前に関数を呼び出すことができます。これは、コンパイルフェーズと実行フェーズがあるためです(奇妙ですが、便利なことに、コンパイルフェーズ中にコードを実行するように調整できます)。これは機能します: doit(); sub doit { print("I'm doing it!\n"); }
John Deighan

10

これはPythonでは不可能ですが、正直なところ、まったく必要ないことにすぐに気付くでしょう。Pythonのコードを書く方法は、プログラムをクラスと関数を定義するモジュールと、他のすべてをインポートして実行する単一の「メインモジュール」に分割することです。

単純な使い捨てスクリプトの場合、「実行可能部分」を最後に配置するのに慣れますが、さらに良いのは、インタラクティブなPythonシェルの使い方を学ぶことです。


1

Pythonは動的言語であり、インタプリタは変数(関数など)を呼び出すときに常にその状態をとります。一部のifブロックで関数を再定義して、毎回異なる方法で呼び出すこともできます。そのため、呼び出す前に定義する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.