简答描述下python里的生成器和装饰器。

生成器

yield from

yield from是3.3出现的 yield from iterable 是for item in interable yield item 形式的语法糖 从可迭代对象中一个个拿元素

def inc():
    for x in range(5):
        yield x
        
等价于
def inc():
    yield from range(5)
    
foo = inc()
print(foo())
def counter(n): #生成器,迭代器
    for x in range(n):
        yield x 
        
def inc(n):
    yield from counter(n)
    
foo = inc(10)
print(next(foo))

装饰器

一个装饰器,想要增强他的功能,能够输出被调用过以及调用的参数信息

def add(x, y):
    return x + y
#增强信息输出功能
def add(x, y):
    print("call add, x + y")  #输出到控制台
    return x + y
#缺点 耦合太高,加法属于业务功能,信息输出属于非业务代码不适合放在加法函数中。

装饰器语法糖

def logger(fn):
    def wrapper(*args,**kwargs):
        print('begin')
        x = fn(*args,**kwargs)
        print('end')
        return x
    return wrapper 
@logger #等价于add = logger(add)
def add(x,y):
    return x + y
    
print(add(45,40))

协程coroutine

比进程,线程轻量级,是在用户控件调度函数的一种实现,python3 asyncio 就是协程实现,已加入标准库,python3.5 使用async、await关键字直接原生支持协程

协程调度器实现思路

有两个生成器A、B,next(A)后,A执行到了yield语句暂停,然后去执行next(B),B执行到yield语句也暂停,然后再次调用next(A),再调用next(B), 周而复始,就实现了调度效果.