Python中的yield语句理解

带有 yield 的函数在 Python 中被称之为 generator(生成器),yield语句一般与循环体共同使用,进而实现类似迭代的效果
下面以生成斐波那契数列为例,理解yield的作用:

def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b      # 使用 yield
        a, b = b, a + b 
        n = n + 1


for m in fab(5): 
    print(m)

输出:

1
1
2
3
5

简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 迭代(iterable) 对象。
for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield

结合上述函数,对其执行过程进行拆解:

  • 第1次for循环,调用fab(5)函数,运行while循环体,运行至yield b,此时 n = 0 , a = 0 , b = 1 n=0,a=0,b=1 n=0,a=0,b=1,返回b值并暂停,此时循环m得到b值,打印m,为1
  • 第2次for循环,接着a, b = b, a + b向下运行,得到 a = 1 , b = 1 , n = 1 a=1,b=1,n=1 a=1,b=1,n=1,经while条件再次运行至yield b,返回b值并暂停,打印m,为1
  • 第3次for循环,接着a, b = b, a + b向下运行,得到 a = 1 , b = 2 , n = 2 a=1,b=2,n=2 a=1,b=2,n=2,经while条件再次运行至yield b,返回b值并暂停,打印m,为2
  • 第4次for循环,接着a, b = b, a + b向下运行,得到 a = 2 , b = 3 , n = 3 a=2,b=3,n=3 a=2,b=3,n=3,经while条件再次运行至yield b,返回b值并暂停,打印m,为3
  • 第5次for循环,接着a, b = b, a + b向下运行,得到 a = 3 , b = 5 , n = 4 a=3,b=5,n=4 a=3,b=5,n=4,经while条件再次运行至yield b,返回b值并暂停,打印m,为5
  • 第6次for循环,接着a, b = b, a + b向下运行,得到 a = 5 , b = 8 , n = 5 a=5,b=8,n=5 a=5,b=8,n=5,不满足while条件,终止。

从上述拆解步骤,可以看出,若yield语句不与while循环体共同使用,yield则只能起到一次暂停作用,就无法起到类似迭代器的作用。

参考

  1. 菜鸟教程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

great-wind

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

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

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

打赏作者

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

抵扣说明:

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

余额充值