yield 代码初练

练习: 将以下代码改写成用 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 条:

  1. 使用生成器比把收集到的结果放入列表里返回给调用者更清晰
  2. 由生成器函数所返回的那个迭代器,可以把生成器函数体中,传给 yield 表达式的那些值,逐次产生出来
  3. 无论输入量有多大,生成器都能产生一系列输出,因为这些输入量和输出量,都不会影响它在执行时所耗的内存。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值