day15 send用法 列表推导式,生成器表达式

send
1.send和next工作的起止位置是完全相同的
2.send可以把一个值作为信号量传递到函数中去
3.在生成器执行开始,只能用next
4.只要用send传递参数的时候,必须在生成器中还有一个未被返回的yield

例:移动平均值
首先我们要先写一个生成器预激装饰器

def wrapper(func):
    def inner(*args,**dwargs):
        ret = func(*args,**dwargs)
        ret.__next__()
        return ret
    return inner
@wrapper
def average_func():
    average = 0
    num = 0
    total = 0
    while True:
        val = yield average
        total += val
        num += 1
        average = total/num
g = average_func()
print(g.send(20))
移动平均值

 

列表推导式

new_l = []
for i in [1,3,5]:
    new_l.append(i*i)
print(new_l)



print([i*i for i in [1,3,5]])  #结果必须是一个列表

生成器表达式  ——  节省内存,简化代码

laomuji = ('egg%d'%i for i in range(10))
print(laomuji)
#30以内能被3整除的数 [0,1,2,3,4,5,6]  = [0,3,6]
print([num for num in range(30) if num%3 == 0])

 

# 列表推导式[] - 生成器表达式()
# 尽量让推导式简化你的操作,增强代码的可读性
# 如果推导式过于复杂了,应该转换成普通的python代码
# 所有的列表推导式都可以转换成生成器表达式,并且应该在代码中尽可能多使用生成器表达式而不是列表推导式

 

#在代码里 多层嵌套的for循环是禁忌 —— 会大幅度增加代码的复杂度

 

面试题:

步步是坑。
因为生成器的特性,所以 n = 5,

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test()
for n in [1,10,5]:
    g=(add(n,i) for i in g)
print(list(g))

 

posted @ 2017-09-05 16:21  mendax  阅读(61)  评论(0)    收藏  举报