【python 基础篇 十三】python的函数-------函数生成器

1.生成器基本概念

  • 是一个特色的迭代器(迭代器的抽象层级更高)
  • 所以拥有迭代器的特性
    • 惰性计算数据 节省内存 ----就是不是立马生成所有数据,而是到需要数据的时候在生成
    • 能够记录状态 并通过next()函数,访问下一个状态
    • 具备可迭代特性
  • 自己编写一个迭代器,比较复杂,需要实现很多方法,所以,就有了一个生产器

2.生成器的创建方式

  • 方式一
    • 生成器表达式 把列表推导式的[]修改成()
  • 方式二
    • 生成器函数 函数中包含yield语句,这个函数的执行结构就是“生成器”
#列表推导式  方式一
l = [i for i in range(1,100) if i % 2 == 0]
#生成 1-100之间的偶数组成的列表
#此时的列表推导式 是一次性生成所有的数据,如果使用生成器就不是一次性生成所有数据,而是等到使用的时候才会创建。
print(l)#输出 2 4 6 8 .....

#生成器
l = (i for i in range(1,100) if i % 2 == 0)
print(l)#输出<generator object <genexpr> at 0x000001B0DA075700>
#此时不会直接生成数据
#只有使用 next()才可以访问
print(next(l))#输出2
print(next(l))#输出4
#也可以使用 for  in 循环访问


#生成器函数
def test():
    print("xxx")
    yield 1
    print("a")
    yield 2
    print("b")
    yield 3
    print("c")
    yield 4
    print("d")
g = test()#此时test函数没有被执行 
print(g)#输出 <generator object test at 0x000002698C3B4A00>
print(next(g))# xxx 1
print(next(g))#a  2
#test函数形成一个生成器(迭代器),每次执行都到yield停止,并返回 yield 后面的数据

3.生成器的输出方式

  • 生成器具备迭代器的特性
  • 使用next()函数 等价于 生成器._ next _ ()
  • for in

4.send()方法

  • send方法有一个参数,指定的是上一次被挂起的yield语句的返回值
  • 相比于 . _ next _() 可以额外的给yield语句传值
  • 注意第一次调用 t.send(None)
def test():
    print("XXX")
    res1 = yield 1
    print(res1)
    res2 = yield 2
    print(res2)
    res3 = yield 3
    print(res3)
g = test()
print(g.__next__())#输出 XXX 1
print(g.__next__())#输出 None 2 此时的None是res1没有接收到数据 因为上一次走到yield 就停止了 res1没有接收数据
print(g.send("ooo"))#输出 ooo 3

5.关闭生成器

  • g.close()
  • 后续如果继续调用,会抛出StopIteration异常提示
def test():
    yield 1
    print("a")
    yield 2
    print("b")
    yield 3
    print("c")
g = test()
print(g.__next__())#输出 1
print(g.__next__())#输出 a 2
print(g.__next__())#输出 b 3
print(g.__next__())#输出 c
print(g.__next__())#输出 报错 StopIteration

#如果是这样
print(g.__next__())#输出 1
print(g.__next__())#输出 a 2
g.close()
print(g.__next__())#输出 报错 StopIteration

6.注意事项

  • 如果碰到return 会直接终止,抛出StopIteration异常
  • 生产器只会遍历一次
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unknown To Known

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值