• [oldboy-django][4python面试]有关yield那些事


    1 yield 在使用send, next时候的区别(举例m = yield 5)

      无论send,next首先理解m = yield 5 是将表达式"yield 5 "的结果返回给m, 而不是m=5这么简单, 所以涉及到如何获取表达式yield 5的值,这就和next,send有关。

      当send(arg)时,就会将arg 认为yield 5表达式的结果赋给m,而如果是next,就会将None作为yield 5表达式的结果付给m;

      所以可认为next 等效于send(None),除了第一次next外

      

      区别就是:

        使用next()时,第一次next, 在遇到yield停止,并且将yield右边的表达式“5”作为next函数的返回值返回给外界; 之后的next,会将None作为yield 5表达式的值赋给m,

        程序往下执行,遇到下一个yield时,将yield右边的表达式5作为该次的next的返回值

        使用send(arg)时(前面必须已经使用了next), 将arg作为yield表达式"yield 5"的值,赋给m;程序往下执行,然后将下个yield的右边表达式"5"作为send函数的返回值 

      

      next例子:

    def f():
        print("start")
        current = yield "hello"
        print('current=', current)
        while True:
            value = yield "bad"
            # value = value + 'not' # 此行会报错,因为value会为None, 不能和字符串进行相加
    
    
    g = f()
    s1 = next(g)
    print('s1=',s1)
    # 第一次Next时,停止在第5行, 将yield右边的表达式(无即None)作为next()的返回值
    
    s2 = next(g)
    print('s2=', s2)
    # 第二次的next,会将None作为yield表达式" yield hello"的值赋给current, 即current = None
    # 然后程序往下执行,遇到yield "bad"停止,将yield右边的表达式"bad"作为第二次next的返回值
    
    s3 = next(g)
    print('s3=',s3)
    # 第三次next,会将None作为yield表达式”yield bad"的值赋给value, 即value = None,
    # 程序往下执行,遇到value = yield "bad"停止,将"bad"作为第三次next的返回值
    View Code

      send例子:

    def f():
        print("start")
        current = yield "hello"
        print('current=', current)
        while True:
            value = yield "bad"
            print("value=",value)
            # value = value + 'not' # 此行会报错,因为value会为整形, 不能和字符串进行相加
    
    g = f()
    s1 = next(g)# 这一步不能少
    # 第一次Next时,停止在第5行, 将yield右边的表达式(无即None)作为next()的返回值
    print(g.send(10))
    # 生成器调用第一次send时,将send参数10代替表达式"yield hello"的值,赋给current,
    # 然后程序往下执行,在遇到yield bad停止,将"bad"作为第一次send()函数的返回值返给外界
    print(g.send(20))
    # 生成器第二次调用send时,将send参数20代替表达式"yield bad"赋给 value
    # 程序往下执行,然后遇到yield bad停止,将"bad"作为第二次send()函数的返回值返给外界
    View Code

       

     2 yield与生成器generator

      函数里面使用了yield不再是函数,而是一个生成器generator。 比如

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

      当执行g = fab(5)时,不是调用函数,而是实例化一个生成器对象。 当循环g对象或者next(g)时才会调用fab函数里面的代码

    def test():
        # print('one')
        yield 1
        # print('two')
        yield 2
    
    g = test()
    for i in g:
        print(i)
    
    # 应该和下面效果是一样的:
    g = test()
    res = next(g)
    print(res)
    # 首次遇到next()会执行test代码,并停留在yield 1 处,
    # 同时将yield 后面表达式的值作为next的返回值返回给外界
    #
    res = next(g)
    print(res)
    # 接着上面保存的地方,运行print two,
    # 碰到yield 2 ,停止并把后面的2作为Next的返回值返回给外界
    View Code

     3 生成器是有状态的,调用者不可反复使用它。比如:

    def test():
        yield 1
        yield 2
    
    g = test()
    for i in g:
        print(i)
    
    # 下面这里是没有效果的
    for i in g:
        print('hello')
        print(i)
    View Code

      

  • 相关阅读:
    2016第7周五
    优秀it博客和文章
    java惯用法转载
    2016第7周二
    人,终究是要找到自己喜欢的...才行
    2016第6周日
    2016第6周六
    2016第6周五
    2016第6周四
    2016第6周三
  • 原文地址:https://www.cnblogs.com/liuzhipenglove/p/7868797.html
Copyright © 2020-2023  润新知