python中yield生成器的使用

首先,用代码写一个简单的斐波那契数列:

def a(n):
    b,num1,num2 = 0,1
    while b <= n:
        num = num1
        num1,num2 = num2,num1 + num2
        b += 1    
        print(num)
a = a(5)

运行结果:
在这里插入图片描述

但是,直接在函数中用 print 打印数字会导致该函数可复用性较差,因为函数返回值None,其他函数无法获得该函数生成的数列。要提高函数的可复用性,最好不要直接打印出数列,而是返回一个 List。

def a(n):
    b,num1,num2 = 0,0,1
    list1 = []
    while b <= n:
        num = num1
        num1,num2 = num2,num1 + num2
        list1.append(num)
        b += 1
    return list1
a = a(5)
print(a)
for i in a:
    print(i)

结果:
在这里插入图片描述
可以看到,返回一个列表后,可以遍历列表操作,但是,该函数在运行中占用的内存会随着参数 n 的增大而增大,如果要控制内存占用,最好不要用 List来保存中间结果,而是通过 iterable 对象来迭代。

def a(n):
    b,num1,num2 = 0,0,1
    while b <= n:
        num = num1
        num1,num2 = num2,num1 + num2
        b += 1
        yield num
a = a(5)
print(a)
for i in a:
    print(i)

结果:
在这里插入图片描述
这里返回的就是一个生成器对象,对它同样可以遍历操作,也就是说,yield 的作用就是把一个函数变成一个 generator(生成器),带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 a(5) 不会执行a()函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 a() 函数内部的代码,执行到 yield 时,a()函数就返回一个迭代值,下次迭代时,代码从 yield 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
这样就节省了大量空间,且同样能拿到所需要的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值