zoukankan      html  css  js  c++  java
  • Python:笔记(7)——yield关键字

    Python:笔记(7)——yield关键字

    yield与生成器

      所谓生成器是一个函数,它可以生成一个值的序列,以便在迭代中使用。函数使用yield关键字可以定义生成器对象。

    一个例子

      我们调用该函数,就会发现其中的代码不会开始执行

    def countdown(n):
        print('从%d开始减少'%n)
        while(n>0):
            yield n
            n-=1
        return
    
    countdown(10)
    

      相应的,该函数返回一个生成器对象。接着该生成器对象就会在__next__被调用时执行函数,如:

    c = countdown(10)
    # <generator object countdown at 0x102d0b780>
    print(c.__next__())
    # 10
    print(c.__next__())
    # 9
    

      调用next时,生成器函数开始执行语句,直至遇到yield语句为止。yield语句在函数执行停止的地方生成一个结果,直至再次调用next。然后继续执行yield之后的语句。

    生成器的用法

      通常不会在生成器上直接调用next()方法,而是通过for语句,sum()或一些消耗序列的其他操作使用生成器。

    for n in countdown(5):
        print(n)
    
    print(sum(countdown(5)))
    

      

    协程与yield表达式

      在函数内,yield语句还可以作为表达式使用,出现在赋值运算符的右边,例如:

    def receiver():
        print('Ready to receive')
        while True:
            n = (yield)
            print(n)
    
    r = receiver()
    r.__next__()
    # Ready to receive
    r.send(1)
    # 1
    r.send(2)
    # 2
    r.send('Hello')
    # Hello
    

      以这种方式使用yield语句的函数称为协程,向函数发送值时函数将执行。接收到值后,协程就会执行语句,直至遇到下一个yield语句。

    说明:一开始必须先执行next函数,这样协程才能执行第一个yield表达式之前的语句

    关闭协程

      协程一般会不断地执行下去,除非被显式关闭或自己退出,显式关闭执行close语句即可。

     

     

  • 相关阅读:
    mysql show profiles 使用分析sql 性能
    面向对象三大特征---封装、继承、多态
    http_build_query用法,挺方便的
    请求数据
    多模匹配算法之Aho-Corasick
    php命名空间如何引入一个变量类名?
    MySQL错误:Can't connect to MySQL server (10060)
    Vim完全教程
    路由
    wireshark
  • 原文地址:https://www.cnblogs.com/MrSaver/p/10591034.html
Copyright © 2011-2022 走看看