购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 多数据源和过滤器

在SEQUENCE语句中,可以有多个for关键字,可以基于两个或多个序列源构建列表:

代码分别利用序列colors和toys两两组合,形成最终列表。最终列表共有12个元素,数量等于两个列表长度的乘积。

注意,两个for循环是相互独立的,colors和toys是两个无关联列表。有时,可通过不同的形式使用多个for循环,使for循环之间形成更紧密的关系。考虑下面的示例:

序列源ranges是范围对象的列表 。这个列表推导式也包含两个for循环。但是要注意,一个for循环依赖于另一个for循环,第二个for循环的来源是第一个for循环中的变量!

与前面的colors和toys示例不同,前者的各个for循环是独立的。当将for循环链接起来时,顺序非常重要:

Python从左到右解析列表推导式。如果第一个子句是for num in subrange,则此时subrange尚未定义。因此,需要将for subrange in range放在前面。也可以连续使用多个for循环,第一个子句只需引用先前定义的数据源,后续for循环引用前方的for循环,比如定义好的subrange。

2.3.1 独立语句

上一节讨论了for循环的链接问题。如果语句是独立的,顺序是否会影响结果呢?确实存在影响,只是方式不同。观察下面两个列表推导式的区别:

在这种情况下,顺序并不像在嵌套循环中那样严格,但嵌套循环要求按特定顺序排列元素,否则程序无法运行。在这里,你可以自由选择顺序,而这个顺序确实会影响最终生成器中元素的顺序。

无论是哪种版本,第一个元素都是orange bike,但第二个元素不同。问一个问题:为什么两个推导式的第一个元素相同,但第二个元素不同?

关键在于,哪个序列是固定的,哪一个序列是变动的,逻辑与嵌套循环相同:

列表推导中的第二个for循环对应的是内部for循环,内部取值范围的变化速度比外部循环更快。

2.3.2 多过滤器

除了使用多个for语句,还可以使用多个if语句进行多重筛选。只需依次编写if语句:

为了提高可读性,每个if语句单独位于一行,也可以写在同一行。当有多个if语句时,if语句之间是“与”关系,不是“或”关系。等价于以下代码:

两种写法的唯一区别是可读性。如果读者认为使用带有and的if语句更易读,不妨使用and;如果使用多个if语句更易读,则使用多个if语句。

假设你想让元素至少满足一条if语句的条件,排除不匹配任何条件的元素。在这种情况下,必须使用带有or的if语句,且不能在同一个列表推导式中用or连接多个if语句。例如,可以使用以下代码过滤是2或3倍数的数字:

此外,还可以定义一个辅助函数。当过滤逻辑很复杂或不够直观时,借助辅助函数通常能提升代码可读性:

普通Python语法比推导式语法更强大,有些列表无法用推导式表示。可以结合使用多个for和if语句:

唯一的原则是第一条for语句必须出现在第一条if语句之前。此外,可以随意交错使用for和if语句。一般是将所有for语句放在一起,后面再把所有if语句放在一起,这样更容易阅读。 qtGFA9OIfjuouGTp7PxT9uC54N+RADCJUv8X+uEKsRSrGQ/E2FH4eo3PG+liQvWD

点击中间区域
呼出菜单
上一章
目录
下一章
×