我只是偶然发现了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)]
我错过了什么?为什么这么不一致?
答案 0 :(得分:16)
您在这里混合语法。这里有两个不同的概念:
列表理解语法。这里if
充当过滤器;是否包含迭代中的值。没有else
,因为那是“不包括”的情况。
A conditional expression。这必须始终返回一个值,即'true'或'false'表达式的结果。
答案 1 :(得分:6)
我错过了什么?
以下是三元操作(在python用语中也称为“条件表达式”)
x if some_boolean else y
此评估如下:如果some_boolean
为True
,请给我x
,否则请给我。
不要将此与理解语法混淆:
(expression) for (iteration variable) in (iterable) [if (filter)]
条件表达式可以进入(表达式)部分。它与可选的if (filter)
部分没有任何关系。
答案 2 :(得分:6)
两者之间的区别在于第一个中的尾随if
是list 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
部分,它仍会添加它。