理解语法不一致?

时间:2013-11-16 23:33:43

标签: python if-statement python-3.x list-comprehension

我只是偶然发现了python语法中的一个缺陷 - 否则我就错过了什么。

见:

[x for x in range(30) if x % 2 == 0]

但这是语法错误:

[x for x in range(30) if x % 2 == 0 else 5]

如果您有else条款,则必须写:

[x if x % 2 == 0 else 5 for x in range (30)]

但这是语法错误:

[x if x %2 == 0 for x in range(30)]

我错过了什么?为什么这么不一致?

3 个答案:

答案 0 :(得分:16)

您在这里混合语法。这里有两个不同的概念:

  • 列表理解语法。这里if充当过滤器;是否包含迭代中的值。没有else,因为那是“不包括”的情况。

  • A conditional expression。这必须始终返回一个值,即'true'或'false'表达式的结果。

答案 1 :(得分:6)

  

我错过了什么?

以下是三元操作(在python用语中也称为“条件表达式”)

x if some_boolean else y

此评估如下:如果some_booleanTrue,请给我x,否则请给我。

不要将此与理解语法混淆:

(expression) for (iteration variable) in (iterable) [if (filter)]

条件表达式可以进入(表达式)部分。它与可选的if (filter)部分没有任何关系。

答案 2 :(得分:6)

两者之间的区别在于第一个中的尾随iflist comprehension syntax的一部分,而if-else是条件运算符,而不是列表理解的任何部分语法 - 因为它是列表推导的那部分允许的表达式。

syntax for the conditional operator如下:

x if condition1 else y

这将返回被计算的表达式的值,这就是为什么它似乎对你的情况“起作用”,尽管它会评估所有的时间并且总是返回 - 这是两者之间的关键区别。

同时,对于列表理解,它会测试条件是否适用, 在创建的新列表中添加如果条件不评估为根据{{​​3}}而不是None或其他任何内容都是true。

比较以下内容(以Truth Value Testing procedure为例):

a = [i if i % 2 == 0 else None for i in range(20)]
b =  [i for i in range(20) if i % 2 == 0]

a将是

[0, None, 2, None, 4, None, 6, None, 8, None, 10, None, 12, None, 14, None, 16, None, 18, None]

b将是

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

根本不相同,因为无论结果是什么,如果列表理解没有if部分,它仍会添加它。