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语句即可。

     

     

  • 相关阅读:
    从Oracle提供两种cube产品说开
    Sql Server DWBI的几个学习资料
    Unload Oracle data into text file
    初学Java的几个tips
    我常用的Oracle知识点汇总
    benefits by using svn
    如何在windows上使用putty来显示远端linux的桌面
    building commercial website using Microsoft tech stack
    Understand Thread and Lock
    Update google calendar by sunbird
  • 原文地址:https://www.cnblogs.com/MrSaver/p/10591034.html
Copyright © 2011-2022 走看看