为什么括号,特别是括号,对于包含元组的生成器表达式是必需的?
为什么
((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
答案 0 :(得分:4)
后者有点模糊:它像普通元组一样开始,但后来在解析中变成了一个生成器。如果我们有两个以上的元素,可能会更加明显,如(1, 2, 3, 4, x for x in range(10))
。
这也可以在grammar specification:
中看到generator_expression ::= "(" expression comp_for ")"
expression
之后归结为atom
(等等)
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.)