python-生成器
# 生成器 —— 迭代器
作用
内存使用更加高效
# 生成器函数
yield与return不能共用且需要写在函数内
# 含有yield关键字的函数都是生成器函数
# 生成器函数的特点
#调用之后函数内的代码不执行,返回生成器
#每从生成器中取一个值就会执行一段代码,遇见yield就停止。
#如何从生成器中取值:
# for :如果没有break会一直取直到取完
# next :每次只取一个
# send :不能用在第一个,取下一个值的时候给上个位置传一个新的值
# 数据类型强制转换 :会一次性把所有数据都读到内存里
生成器函数与一般函数的不同
生成器函数包含一个或者多个yield
当调用生成器函数时,函数将返回一个对象,但是不会立刻向下执行
像__iter__()和__next__()方法等是自动实现的,所以我们可以通过next()方法对对象进行迭代
一旦函数被yield,函数会暂停,控制权返回调用者
局部变量和它们的状态会被保存,直到下一次调用
函数终止的时候,StopIteraion会被自动抛出
1 def generator(): 2 print(1) 3 n = yield 2 4 print(n) 5 print(3) 6 arg = yield 7 8 9 g = generator() 10 print('gg ' + str(g.__next__())) 11 print('gg ' + str(g.send('hahaha'))) 12 13 14 # send 获取下一个值的效果和next基本一致 15 # 只是在获取下一个值的时候,给上一yield的位置传递一个数据 16 # 使用send的注意事项 17 # 第一次使用生成器的时候 是用next获取下一个值 18 # 最后一个yield不能接受外部的值
1 # 获取移动平均值 2 def averager(): 3 sum = 0 4 count = 0 5 avg = 0 6 while True: 7 sum += yield avg 8 count += 1 9 avg = sum / count 10 11 12 g = averager() 13 print(g.__next__()) 14 print(g.send(12)) 15 print(g.send(22)) 16 17 18 # 预激生成器的装饰器 19 def decorator_init(fun): 20 def inner(*args, **kwargs): 21 g = fun(*args, **kwargs) 22 g.__next__() 23 return g 24 25 return inner 26 27 28 @decorator_init 29 def averager(): 30 sum = 0 31 count = 0 32 avg = 0 33 while True: 34 sum += yield avg 35 count += 1 36 avg = sum / count 37 38 39 g = averager() 40 print(g.send(10)) 41 print(g.send(11))
1 # yield from 2 def generator(): 3 a = '1234' 4 for i in a: 5 yield i 6 7 8 def generator2(): 9 a = '1234' 10 yield from a # 同 for i in a: yield i 11 12 13 for i in generator(): 14 print(i) 15 16 for i in generator2(): 17 print(i)
# 生成器表达式
# (条件成立想放在生成器中的值 for i in 可迭代的 if 条件)
(x for x in range(5))
# 列表推导式
[x for x in range(5)]
# 字典推导式
1 # 字典推导式 2 # 例一:将一个字典的key和value对调 3 dic = {'k1': 'v1', 'k2': 'v2'} 4 dic_ = {dic[k]: k for k in dic} 5 print(dic_) 6 7 # 例二:合并大小写对应的value值,将k统一成小写 8 mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3} 9 dic = {k.lower():mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase} 10 print(dic)
# 集合推导式(无序,自带去重功能)
1 # 集合推导式 2 # 例:计算列表中每个值的平方,自带去重功能 3 squared = {i**2 for i in {1,2,1,4,-1}} 4 print(squared)