2016-03-26 13 views
3

コード出力の次の行SyntaxError: invalid syntax無効な構文

for (i in range(-WIDTH,WIDTH)): 

次のものがエラーなしで動作します。私は構文エラーがここにあるはずのものは何も知らない。だから私は好奇心から尋ねるだけです。私の推測では、大括弧は式の評価を妨げるものです。

for i in range(-WIDTH,WIDTH): 
+2

@ cricket_007 OPは英国から来ている可能性があります。ここでは、大括弧()を呼び出すのが一般的です。 –

+0

@ 2ビットアルケミスト '()'は、英国、カナダ、ニュージーランド、オーストラリアでは角括弧と呼ばれます。 https://en.wikipedia.org/wiki/Bracketを参照してください。言い換えれば、国際的にプログラミングしている人は、「かっこ」や「角かっこ」という用語を使用しています。新生児は避けるべき言葉を伝える必要があります - それは自然に来ません。私を#から始めないでください。 – cdarke

答えて

6

あなたのカッコは、本質的にパーサを混乱させるだけです。

最も顕著なのタプルアンパックを使用して、あなたがfor後に開いた括弧を持つことができる理由のカップルは、あります

>>> for (x, y) in zip(range(5), range(6, 11)): 
... print(x, '->', y) 
... 
0 -> 6 
1 -> 7 
2 -> 8 
3 -> 9 
4 -> 10 

また、括弧は、このような、簡単なグループ化のためのPythonでの場所の負荷で使用することができます長い線を分割するときのように:

したがって、パーサは実際にそれについて文句を言うことはありません。しかし

、あなたが知っているように、forsupposed to read like thisです:

for_stmt ::= "for" target_list "in" expression_list ":" suite 
       ["else" ":" suite] 

このようにグループ化することにより、無効なループを構築していることを意味しています。基本的に、inは括弧でグループ化されているため、target_listにグループ化されています。これが理にかなってほしい。あなたの近くの括弧の後(expression_listに)ループのためのあなたの残りの部分を書く:何が起こっているかをより明確に参照するには


方法。次に、この文をどのように解釈しているかについて、より明確なエラーが表示されます。

>>> for (i in range(-WIDTH, WIDTH)) in range(-WIDTH, WIDTH): 
... print(i) 
... 
    File "<stdin>", line 1 
SyntaxError: can't assign to comparison 

だから、あなたがそれを行うようになるが、x in yの結果は、割り当ての対象にならないブール値になります。元のエラーは、が見つかる前に:に届いているためです。普通の無効な構文です。ちょうどfor x:と書いてあります。

+0

あなたの最初の 'for'ループでは、括弧は*必須ではありません:' for x、y in zip(範囲(5)、範囲(6,11)): '。タプルを作るのはコンマです。これらは関数呼び出し演算子としても使用されます( 'x = foo'と' x = foo() 'と対照的です)。 – cdarke

+0

私はそれらが要求されたとは言いませんでした。私は彼らが信じられていると言った。これはパーサーがそのステートメントについてどのように考えるかについてです。どのように関数呼び出しの使用法が関連する可能性があるのか​​わかりませんが、あなたが私に教えてくれれば、答えに追加することができます。 –

+0

多くの箇所でかっこが優先されます。あなたはタプル解凍を "注目に値する"と言いましたが、タプルを解凍する必要はほとんどありません。これは、一般的で簡単に誤解され、 '[]' makeはリストを作成して '()'がタプルを作ることを誤解しています。私は関数呼び出しについてのあなたの意見を取ります。私はちょうどカッコを使うことで違いがある場所を考えようとしていました。 – cdarke