• 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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    这点是和普通函数区别较大的地方!
    首次使用返回的是生成器对象,而不是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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    结果分析:
    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)
    
    • 1
    • 2
    • 3
    • 4

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

  • 相关阅读:
    【GD32F427开发板试用】添加 shell 功能用于控制板载外设
    MS5192T/MS5193T——低噪声、低功耗、16/24 位∑-ΔADC
    单片机实验(一)
    568A和568B两种线序
    流畅的Python读书笔记(二)序列:元组
    vue大型电商项目尚品汇(前台篇)day02
    【C++】哈希位图和布隆过滤器
    在.NET Framework中使用RocketMQ(阿里云版)实战【第二章】
    Diffusion Model论文/DALL E 2
    3.1.OpenCV技能树--二值图像处理--阈值
  • 原文地址:https://blog.csdn.net/baidu_38766791/article/details/127419813