0

Pythonで実際に何をしているのか疑問に思っていif __name__ == "__main__":ました.python3に次のコードがあります:

def main():
    test();

def test():
    print("hello world " + __name__);

if __name__ == "__main__":
    main();

関数を使用する前に宣言する必要があることはわかっているため、if一部の関数呼び出しは正常に機能し、ステートメントmain()内で呼び出される前に定義されますがif、test() 関数は呼び出された後に定義されます。そしてエラーはありません:

def main():
    test();

def test():
    print("hello world " + __name__);

test()関数が呼び出された後に定義されている場合、どのように機能しますか?

4

4 に答える 4

5

呼び出された後、テストは定義されていません。順序は次のとおりです。

  1. を定義しmainます。これは (まだ未定義の)testを参照しますが、実際には使用 (呼び出し) しません。Pythonはそれで大丈夫です。
  2. を定義しtestます。
  3. コールしmainます。
  4. mainを呼び出しますtest。すでに定義されているので問題ありません。
于 2013-11-12T21:51:36.430 に答える
1

ここでの問題は、 とはまったく関係ありませんif __name__ == 'main'。次のコードを検討してください。

def do_something():
    do_something_else()

上記は有効な関数宣言です。 まだ書いてなくてdo_something_else()。対話型インタープリターでこれを試してみてください。さて、実際に呼び出すと do_something()

do_something()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-21-3d57cd7a951b> in <module>()
----> 1 do_something()

<ipython-input-20-5d71722aad44> in do_something()
      1 def do_something():
----> 2     do_something_else()
      3 

NameError: global name 'do_something_else' is not defined

エラーが出ます。を呼び出す前のある時点でdo_something()、関数を定義していた場合はそうではありませんdo_something_else

それで、これはどういう意味ですか?Python は実際に上から下へ解釈します。しかし、関数定義に到達すると、関数をコンパイルするだけで、実行しません。

于 2013-11-12T21:52:08.423 に答える
0

Python はコードを認識した順序で実行します。

入力するdef main():と、後で実行される関数定義として使用されます。

if __name__ == "__main__":、現在のファイルが (含まれているのではなく) 実行されるはずのファイルであるかどうかを確認します。その場合、以下のものを実行します (通常はmain)

次のようなものを置くことができます:

print "here"
def main():
  print "in main"

if __name__ == "__main__"
  main()

次のような出力が表示されるはずです

here
in main

これは、python が本質的にスクリプト言語であり、関数がオプションであるためです。つまり、次の 10 分で破棄することを意図していないコードについては、関数とクラスを使用する必要があります。コードを理解しやすくし、フォローとデバッグを容易にします。

特定のコードが機能する理由 (main の後に test が定義されている) は、すべてが定義された後に実行するためです。testmain を実行しない限り、Python は呼び出される があるかどうかを確認しようとしません。を実行するmainと、testはすでに定義されています。

于 2013-11-12T21:50:54.563 に答える
0

関数を使用する前に関数を宣言する必要があることを知っています

C ファミリーの言語から来ているようですね。これらの言語は 2 つの点で異なります。

まず、Python は何も「宣言」しません。これは、変数が値が格納される型付きメモリの場所である C などの言語では理にかなっています。しかし、Python では、値には独自の独立した型と場所があり、変数はそれらの値の名前にすぎないため、宣言するものは何もありません。

Python では、C と同様に、使用する前に関数を定義する必要があります。

ただし、C だけ、本体で関数を使用する関数をコンパイルする前に、関数を定義するか、少なくとも宣言する必要があります。違いは上記と同じです。C では、型、関数の実際のコードへのポインターなどを取得するために、関数を宣言する必要があります。Python では、関数は関数オブジェクト値の単なる名前です。関数をコンパイルするために知っておく必要があるのは、名前を検索する場所だけです。これは簡単です。関数をコンパイルして、実行時にモジュール グローバルで名前を検索するようにします。他の情報は必要ないので、宣言するものは何もありません。

たとえば、C では、これは合法です。

void foo() {}
void bar() { foo(); }

そして、これは次のとおりです。

void foo();
void bar() { foo(); }
void foo() {}

しかし、これはそうではありません:

void bar() { foo(); }
void foo();

Python では、宣言がないため、2 番目と 3 番目は同一であり、両方とも完全に有効です。

def bar():
    foo()
def foo():
    pass
于 2013-11-12T22:04:14.117 に答える