python-生成器-yield关键字(一)

生成器

定义生成器

  1. 使用yield关键字
    def generate_one(list_num):
        for i in list_num:
            yield i * i
    
  2. 使用圆括号
    v2 = (i * i for i in range(6))
    

和推导式的区别

生成器表达式不会创建序列形式的对象,不会把所有的值都读取到内存中,而是会创建一个通过迭代并按照需求生成值的生成器对象(Generator)。

  1. 也就是说占用内存很小 如果使用较大数据推荐使用生成器

使用

  1. 可使用next()函数 但超出会报StopIteration错误
    v1 = generate_one([1, 2, 3, 4, 5])
    print(next(v1))
    
  2. 其中每次next都会去找下一个元素 如果没有就会报错

生成器函数返回生成器。要注意的是生成器就是一类特殊的迭代器。作为一个迭代器,生成器必须要定义一些方法,其中一个就是__next__()。
每当生成器被调用的时候,它会返回一个值给调用者。在生成器内部使用yield来完成这个动作。为了记住yield到底干了什么,最简单的方法是把它当作专门给生成器函数用的特殊的return。调用next()时,生成器函数不断的执行语句,直至遇到yield为止,此时生成器函数的"状态"会被冻结,所有的变量的值会被保留下来,下一行要执行的代码的位置也会被记录,直到再次调用next()继续执行yield之后的语句。
next()不能无限执行,当迭代结束时,会抛出StopIteration异常。迭代未结束时,如果你想结束生成器,可以使用close()方法。

  1. 看以下用法
    def generate_one(list_num):
    print('start')
    for i in list_num:
        yield i * i
    print('end')
    
    v1 = generate_one([1, 2, 3, 4, 5])
    for v in v1:
        print(v)
    
    输出
    输出
    其中每次调用生成器会先执行yield之前的语句 直到遇到yield返回(类似于return)

    带yield的函数是一个生成器,而不是一个函数了,这个生成器有一个函数就是next函数,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行

生成器的四个方法

  1. __next__()
  2. send()
  3. throw()
  4. close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值