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