• yield理解


    简单点说 就是把yield看成return 然后走到一个yield 把这个yield当做return  return出去之后程序就暂停,然后下一次next的时候,再从上个yield结束后的地方开始执行

    1.yield的举例,理解

    def func():
        for i in range(5):
            print('i的值为',i)
            res = yield i
            print('yield后res的值为',res)
    f = func()
    #程序走到yield停止 打印出print中的语句  以及函数的返回值
    print(next(f))# 输出:i的值为 0   同时输出函数的返回值i  即 0
    
    #从yield处执行,这里因为上一个next中将i 返回出去了,所以这里next开始的时候 res是没有值的是None
    #可以理解为上一个next的步骤中结尾为 yield i  然后这个next的开始就只有res = ,  =后面的yield已经在上一步执行完了,所以就是None
    print(next(f))#输出:yield后res的值为 None  然后继续循环  输出:i的值为 1  然后碰到yield停下来,打印出函数的返回值i 即1
    
    #同上
    print(next(f))
    
    #因为按照上述的理解,yield之后 res=  ,=后面的内容在上一步中执行完毕了,所以就没有值传递过来
    #这里send是相当于加了这么一步,传递给  res = , =号右边的内容,传递给了yield的意思
    #所以为了理解方便,send可以看做是 一个next()方法 加上传递一个 值过去 代替yield的内容
    print(f.send(88888))#输出: yield后res的值为 88888   i的值为 3  打印出函数的返回值i 即3

    2.send不能放在第一次,除非send(None),这样和next()的意义一样,所以还是在执行一次next()之再执行send()

    def func2():
        while True:
            yield 1
    
    f2= func2()
    f2.send('zz')
    #报错:TypeError: can't send non-None value to a just-started generator

    3.多个yield

    def F():
        for i in range(5, 9):
            for j in range(21, 29):
                x = yield i
                print('x 为',x)
                y = (yield j) * 100
                print('y 为',y)
                x += y
                print ('>>>', x)
    
    gen = F()
    #这里return 的是i的值5然后停止
    print(next(gen))#  return 5 
    
    #继续执行,x = 66 然后走到  y = (yield j) * 100 这里停下,return 的是j的值 21
    print(gen.send(66))# return j=21
    
    #继续执行,y = 77*100=7700  打印出来,然后打印出 x+y =66+7700  然后继续循环走到 x = yield i,这里return i的值5
    print(gen.send(77))# return i=5
  • 相关阅读:
    mac升级后,遇到openssl相关问题
    mysql清空所有表
    composer 管理js css等依赖文件【fxp/composer-asset-plugin】
    php安装pcntl
    git命令
    docker
    OAuth 2.0
    mysql杯观锁与乐观锁
    mysql添加用户,授权,刷新权限
    Mac下安装SecureCRT并激活
  • 原文地址:https://www.cnblogs.com/alantammm/p/13646336.html
Copyright © 2020-2023  润新知