python基础——生成器

本文深入探讨了Python中生成器和协程的概念与应用。介绍了如何使用yield关键字创建生成器,实现内存高效的数据生成。并通过实例展示了协程的运行机制,如何利用send方法进行数据传递,实现单线程下的并发效果。

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

生成器:只有调用时才会生成相应的数据,以此能节省内存,只记录当前位置,并且只有一个next()方法。

def fib(max):
    n,a,b=0,0,1
    while n<max:#n<10
        print(b)
        a,b=b,a+b # 不是 a=1,b=2,a=b,a=2 b=a+b b=2+2=4
        #而是t=(b,a+b)  a=t[0] b=t[1] 但不必显示写出临时变量t就可以赋值
        n=n+1
    return "done"
fib(10)

将函数构成生成器

def fib(max):
    n,a,b=0,0,1
    while n<max:#n<10
        yield b #使用关键字yield,则该函数就变成了一个生成器,想把谁返回出去,就在谁的前面加关键字yield,返回当前状态的值
        a,b=b,a+b # 不是 a=1,b=2,a=b,a=2 b=a+b b=2+2=4
        #而是t=(b,a+b)  a=t[0] b=t[1] 但不必显示写出临时变量t就可以赋值
        n=n+1
f=fib(10)
print(f.__next__())#只能往后,不能往前,也不能像列表一样一下子取出指定的值,只能循环一个个的取
print(f.__next__())
print(f.__next__())

协程,单线程具有并发的效果

import time
def consumer(name):
    print("%s开始生产"%name)
    while True:
        baozi=yield #没有send时为空,通过send方法给yield,也就是给baozi
        print("包子[%s]来了,被[%s]吃了"%(baozi,name))
def producer(name):
    c=consumer("A")#这个只是将该函数变成了一个生成器
    c2=consumer("B")
    c.__next__()#只有这样才能print("%s开始生产"%name),走yield处返回
    c2.__next__()
    print("开始做包子了")
    for i in range(10):
        time.sleep(1)
        print("做了1个包子,分两半")
        c.send(i)#通过send方法将i 赋值给yield,直接从中断的位置开始执行,即从print("包子[%s]来了,被[%s]吃了"%(baozi,name))开始
        c2.send(i)
producer("Alex")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值