0

wwii の回答を見ながら、私は彼のインデントについて、それは間違っているとコメントしました。しかし、私の IDLE で彼のコードを実行した後、問題なく実行されることがわかりました。

正しい結果が得られていることを確認するために、いくつかの例を試しました。

>>> def foo():
    return 0

>>> foo()
0
>>> def bar():
    return foo() + 5

>>> bar()
5
>>> def foobar():
    return foo() + bar()

>>> foobar()
5
>>> 

ご覧のとおり、すべて正常に動作しました。通常のスクリプトで同じことをしようとすると、Python はプログラムを実行する前にエラーを発生させ、ブロックをインデントするのを忘れていることを通知します。

ここに画像の説明を入力

対話型 IDLE ではこの種のインデントが許可されているのに、通常のスクリプトでは許可されていないのはなぜですか? IDLE のドキュメント、より具体的にはセクション25.5.2.1 Automatic indentationを調べましたが、答えを見つけるのに役に立ちませんでした。

さらに、関数に関する Python ドキュメントには、関数本体をインデントする必要があると記載されています。

キーワード def は関数定義を導入します。その後に、関数名と括弧で囲まれた仮パラメーターのリストが続く必要があります。関数の本体を形成するステートメントは次の行から始まり、インデントする必要があります

(私のものを強調)

IDLE ではこの種のインデントが許可されているのに、通常のスクリプトでは完全にシャットダウンされるのはなぜですか? これはわざとですか?もしそうなら、この動作はどこかに文書化されていますか?

4

3 に答える 3

2

コードは正しいですが、IDLE REPL は Python とは異なります。

>>> def foo():
    return 0

IDLE はそれを出力しますが、Python は次のようになります。

>>> def foo():
...     return 0

return の前に 4 つのスペースがあることを確認してください。ただし、コードがさらにインデントされると予想される場合は、スペースが存在しないように見えます。

于 2016-12-03T04:50:55.443 に答える
1

IDLE のインデントは正しく、スクリプトのインデントは間違っています。

IDLE では、 の前に 4 つのスペースがありますreturn 0。そして、あなたのスクリプトにはありません。

スクリプトは次のようになります。

def foo():
    return 0

def bar():
    return foo() + 5

def foobar():
    return foo() + bar()

print(foo())
print(bar())
print(foobar())

「なぜ IDLE インデントが正しいのですか?」への回答

>>>次のコマンド入力の開始としてマークを使用します。これが標準的な方法です。それは(バリエーションで)どこでも使用されます。

>>> <-start of the line. Zero spaces.
<-start of the line. Zero spaces.

したがって、次のコードのインデントは間違っています。

>>> def foo():
return 0

これは、スクリプト ファイルに記述された次のコードと同等であるためです。

def foo():
return 0

しかし

>>> <-start of the line. Zero spaces.
    <-start of the block. Indent 4 spaces.

したがって、次のコードには正しいインデントが含まれます。

>>> def foo():
    return 0

これは、スクリプト ファイルに記述された次のコードと同等であるためです。

def foo():
    return 0
于 2016-12-03T04:54:12.263 に答える