生成器进阶:

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

posted on 2017-09-05 15:04  Symoon_g  阅读(189)  评论(0编辑  收藏  举报