2016-12-03 8 views
0

looking at an answer given by wwiiの間、私は間違っていると彼の押し込みにコメントしました。しかし、IDLEでコードを実行した後、私はそれが障害なく走っていることを発見しました。不適切な字下げがPython IDLEで許可されていますか?

は、私はちょうど私が正しい結果を得ていたことを確認するために、いくつかの例を試してみました:

>>> def foo(): 
    return 0 

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

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

>>> foobar() 
5 
>>> 

をあなたが見ることができるように、それらのすべてが罰金走りました。私は、通常のスクリプトで同じことをしようとすると、Pythonは私がブロックインデントすることを忘れて私に言って、私のプログラムも実行する前にエラーが発生します:

enter image description here

はインデントのこの種を来る方法をインタラクティブに許可されていますIDLEですが、通常のスクリプトではありませんか?私はIDLEのドキュメント、具体的にはセクション25.5.2.1 Automatic indentationを調べましたが、これは答えを見つけるのには役に立たなかった。

さらに、体を機能the Python documenation on functions状態がインデントされている必要があります

キーワードDEFは、関数定義を紹介します。関数名とカッコで囲まれた仮パラメータのリストが続く必要があります。関数の本体を構成するステートメントは、次の行、から始まり、インデントされたでなければなりません。

(強調鉱山)

インデントのこの種は、IDLEで許可されますが、完全に通常のスクリプトでシャットダウンされるのはなぜ

?これは目的ですか?もしそうなら、この行動はどこかに書かれていますか?

+0

プロンプト「 '' >>> '' 'は、処理する前の最初の行から削除されていると思います。しかし、それは迷惑です。 – wwii

+0

@wwii確かです。しかし、その迷惑なよりも混乱しているようです。 –

+1

私はアイドルコーダーとして公開されています。 – wwii

答えて

1

あなたがIDLEで見る>>>がちょうどプロンプトです:

>>> def foo(): 
    return 0 

それは、スクリプトファイルに記述された次のコードと同等ですので。このプロンプトが4文字長くなることは間違いないが、4つのスペースでコードをインデントすることも起こります。

コードが実際にどのように機能するかを確認するには、>>>プロンプトをすべて削除してみましょう。明確にするため、印刷結果も削除します。

は、今では完全に通常のPythonコードのようになります。

def foo(): 
    return 0 

foo() 

def bar(): 
    return foo() + 5 

bar() 

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

foobar() 

だから、IDLEは他のPythonインタプリタと違いはありません、それは最初の行に>>>プロンプトを置くだけの方法だだけそれを作ること混乱する。これら4つの文字を削除してコードをどのように見えるか考えてみると、すべて理にかなっています。

2

コードが正しいですが、IDLE REPLは、Pythonのようではありません。

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

リターンの前に4つのスペースがあることを参照してください、しかし、彼らのように:Pythonの一方が

>>> def foo(): 
    return 0 

IDLEプリント3つのドットとスペースの接頭辞ではなく、一番左の列に揃えられているため、コードがよりインデントされると予想される場合は、スペースは存在しないように見えます。

+0

_ "コードは正しいですが、IDLE REPLはPythonに似ていません" _ - 申し訳ありませんが、私はあなたにその文をよくフォローしていません。あなたはもう少し説明できますか? –

+0

@leaf標準のREPLは行指向です。物理的な行をPythonに提出し、履歴メカニズムは物理行を呼び出します。 IDLEのシェルはステートメント指向です。完全なステートメントをPythonに提出します(複数のステートメント全体を編集することもできます)。 –

1

IDLEに正しいインデントがあり、スクリプトに間違いがあります。

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

スクリプトはそのように見ている必要があります。

def foo(): 
    return 0 

def bar(): 
    return foo() + 5 

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

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

回答に「IDLEインデントが正しいのはなぜ?」

次のコマンド入力の先頭に>>>マークを使用します。これが標準的な方法です。それは(どこでも)どこでも使用されています。

def foo(): 
return 0 

しかし

>>> <-start of the line. Zero spaces. 
    <-start of the block. Indent 4 spaces. 
:それはスクリプトファイルに記述された次のコードと同等ですので

>>> def foo(): 
return 0 

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

ので、次のコードが間違ってインデントを持っています

次のコードでは、 E正しいインデント:

def foo(): 
    return 0 
関連する問題