返回介绍

扩展的列表解析语法

发布于 2024-01-29 22:24:16 字数 1212 浏览 0 评论 0 收藏 0

实际上,列表解析可以有更高级的应用。作为一个特别有用的扩展,表达式中嵌套的for循环可以有一个相关的if子句,来过滤那些测试不为真的结果项。

例如,假设我们想要重复前面小节的文件扫描示例,但是,我们只需要收集以字母p开头的那些行(可能每一行的第一个字母是某种类型的动作代码)。向表达式中添加一条if过滤子句来实现:

这条if子句检查从文件读取的每一行,看它的第一个字符是否是p;如果不是,从结果列表中省略该行。这是一个相当大的表达式,但是,如果我们将它转换为简单的for循环语句等价形式的话,它很容易理解。通常,我们总是可以把一个列表解析转换为一条for语句,通过逐步附加并进一步缩进每个后续的部分:

这个for语句等价形式也有效,但是,它占据了4行而不是一行,并且可能运行起来要慢很多。

如果我们需要的话,列表解析可以变得更复杂——例如,它们可能包含嵌套的循环,也可能被编写为一系列的for子句。实际上,它们的完整语法允许任意数目的for子句,每个子句有一个可选的相关的if子句(在第20章中,我们将更正式地介绍其语法)。

例如,下面的例子构建了一个x+y连接的列表,把一个字符串中的每个x和另一个字符串中的每个y连接起来。它有效地收集了两个字符串中的字符的排列:

再次,理解这个表达式的一种方式是通过缩进其各个部分将它转换为语句的形式。下面是其等价形式,但可能会更慢一些,这是实现相同效果的一种替代方式:

然而,除了这一复杂的层级,列表解析表达式往往可以变为更紧凑的形式。通常,它们会缩进以简化迭代的类型;对于更多的相关工作,一条简单的for语句结构可能更容易理解,并且将来也更容易修改。与编程中的通常情况一样,如果某些内容对你来说难以理解,它可能不是一个好主意。

我们将在第20章学习函数式编程工具的时候再次回顾列表解析;我们将会看到,当列表解析要对语句进行循环的时候,它们就是和函数相关联的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文