生成器:
生成器的本质就是迭代器
生成器的特点和迭代器一样,取值方式一样(__next__()),会执行到下一个yield,如果找不到下一个会报错
生成器一般由生成器函数或者生成器表达式创建
生成器其实就是手写的迭代器
生成器函数:
return 和 yield都可以返回数据

def func():
yield 1

func() #不会执行函数,拿到的是生成器
gen = func()
ret = gen.__next__() #会执行到下一个yield
print(ret)

yield:相当于return,可以返回值,但是yield不会彻底中断函数,会分段执行函数
函数中如果有yield,这个函数就是生成器函数
生成器函数+() 获取生成器,不执行函数
gen.__next__() 执行函数,执行到下一个yield
gen.__next__() 继续执行函数到下一个yield,如果找不到下一个会报错

生成器的特点:
1,惰性机制
2,省内存
3,只能向前



send() : 里边必须要给一个参数
1, 和__next__()是一样的,可以执行到下一个yield,可以给上一个yield的位置传值


def func():
print('我是第一段')
a = yield 123
print(a)
print('第二段')
b = yield 456
print(b)
print('第三段')
c = yield 789
print(c)
print('最后一段')
yield 1111 # 最后收尾一定是yield

g = func()
print(g.__next__()) #没有上一个yield,所以第一个不能用send
print(g.send('haha'))
print(g.send('hehe'))
print(g.send('gege')) #没有下一个yield,所以最后一个不能用send

生成器可以用for循环获取每一个元素,for的内部一定有__next__()



推导式:
用一句话来生成一个列表
列表推导式语法:
[结果 for循环 判断]
字典推导式:
{k:v for循环 条件筛选}
集合推导式:
可以去重


lst = ['python'+str(i)+'' for i in range(1,16)]
print(lst)

dic = {"jj": "林俊杰", "jay": "周杰伦", "zs": "赵四", "ln":"刘能"}dic1 = {v:k for k,v in dic.items()}print(dic1)生成器表达式: 没有元组推导式,元组是不可变的,没办法增加 相关面试题def add(a,b): return a+bdef test(): for r_i in range(4): yield r_i g = test()for n in [1,10,5]: g = (add(n,i) for i in g ) print(list(g))n = 1 #没有取值g = (add(n,i) for i in g )n = 10 #没有取值g = (add(n,i) for i in g )n = 5 #循环到最后一次的时候开始取值,所以n = 5g = (add(n,i) for i in g )n = 5 的时候g = (add(n,i) for i in (add(n,i) for i in (add(n,i) for i in g ) ) ) #g = test()函数,取值范围是(0,1,2,3) 带入式子计算