爲什麼包含元組的生成器表達式需要括號,特別是括號?生成器表達式和括號
爲什麼
((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
爲什麼包含元組的生成器表達式需要括號,特別是括號?生成器表達式和括號
爲什麼
((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
後者是種曖昧的:它開始像一個正常的元組,但後來證明是後來在解析一臺發電機。如果我們有兩個以上的元素,這可能會更明顯,如(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_list
像x, y
必須用括號括起來(作業除外,如a = b, c
,可直接使用)。
assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)
(不只是爲發電機,也爲列表解析,並在Python 3)
1用於查找規範,但它確實含糊不清?不是一次你檢查整個表達式? –
@Chris_Rands:* inspection *顯而易見,但解析器本身不檢查,它們通過令牌讀取輸入令牌並在語法中查找模式匹配。 –
@ IgnacioVazquez-Abrams我接受你的觀點,但是'for'和'in'關鍵字應該很容易通過解析器檢測到?我經常不小心寫了''a,int(b)for a,b in zip(lst1,lst2)]',Python可以不同嗎? –
後者是一種模糊的;像一個普通的元組開始,但後來在解析中變成了一個生成器。 (不僅適用於生成器,也適用於列表解析) –
是:)虐待接受該答案 – Har