生成器进阶:
send:
移动平均值
利息 7日化平均利率
年化收益
求平均值 总值/个数
send:
首先:send和next工作的起止位置是完全相同的
send可以把一个值作为信号量传递到函数中去
在生成器执行伊始,只能先用next
只要用send传递参数的时候,必须在生成器还有一个未被返回的yield
def func(): print(123) value = yield 1 这里的yield遇到了send就传入了send中的值然后赋给了value print(456) value2=yield '***'+value+'***' 这里的value就是send中的值了,send后面一定要有yield来标志结束 yiled g = func() print(next(g)) print(g.send('aaa')) prin(g.send('bbb'))
移动平均值
def average_func(): total = 0 count = 0 average = 0 while True : value = yield average total += value count +=1 average = total/count g = average_func() print(next(g)) print(g.send(30)) print(g.send(20))
生成器中的激活 next方法可以用装饰器
生成器中取值:
next
for
list
列表推导式:
for i in [1,3,5]: new_l.append(i*i) print(new_l) #等同于: print([i*i for i in [1,3,5]]) #用range写练习: print([i//2 for i in range(0,7,2)]) #i后面加两个杠是整除 print([egg%d%i for i in range(10)]) #生成器表达式: #就是把中括号改成小括号 a = ('egg%d%i for i in range(10)) print(a) #生成器推导式一个一个拿,列表推导式是一下全拿出来。 print([i for i in range(30) if i%3==0]) #3整除的30以内的 print([i*i for i in range(30) if i%3==0]) #3整除的30以内的平方 li = ['alex',['ueei','sfeef'],'opii'] print([o for i in li if type(i)==list for o in i]) #嵌套列表里面含有两个e的
字典推导式:
#value可以作为key mcase = {'a': 10, 'b': 34} mcase_frequency = {mcase[k]: k for k in mcase} print(mcase_frequency) #合并大小写对应值 mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3} mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase.keys()} print(mcase_frequency)
集合推导式:
自带去重
列表推导式[]-生成器表达式()
尽量让推导式简化操作,增强代码可读性
如果推导式过于复杂,应该转换成普通的python代码
所有的列表推导式都可以转换成生成器表达式,并且应该在代码中尽可能多使用生成器表达式而不是列表推导式
在代码里,多层嵌套的for循环是禁忌----会 大幅度增加代码的复杂度