zoukankan      html  css  js  c++  java
  • python 3 协程函数

    python 3 协程函数

    1:把函数的执行结果封装好__iter__和__next__,即得到一个迭代器

    2:与return功能类似,都可以返回值,但不同的是,return只能返回一次值,而yield可以返回多次值

    3:函数暂停与再继续的状态是由yield保存的

     def func(count):
    
        print('start')
    
        while True:
    
            yield count
    
            count+=1
    
    g=func(10)
    
    print(next(g))
    
    print(next(g))
    
    使用了yield表达式形式
    
    def eater(name):
    
        print('%s 说:我开车啦' %name)
    
        while True:
    
            food=yield   #默认返回为空,实际上为x=yield None
    
            print('%s eat %s' %(name,food))
    
     
    alex_g=eater('alex')
    
    print(alex_g)
    
     
    结果:
    
    generator object eater at 0x000000000271B200
    
    alex 说:我开车啦

     yield表达式形式要先运行next(),让函数初始化并停在yield,相当于初始化函数,然后再send() ,send会给yield传一个值 ** next()和send() 都是让函数在上次暂停的位置继续运行,next是让函数初始化,send在触发下一次代码的执行时,会给yield赋值

     def eater(name):
    
        print('%s 说: 我开动啦' %name)
    
        food_list=[]
    
        while True:
    
            food=yield  food_list
    
            food_list.append(food)  # ['骨头','菜汤']
    
            print('%s eat %s ' % (name,food))
    
    alex_g=eater('alex')
    
    next(alex_g)  #让函数初始化,等同于alex_g.send(None)

    # next(alex_g)  #让函数初始化,等同于alex_g.send(None) 如果注释这行运行时会报错: TypeError: can't send non-None value to a just-started generator

    #第二阶段:给yield传值

    print(alex_g.send('骨头')) # #1 先给当前暂停位置的yield传骨头 2 继续往下执行,直到再次碰到yield,然后暂停并且把yield后的返回值当做本次调用的返回值

    print(alex_g.send('肉包子'))

    print(alex_g.send('菜汤'))

     使用装饰器初始化

     1 def init(func):
     2     def wrapper(*args,**kwargs):
     3         res = func(*args,**kwargs)
     4         next(res)  # 初始化next操作,
     5         return res
     6     return wrapper
     7 @init
     8 def eater(name):
     9     print('%s 说: 我开动啦' %name)
    10     food_list=[]
    11     while True:
    12         food=yield  food_list
    13         food_list.append(food)
    14         print('%s eat %s ' % (name,food))
    15 
    16 g = eater('alex')
    17 print(g.send('骨头'))
    View Code
  • 相关阅读:
    python 学习
    快速排序
    U3D AStar 案例
    U3D AStar 算法原理
    .net core 实时通讯
    .net 算法复杂度
    U3D MVC 背包案例
    U3D 对象池
    Unity网络基础(NetWork)
    U3D Socket实现简易通讯
  • 原文地址:https://www.cnblogs.com/qiangyuge/p/7277235.html
Copyright © 2011-2022 走看看