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))

浙公网安备 33010602011771号