返回介绍

14.7 何时使用生成器表达式

发布于 2024-02-05 21:59:47 字数 954 浏览 0 评论 0 收藏 0

在示例 10-16 中,为了实现 Vector 类,我用了几个生成器表达式,__eq__、__hash__、__abs__、angle、angles、format、__add__ 和 __mul__ 方法中各有一个生成器表达式。在这些方法中使用列表推导也行,不过立即返回的列表要使用更多的内存。

通过示例 14-9 可知,生成器表达式是创建生成器的简洁句法,这样无需先定义函数再调用。不过,生成器函数灵活得多,可以使用多个语句实现复杂的逻辑,也可以作为协程使用(参见第 16 章)。

遇到简单的情况时,可以使用生成器表达式,因为这样扫一眼就知道代码的作用,如 Vector 类的示例所示。

根据我的经验,选择使用哪种句法很容易判断:如果生成器表达式要分成多行写,我倾向于定义生成器函数,以便提高可读性。此外,生成器函数有名称,因此可以重用。

 句法提示

如果函数或构造方法只有一个参数,传入生成器表达式时不用写一对调用函数的括号,再写一对括号围住生成器表达式,只写一对括号就行了,如示例 10-16 中 __mul__ 方法对 Vector 构造方法的调用,转摘如下。然而,如果生成器表达式后面还有其他参数,那么必须使用括号围住,否则会抛出 SyntaxError 异常:

def __mul__(self, scalar):
  if isinstance(scalar, numbers.Real):
    return Vector(n * scalar for n in self)
  else:
    return NotImplemented

目前所见的 Sentence 类示例说明了如何把生成器当作典型的迭代器使用,即从集合中获取元素。不过,生成器也可用于生成不受数据源限制的值。下一节会举例说明。

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

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

发布评论

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