python学习day15 生成器进阶

时间:2021-08-24 19:15:55

生成器进阶:
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循环是禁忌----会 大幅度增加代码的复杂度