spring学习指南 第4版_fluent python 14.5 Sentence类第4版:惰性实现

0d48c21a4ab6d005c0782ff374fbd216.png

设计 Iterator 接口时考虑到了惰性:next(my_iterator) 一次生成 一个元素。懒惰的反义词是急迫,其实,惰性求值(lazy evaluation)和 及早求值(eager evaluation)是编程语言理论方面的技术术语。

目前实现的几版 Sentence 类都不具有惰性,因为 __init__ 方法急迫 地构建好了文本中的单词列表,然后将其绑定到 self.words 属性上。 这样就得处理整个文本,列表使用的内存量可能与文本本身一样多(或 许更多,这取决于文本中有多少非单词字符)。如果只需迭代前几个单 词,大多数工作都是白费力气。

只要使用的是 Python 3,思索着做某件事有没有懒惰的方式,答案通常 都是肯定的。

re.finditer 函数是 re.findall 函数的惰性版本,返回的不是列 表,而是一个生成器,按需生成 re.MatchObject 实例。如果有很多匹 配,re.finditer 函数能节省大量内存。我们要使用这个函数让第 4 版 Sentence 类变得懒惰,即只在需要时才生成下一个单词。代码如下所示。

import re
import reprlib

RE_WORD = re.compile('w+')


class Sentence:

    def __init__(self, text):
        self.text = text

    def __repr__(self):
        return 'Sentence(%s)' % reprlib.repr(self.text)

    def __iter__(self):
        # finditer 函数构建一个迭代器,包含 self.text 中匹配 RE_WORD 的单词,产出 MatchObject 实例。
        for match in RE_WORD.finditer(self.text):
            # match.group() 方法从 MatchObject 实例中提取匹配正则表达式的 具体文本。
            yield match.group()

生成器函数已经极大地简化了代码,但是使用生成器表达式甚至能把代 码变得更简短。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值