练习: 将以下代码改写成用 yield 来构造生成器的写法:
def index_words(text):
result = []
if text:
result.append(0)
for index,letter in enumerate(text):
if letter == " ":
result.append(index+1)
return result
address = "Four score and seven years ago"
result = index_words(address)
print(result)
未能自己改写成,参考答案后改写如下:
def index_words2(text):
if text:
yield 0
for index,letter in enumerate(text):
if letter == " ":
yield index+1
result2 = index_words2(address)
print(result2)
print(list(result2))
核心概念是将生成器中每个结果给 yield 出来,以此组成完整的生成器
定义这种生成器函数的时候,唯一要留意的是函数返回的那个迭代器是有状态的,调用者不该反复使用它。
根据《Effective Python》 第 16 条:
- 使用生成器比把收集到的结果放入列表里返回给调用者更清晰
- 由生成器函数所返回的那个迭代器,可以把生成器函数体中,传给 yield 表达式的那些值,逐次产生出来
- 无论输入量有多大,生成器都能产生一系列输出,因为这些输入量和输出量,都不会影响它在执行时所耗的内存。