生成器进阶#send的获取下一个值的效果和next基本一致,
#只不过在获取下一个值的时候,给上一个值的位置穿第一个数据
使用send的注册事项:
#第一次使用生成器的时候,必须用next获取下一个值
#最后一个yield不能接受外部的值
def generator(): print(123) content = yield 1 print('======',content) print(456) yield 2 g = generator() ret = g.__next__() print('***',ret) ret = g.send('hello') #send的效果和next一样 print('@@@',ret) 123 *** 1 ====== hello 456 @@@ 2
生成器进阶实例
def average(): sum = 0 count = 0 avg = 0 while True: num = yield avg #10 sum +=num #10 count +=1 #1 avg = sum/count avg_g = average() avg_g.__next__() avg1 = avg_g.send(10) print(avg1) avg2 = avg_g.send(20) print(avg2)
#yield from 从一个容器取出并且一个一个接收到
def generator(): a = 'abcde' b = '12345' yield from a #===for i in a: yield i yield from b #===for i in b: yield i g = generator() for i in g: print(i) a b c d e 1 2 3 4 5
# send
# send的作用范围和next一模一样
# 第一次不能用send
# 函数中的最后一个yield不能接受新的值
# 计算移动平均值的例子
# 预激生成器的装饰器的例子
# yield from
#生成器表达式和列表推导式
egg_list=['鸡蛋%s'%i for i in range(10)] #列表推导式 print(egg_list) print([i*2 for i in range(10)]) #生成器表达式 g = (i for i in range(10)) print(g) for i in g: print(i)
#括号不一样
#返回值不一样=====几乎不占用内存
各种推导式
# [每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型]
# [满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件]
#30以内所有能被3整除的数
ret = [i for i in range(30) if i%3==0] print(ret)
#30以内所有能被3整除的数的平方
ret = [i*i for i in range(30) if i%3==0] print(ret)
#找到嵌套列表中名字含有2个e的所有名字
names = [['tim','tom','cc','andreeew'],['alice','eeenn']] ret = [name for lst in names for name in lst if name.count('e')>=2] print(ret)
#字典推导式
# mcase = {'a':10,'b':34}
# # 将一个字典的key和value对调
# mcase = {'a':10,'b':34}
# mcase_frequency = {mcase[k]:k for k in mcase}
# print(mcase_frequency)
# 合并大小写对应的value,将k统一成小写
# 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)
#集合推导式
#例:计算列表中每个值的平方,自带去重功能
squared = {x**2 for x in [1, -1, 2]} print(squared) # Output: set([1, 4])