2009-10-15 4 views
26

私はPythonを学んでいるだけで、関数の "def"が終了すると混乱しますか? (私はif文を見てきましたので、戻りBARよりFOOは、他のFOOBARを返す場合は...)私はそれが原因で復帰の終わりではありません知っているPython def関数:関数の終了をどのように指定しますか?

def myfunc(a=4,b=6): 
    sum = a + b 
    return sum 

myfunc() 

は、私のようなコードサンプルを参照してください。 Pythonは、これを呼び出す再帰関数ではないことをPythonがどのように知っていますか?関数が実行されるとき、戻り値が見つかるまでプログラムを継続しますか?それはいくつかの面白いエラーにつながります。

ありがとう

+25

Pythonを学ぶためにどのチュートリアルを使用していますか? –

+2

非常に良いコメントです。重要な空白は、最初のものではないにしても最初のものの1つとして言及されています。これは結局のところ最も特徴的なPythonの機能の1つです。 –

+0

これまで私はちょうどこのチートシートを使用していました:http://www.ibm.com/developerworks/library/l-cheatsheet3.html 構文を試してみてください。あなたが良いチュートリアルの提案があれば、私は開いています。チュートリアルは – Dan

答えて

46

Pythonの空白は重要です。インデントが小さくなると関数は終了します。

def f(): 
    pass # first line 
    pass # second line 
pass # <-- less indentation, not part of function f. 

1行の機能が1行に、インデントせずに書き込むことができることに注意してください。

def f(): pass 

そして、そこセミコロンを使用することであるが、これはをお勧めしません。

def f(): pass; pass 

関数の端部は、構文的に定義される方法を示し、上記の3つのフォーム。

  • returnステートメントを使用:セマンティクスについては、Pythonで関数を終了するには3つの方法があります。これはあなたが知っているかもしれない他の命令的プログラミング言語と同じように機能します。

  • yieldステートメントの使用。これは、関数がジェネレータであることを意味します。その意味を説明することはこの答えの範囲外です。見てくださいCan somebody explain me the python yield statement?

  • 単に最後の文を実行するだけです。それ以上ステートメントがなく、最後のステートメントがreturnステートメントでない場合、その関数は最後のステートメントがreturn Noneであるかのように存在します。すなわち、明示的なreturnステートメントがなければ、関数はNoneを返します。

    def f(): 
        pass 
    

    をので、このいずれかを実行します:この関数は、None返し

    def f(): 
        42 
    
1

空白が問題です。ブロックが終了すると、関数定義が終了します。

機能が実行されると、終了するまで、またはreturnまたはyieldの文が出るまで続きます。 returnまたはyieldステートメントNoneに遭遇することなく関数が終了した場合、暗黙的に返されます。

さらに多くの情報がthe tutorialにあります。

23

Pythonはインデントに関しては空白に敏感です。インデントレベルが関数が定義されているレベルに戻ると、関数は終了しています。

+3

うわー...それを期待していませんでした。読みやすさだけではインデントが使用されているとは聞いたことがありません。ありがとう! – Dan

1

それが正確にくぼみ

def func(): 
    funcbody 
    if cond: 
     ifbody 
    outofif 

outof_func 
8

を使用することがスタートとほとんど同じレベルでインデント非空行が発生した場合、ブロックは終了します。

def foo(): 
    if bar: 
     print "bar" 

print "baz" # ends the if and foo at the same time 

インデントレベルはより少なくより等しくまたはDEFとIFの両方にある:この非空行は、例えばそのブロック の一部ではない、以下の印刷は、同時に2つのブロックを終了しますしたがって、両方とも終了します。声明で

ライン、どんなにインデントは、

def foo(): 
    print "The line below has no indentation" 

    print "Still part of foo" 

問題ではない。しかし、ブロックの終わりをマークする文は、既存のインデントと同じレベルでインデントしなければなりません。あなただけの彼らのようなコードをインデントし、あなたは大丈夫です、中括弧の言語に慣れている場合、一般的に

def foo(): 
    print "Still correct" 
    print "Error because there is no block at this indentation" 

:以下は、その後、誤りです。

ところで、 "標準的な"インデント方法はスペースだけですが、もちろんタブは可能ですが、両方を混用しないでください。

1

そのインデントが重要です。ここで他のユーザーが指摘しているように、インデントレベルがdef関数宣言と同じポイントにあるとき、関数は終了しています。 Pythonではタブとスペースを混在させることはできません。ほとんどのエディタがこれをサポートしています。

2

興味深いことに、Pythonインタラクティブなインタプリタで入力するだけの場合は、関数の後に空白行を付ける必要があります。これは動作しません:

def foo(x): 
    return x+1 
print "last" 

ファイル内に完全に合法的なpython構文ですが、これは機能しません。インタプリタに入力するときには構文上の相違点もありますので注意してください。

+0

私はこれがPythonの関数を書くための純粋な方法だと思います。空白行を使わずに「インデント解除」するとトラブルのレシピに見えます。 –

関連する問題