生成器

本文深入探讨了Python中生成器的创建与使用方法,包括如何通过函数和yield关键字实现生成器,以及next和send方法的区别与应用。通过实例演示了生成器在控制流和数据处理中的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 创建生成器的第一重方式
    在这里插入图片描述

  2. 创建生成器的方法2(定义一个函数,让这个函数变成生成器)
    例如:1 1 2 3 5 8 13…
    定义函数:

def fib(num):
a,b,count =0,1,1
while count <= num:
print(b)
a,b =b,a+b
count +=1
fib(10)
在这里插入图片描述

  1. 如果在调用函数的时候,发现这个函数中有yeild
    那么此时,也就不是调用函数了,而是创建了一个生成器对象
def creat_num(all_num):
    print('~~~~~~~~~~~1~~~~~~~~~~~`')
    a,b=0,1
    current_num = 0
    while current_num < all_num:
        print('~~~~~~~~~2~~~~~~~~~~~')
        yield a #相当于暂停了程序
        print('~~~~~~~~~3~~~~~~~~~~~~')
        a,b = b,a+b
        current_num +=1
        print('~~~~~~~~~4~~~~~~~~~~~~~')
obj = creat_num(5)
print(obj)

在这里插入图片描述
调用显示函数:
注意:调用次数过多,生成器里面没有东西,程序就会报错
例如:

obj = creat_num(5)
print(obj)
ret = next(obj)
print(ret)
ret1 = next(obj)
print(ret1)
ret2 = next(obj)
print(ret2)
ret3 = next(obj)
print(ret3)
ret4 = next(obj)
print(ret4)
ret5 = next(obj)
print(ret5)
显示:
在这里插入图片描述
此时.我们发现程序会报错,可以采用以下方式排查:

while True:
    try:
        ret = next(obj)
        print('obj:',ret)
    except Exception as red:
        print(red.value)
        break

在这里插入图片描述
用for 循环做:

for num in obj:
print(num)
在这里插入图片描述

两个生成器对象之间并没有任何关系

obj2 = creat_num(100)
print(obj2)
ret4 = next(obj2)
print(ret4)
在这里插入图片描述

  1. 使用send唤醒程序
    使用send()函数来唤醒程序执行,使用send()函数的好处是可以在唤醒的同时向断点中传入一个附加的数据
    例如:

def creat_num(all_num):
a,b =0,1
current_num = 0
while current_num < all_num:
ret = yield a
print(’>>>>>>>>ret>>>>>>>>>’,ret)
a,b = b,a+b
current_num +=1
obj =creat_num(5)
red = next(obj)
print(red)
red = obj.send(None)
print(red)
在这里插入图片描述

5 next 和send的区别
next和send得到的都是yield后面的值
不同的是send传递值而next不传递值
注意:
不能把send放在第一个,因为第一次执行程序是从开始执行
并没有值来接收send
如果你非要把send放在第一个,那么传递的值应该是None

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值