2017-07-14 31 views
3

爲什麼包含元組的生成器表達式需要括號,特別是括號?生成器表達式和括號

爲什麼

((x, y) 
for x in range(10) 
for y in range(20)) 

,而不是

(x, y 
for x in range(10) 
for y in range(20)) 

SyntaxError: invalid syntax 
+2

後者是一種模糊的;像一個普通的元組開始,但後來在解析中變成了一個生成器。 (不僅適用於生成器,也適用於列表解析) –

+0

是:)虐待接受該答案 – Har

回答

4

後者是種曖昧的:它開始像一個正常的元組,但後來證明是後來在解析一臺發電機。如果我們有兩個以上的元素,這可能會更明顯,如(1, 2, 3, 4, x for x in range(10))

這也可以看出在grammar specification

generator_expression ::= "(" expression comp_for ")" 

expression後歸結爲​​(等等)

atom  ::= identifier | literal | enclosure 
enclosure ::= parenth_form | list_display 
       | generator_expression | dict_display | set_display 
       | string_conversion | yield_atom 
parenth_form ::= "(" [expression_list] ")" 
expression_list ::= expression ("," expression)* [","] 

即,expression_listx, y必須用括號括起來(作業除外,如a = b, c,可直接使用)。

assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression) 

(不只是爲發電機,也爲列表解析,並在Python 3)

+0

1用於查找規範,但它確實含糊不清?不是一次你檢查整個表達式? –

+0

@Chris_Rands:* inspection *顯而易見,但解析器本身不檢查,它們通過令牌讀取輸入令牌並在語法中查找模式匹配。 –

+1

@ IgnacioVazquez-Abrams我接受你的觀點,但是'for'和'in'關鍵字應該很容易通過解析器檢測到?我經常不小心寫了''a,int(b)for a,b in zip(lst1,lst2)]',Python可以不同嗎? –