Python_Nox_yield的用法

yield用法

近期在使用python中遇到了yield表达式,不是很明白其含义。这里写下这篇文章谈谈自己对yield的理解。

  • yield具有类似return的功能
  • 具有yield表达式的函数是一个可迭代生成器

可迭代生成器

当函数中具有yield表达式时,这个函数就是一个可迭代生成器。

# 演示创建一个可迭代生成器函数
def func(n:int):
    while n > 0:
        yield n
        print(n)
        n = n-1
# 首次调用该函数时返回的是一个生成器
print(func(3))

在这里插入图片描述

这点是和普通函数区别较大的地方!
首次使用返回的是生成器对象,而不是3!

可迭代生成器的运行过程

yield表达式所在的地方,具有记忆作用。每次运行时都只执行到yield后的部分,并记录此时的变量值。当下一次调用时,在从上一次运行结束的地方继续运行,直到遇到yield结束。

gen = func(3)
first = next(gen)
print("*" * 20)
second = next(gen)
print("*" * 20)
third = next(gen)
print("*" * 20)
forth = next(gen)

在这里插入图片描述

结果分析:
gen = func(3) 取得可迭代生成器的对象。
first = next(gen) 第一次执行生成器对象内部逻辑。此时函数内部逻辑只运行到yield n 部分,
所以这一步时没有打印3。此时n为3
print(“*” * 20) 打印用来分割第一次和第二次执行生成器对象内部逻辑。
second = next(gen) 第二次执行生成器对象内部逻辑。此时函数内部逻辑从print(n) 部分开始执行,直到yield n 部分结束。此时n为2
==print("
" * 20)== 打印用来分割第二次和第三次执行生成器对象内部逻辑。
third = next(gen) 第三次执行生成器对象内部逻辑。此时函数内部逻辑从print(n) 部分开始执行,直到yield n 部分结束。此时n为1
==print("
" * 20)== 打印*用来分割第三次和第四次执行生成器对象内部逻辑。
forth = next(gen) 第四次执行生成器对象内部逻辑。此时函数内部逻辑从print(n) 部分开始执行,经过n = n - 1 指令后,n为0。此时n不满足while条件无法执行到yield n 部分,故产生StopIteration 异常。

可迭代生成器的用法

  • 通过next(gen)单次调用一次生成器
  • 用在for循环中
    下面给出一个用在for循环中的示例
print("-"*20)
gen1 = func(3)
for i in gen1:
    print(i)

当用在for循环中时i是每次yield n之后的n。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱学习_程序员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值