美文网首页programming
python 生成器 send()方法简介

python 生成器 send()方法简介

作者: 忘了呼吸的那只猫 | 来源:发表于2019-02-21 15:31 被阅读1次
    #!/usr/bin/python3
    
    def MyGenerator():
            value=yield 1
            yield value
            return done
    
    gen=MyGenerator()
    print(next(gen))
    print(gen.send("I am Value"))
    

    生成器内有一个方法send,可再次传入一个值。


    上面那句可能听不懂,但是不要紧,我们先来看看代码,

    #!/usr/bin/python3
    def MyGenerator():
            value=yield 1
            yield value
            return done
    
    gen=MyGenerator()
    print(next(gen))
    print(gen.send("I am Value"))
    

    代码分析,
    MyGenerator里,我们一共用了两次yield
    比较奇怪的是第一个yield的语句,value=yield 1。如果没看过这一语句的,肯定不知道next回到yield后,其实是有一个值的。

    到这,我们先不急,运行结果,

    [penx@ali01 python]$ ./gen_send.py 
    1
    I am Value
    [penx@ali01 python]$ 
    

    运行过程,
    next启动了生成器gen,知道到yield 1时返回1。

    然后我们再用gen的内部方法send进入gen,而且还带回来一个值“I am Value”。这时候,继续执行yield 1后的代码“value=”,把带回来的值“I am Value”赋给value。直到遇到yield value,把value返回。


    其实,send和next的执行很像,只是send可以和生成器互动,传入一个值。


    生成器的启动需要next

    大家有没有想过,如果生成器还没启动过,就用send,会怎样?我们来试一下。
    代码,

    #!/usr/bin/python3
    
    def MyGenerator():
            value=yield 1
            yield value
            return done
    
    gen=MyGenerator()
    print(gen.send(3))
    

    运行,

    [penx@ali01 python]$ ./gen_send.py 
    Traceback (most recent call last):
      File "./test.py", line 9, in <module>
        print(gen.send(3))
    TypeError: can't send non-None value to a just-started generator
    [penx@ali01 python]$ 
    

    结果,
    报错,

    > TypeError: can’t send non-None value to a just-started generator
    

    说生成器刚启动时,不能send一个不为None的值。

    小结,
    所以呢,我们在用生成器时,第一次要用next启动


    生成器启动可用send(None)

    其实上面报错已经说了,can’t send non-None value
    所以啊,我们可以用send(None)来启动生成器。
    代码,

    #!/usr/bin/python3
    
    def MyGenerator():
            value=yield 1
            yield value
            return done
    
    gen=MyGenerator()
    print(gen.send(None))
    print(gen.send(3))`</pre>
    
    运行,
    
    [penx@ali01 python]$ ./gen_send.py 
    1
    3
    [penx@ali01 python]$
    
    结果, 
    正常运行。
    

    相关文章

      网友评论

        本文标题:python 生成器 send()方法简介

        本文链接:https://www.haomeiwen.com/subject/uegryqtx.html