zoukankan      html  css  js  c++  java
  • python3 yield表达式形式应用

    我们已知:
      生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器
    yield的功能:
      1.与return类似,都可以返回值,但不一样的地方在于yield返回多次值,而return只能返回一次值
      2.为函数封装好了__iter__和__next__方法,把函数的执行结果做成了迭代器
      3.遵循迭代器的取值方式obj.__next__(),触发的函数的执行,函数暂停与再继续的状态都是由yield保存的

    yield的表达式:
      x = yield  将yield的值传给x,那么yield的值哪里来?用send( )传入
    send的效果:
      1:先从为暂停位置的那个yield传一个值,然后yield会把值赋值x
      2:与next的功能一样
    
    
    def init(func):    # 此装饰器给foo()函数做初始化,next(g)停留在yield。
        def wrapper(*args,**kwargs):
            g=func(*args,**kwargs)
            next(g)
            return g
        return wrapper
    
    @init #foo=init(foo)
    def foo():
        print('starting')
        while True:
            x=yield None#return 1
            print('value : ',x)
    
    g=foo() #wrapper()
    
    g.send(2)  # 然后用g.send(2)传值给yield,执行顺序为:send()传值给yield,yield传值给x,然后执行next()的功能。

    练习: 食客吃饭上菜
    def init(func):
        def wrapper(*args, **kwargs):
            g = func(*args,**kwargs)
            next(g)
            return g
        return wrapper
    
    @init
    def eater(name):
        print('%s start to eat' %name)
        food_list= []
        while True:
            food=yield food_list
            food_list.append(food)
            print('%s start to eat %s' %(name, food))
    
    def make_food(people,n):
        for i in range(n):
            people.send('food%s' %i)
    
    e = eater('alex')
    make_food(e,5)
    

      

     
     
  • 相关阅读:
    SQL关键字的执行顺序
    StructuredStreaming基础操作和窗口操作
    StructuredStreaming简单的例子(NewAPI)
    StructuredStreaming(New)
    StructuredStreaming编程模型
    SparkStreaming简单例子(oldAPI)
    SparkStreaming架构
    Storm与SparkStreaming对比
    SparkStreaming-DStream(Discretized Stream)
    史上最全的java随机数生成算法分享(转)
  • 原文地址:https://www.cnblogs.com/lucaq/p/7067315.html
Copyright © 2011-2022 走看看