生成器表达式和括号

时间:2017-07-14 11:32:52

标签: python python-2.7

为什么括号,特别是括号,对于包含元组的生成器表达式是必需的?

为什么

((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 个答案:

答案 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.)