在过去的一周里,我一直在提高我的 python 编程技能,并且遇到了列表理解的条件过滤,这被证明非常有用。但是,要向if 过滤器添加else 子句,python 需要不同的语法,如下所示:没有 else 子句的列表理解过滤器squares = [x**2 for x in range(20) if x % 2 == 0]带有 else 子句的列表理解过滤器squares = [x**2 if x % 2 == 0 else x + 3 for x in range(20)]if-else 子句必须移到表达式之后的列表理解的开头x**2有人可以解释为什么会这样吗?列表理解中的 if/else问题?询问如何做到这一点,我知道。我的问题是为什么会这样。
2 回答
慕容森
TA贡献1853条经验 获得超18个赞
这是你的一个小小的误解。
您的第一行是带有过滤器的列表理解。它只为那些 xs 构建 x 的平方列表x % 2 == 0。
您的第二行不是带有过滤器的列表理解。这只是使用三元运算符的普通未过滤列表理解。在这种情况下,它不是一个子句,而是一个表达式。它说:对于每个 x in range(20),评估这个表达式并将结果值放入列表中。
婷婷同学_
TA贡献1844条经验 获得超8个赞
尽管重用了关键字,但语句、条件表达式或列表推导的过滤子句if之间没有任何关系。if
过滤器可以很容易地使用不同的关键字来强调这一点,例如,
[x**2 for x in range(20) aslongas x % 2 == 0]
条件表达式也可以
[x**2 when x % 2 == 0 otherwise x + 3 for x in range (20)]
但是,为了避免对程序员的内存造成不必要的负担,也为了避免取消以前有效的标识符名称,在添加新的句法结构时尽可能多地重用关键字。仅当语法禁止明确识别不同用途并且好处超过破坏现有代码的可能性时,才引入新关键字。
请注意,您的第二个没有过滤;考虑可迭代的每个值x;只有产生的值x是有条件的。
添加回答
举报
0/150
提交
取消
