• python - yield详解


    文章源自查看博客:python中yield的用法详解——最简单,最清晰的解释_冯爽朗的博客-CSDN博客_python yield

            自己整理思路使用,希望大家去看原作者的博客,讲解超级清晰且易理解!!

    目录

    1 yield搭配next()使用

    2 yield搭配send()使用

    3 使用yield的优点


    1 yield搭配next()使用

            在调用包含yield的函数时,在第一次调用时可以将yield看作return,就是返回yield之后跟的值;

            再次调用包含yield函数时,将函数看作是一个生成器,是接着上一次调用运行结束的地方执行的。

    具体理解看代码:

    1. def foo():
    2. print("starting...")
    3. while True:
    4. res = yield 4
    5. print("res:",res)
    6. g = foo()
    7. print(next(g))
    8. print("*"*20)
    9. print(next(g))

            第一步:定义foo()函数;

            第二步:定义生成器g;-- 这里不会调用foo()函数,直到运行到next()时,才真正的调用函数;

            第三步: 执行定义的生成器g, 首先执行print,输出 starting...,然后进入while循环,执行res = yield 4, 这是第一次调用该函数,因此yield在这里看作是 return, 然后返回4,相当于该函数执行完成;

            第四步: 执行 print("*"*20);

            第五步:再次执行定义的生成器,这次执行是接着上一次执行结束的地方开始执行,也就是从 res = yield 4的地方开始执行,此时是进行赋值操作,因为原本的4已经在上一步被返回出去,此时的赋值操作,res应该被赋值为None;

            第六步,然后接着向下执行,返回res的值,然后再进行while循环,当作return 返回4,执行结束;

    因此上述代码的执行结果为:

    1. starting...
    2. 4
    3. ********************
    4. res: None
    5. 4

    2 yield搭配send()使用

            send()是发送一个值到yield处;

    具体代码:

    1. def foo():
    2. print("starting...")
    3. while True:
    4. res = yield 4
    5. print("res:",res)
    6. g = foo()
    7. print(next(g))
    8. print("*"*20)
    9. print(g.send(7))

            与第一个例子不同的是,将最后一行换掉了;

    执行步骤:   

            第一步:定义foo()函数;

            第二步:定义生成器g;-- 这里不会调用foo()函数,直到运行到next()时,才真正的调用函数;

            第三步: 执行定义的生成器g, 首先执行print,输出 starting...,然后进入while循环,执行res = yield 4, 这是第一次调用该函数,因此yield在这里看作是 return, 然后返回4,相当于该函数执行完成;

            第四步: 执行 print("*"*20);

            第五步:再次执行定义的生成器,这次执行是接着上一次执行结束的地方开始执行,也就是从 res = yield 4的地方开始执行,此时是进行赋值操作,因为这次使用的为send(7), 实际上是将7发送到yield处,因此res便被赋值为7;

             第六步,然后接着向下执行,返回res的值,然后再进行while循环,当作return 返回4,执行结束;

    执行结果:

    1. starting...
    2. 4
    3. ********************
    4. res: 7
    5. 4

    3 使用yield的优点

            节省内存;

    具体列子:

    1. for n in range(1000):
    2. a=n

            使用 range(1000),会产生长度为1000的list,占用内存大;

    使用yield实现上述方法:

    1. def foo(num):
    2. print("starting...")
    3. while num<1000:
    4. num=num+1
    5. yield num
    6. for n in foo(0):
    7. print(n)

            此时占用内存便很小,不需要存1000个数;

  • 相关阅读:
    Qt+树莓派4B 磁盘、内存、mac地址等系统信息获取
    如何查看mysql里面的锁(详细)
    迟滞比较器仿真
    金仓数据库 KingbaseES 插件force_view
    用尾指针标识的单循环链表实现队列r
    基于51单片机农业大棚温控系统
    uniapp获取手机号一键登录和退出登录功能
    7种方式企业内部资料共享,你pick谁?
    详解Mysql中redo log、undo log、bin log
    什么是DevOps
  • 原文地址:https://blog.csdn.net/qq_40671063/article/details/126867992