编写高质量Python代码的59个有效方法 第16条:考虑用生成器改写直接返回列表的函数

例:要求查出字符串中每个单词的首字母,在整个字符串里的位置。

def index_words(text):
    result = []
    if text:
        result.append(0)
    for index, letter in enumerate(text):
        if letter == ' ':
            result.append(index + 1)
    return result

上面这个函数有两个问题:

  1. 每次找到新的结果,都要调用append方法,但我们应该强调的不是append,而是值index+1。于是在函数主体的130个字符里,重要的只有75个左右。
  2. 在返回前,所有结果都存在列表里,如果输入量非常大,程序就可能耗尽内存崩溃

另一种写法:

def index_words(text):
    if text:
        yield 0
    for index, letter in enumerate(text):
        if letter == ' ':
            yield index + 1

result = list(index_words(text))

要点:

  • 使用生成器比把收集到的结果放入列表里返回的写法更清晰
  • 无论输入量多大,也不用担心内存耗尽

你可能感兴趣的:(编写高质量Python代码的59个有效方法 第16条:考虑用生成器改写直接返回列表的函数)