2017-07-11 62 views
3

実行時にPythonはどのようにプログラムを読み込みますか?以下のコードでNameError: name 'cough' is not definedがないだろう、なぜたとえば、私は理解していない:基本的にPython関数の呼び出し順序

def main(): 
    for i in range(3): 
     cough() 


def cough(): 
    print('cough') 


if __name__ == '__main__': 
    main() 

、私の質問も、上記とプログラム出力以下同じことを行う理由として述べることができる。

def cough(): 
    print('cough') 


def main(): 
    for i in range(3): 
     cough() 


if __name__ == '__main__': 
    main() 

答えて

9

Pythonは 声明による実行されたステートメントがあるインタプリタ言語です関数はcough()main()が定義されていることを知っています。後でmain()が呼び出されたときに、Pythonはそれが何であるかを知り、main()cough()を呼び出すと、それが何であるかをPythonが認識します。

def cough(): 
    print('cough') 


def main(): 
    for i in range(3): 
     cough() 


if __name__ == '__main__': 
    main() 

この他の場合(以下)でも同じことです。ちょうどそのPythonはの機能がcough()の前にあることを知ります。ここであなたは疑問に思うかもしれません: "なぜcaugh()が内部にあるかわからないので、Pythonはエラーを投げませんmain()"良い質問私の友人。

ただし、関数を定義する前に関数を定義していれば、それはすべて問題ありません。覚えておいてくださいPythonは、あなたが関数を呼び出すまで関数が定義されているかどうかを "チェック"しません。だからこの場合でもcough()が定義されていないのは、Pythonが関数main()を読み込んでいるときです。cough()が以下に定義されるまで、main()を呼び出さなかったのでokです。

def main(): 
    for i in range(3): 
     cough() 


def cough(): 
    print('cough') 


if __name__ == '__main__': 
    main() 

これは、Pythonをよりよく理解するのに役立ちます。

+3

"行ごとにコンパイルされます" - どのように "文ごとに実行されるのですか"?それはより正確な説明です。 (それは行ベースではなく、バイトコードにコンパイルするときにはファイルごとに+関数ごとに起こるから) – viraptor

+0

が合意した。私はそれを編集します。そのチップをありがとう。 –

0

Pythonは、スクリプトの先頭から最後までを読み込みます。両方の例では、関数が定義された後にcough()関数が呼び出されます。

cough()main()を定義した場合、cough()関数は実際には実行されません。最後の行までは実行されません。つまり、すでに定義されているからです。 (:それをバイトコードにコンパイルするときに機能ごとにファイル全体を+に起こるおかげviraptorの先端までの)プログラムの読み込みを下回るこの場合

1

発生するエラーを防止するコードの一部は、このいずれかになります。

if __name__ == '__main__': 
    main() 

Pythonは上記のすべてのコードを読んだ後、あなたは、コードの最後にそれを入れているので。 あなたが

def main(): 
    for i in range(3): 
     cough() 

if __name__ == '__main__': 
    main() 

def cough(): 
    print('cough') 

ような何かを書くしようとした場合、あなたが得ようとしているすべてはこれです:あなたのソースコードを実行しながら、Pythonの関数を検出すると

NameError: name 'cough' is not defined 
1

、それはすぐに関数を実行しません。むしろ、関数を実行可能コードオブジェクトにコンパイルし、関数を実際に呼び出すまで待ち​​ます。あなたがmain()を呼び出すとき

これはPythonがcough()が定義されて本当にであることをチェックするだけの時間を意味しています。そして、mainが呼び出されたときにPythonはcough関数を見つけるので、エラーは発生しません。

他の言葉では:Pythonは、実行時まで関数内で使用されている名前が実際に存在することを確認しないため、現在のところ定義されていない変数名を使用することができます。

これは、定義されたときにこのような機能は、エラーは発生しませんが、それは実行時に行うのと同じ理由です:

>>> def func(): 
    a + b 

>>> funC# func was compiled... 
<function func at 0x7f8ddd5d6488> 
>>> func() # but we cannot call it. 
Traceback (most recent call last): 
    File "<pyshell#9>", line 1, in <module> 
    func() # but we cannot call it. 
    File "<pyshell#7>", line 2, in func 
    a + b 
NameError: name 'a' is not defined 
>>> 

はまた、あなたが前mainを呼び出そうことに注意してください咳が定義されている、あなたエラーが発生します。

>>> def main(): 
    for i in range(3): 
     cough() 


>>> main() 
Traceback (most recent call last): 
    File "<pyshell#13>", line 1, in <module> 
    main() 
    File "<pyshell#12>", line 3, in main 
    cough() 
NameError: name 'cough' is not defined 
>>> 

これは、Pythonはすでにかどうか定義されているために、あなたの関数内のすべての名前に依存していることを示していグローバルに、またはローカルで使用することをお勧めします。 ()は、メインが呼び出され、メイン()

、両方のメインと咳が定義されています。実際の実行コードは、ここで

場合==「メイン」ですのでです

0

関連する問題