1.生成器
1.生成器的本质就是迭代器
2.生成器的特点和迭代器一样,取值方式和迭代器一样(__next__())
send():给上一个yield传值,不能在开头(没有上一个yield),最后一个yield也不能用send()
3.生成器一般由生成器函数或者生成器表达式来创建
4.生成器就是手写的迭代器
2.生成器函数
1.和普通函数没有区别,里面有yield的函数就是生成器函数
2.生成器函数在执行的时候,默认不会执行函数体,返回生成器
3.通过生成器的__next__()分段执行这个函数
4.send()给上一个yield传值,不能在开头(没有上一个yield),最后一个yield也不能用send()
1 def func(): 2 print("abc") 3 yield 1 4 print("def") 5 gen = func()
return 和yield都可以返回数据,gen=func()不会执行函数,拿到的是生成器,执行生成器需要用__next__()
函数中如果有yield,这个函数就是生成器函数,生成器函数获取的是生成器
yield:相当于return,可以返回数据,但是yield不会彻底中断函数,而是分段执行函数
print(gen.__next__()) 执行函数,执行到下一个yield
print(gen.__next__()) 继续执行函数到下一个yield
1 def func(): 2 yield 1 3 yield 2 4 yield 3 5 yield 4 6 for i in func():#for的内部一定有__next__() 7 print(i)
8 print(list(func()))#内部有__next__()
3.推导式
1.列表推导式:[结果 for 循环 条件筛选]
例如:将100以内的偶数输出到一个列表中
1 lst = [i for i in range(100) if i % 2 == 0] 2 print(lst)
2.字典推导式:{k:v for循环 条件筛选}
例如:lst = [11,22,33,44] 输出{0:11,1:22,2:33,3:44}
1 lst = [11,22,33,44] 2 dic = {i:lst[i] for i in range(len(lst))} 3 print(dic)
3.集合推导式:{k for循环 条件}
1 lst = [1,1,2,2,3,3,4,4] 2 s = {el for el in lst} 3 print(s)
结果为:{1,2,3,4}
4.生成器表达式
生成器表达式使用(),由于元组不能增删改,所以没有元组推导式
(结果 for循环 条件)
1 tu = (i for i in range(1,10)) 2 print(tu)
执行出来的是一个生成器
如果要取值,使用__next__()
1 def func(): 2 print(111) 3 yield 222 4 yield 333 5 g = func()#生成器 6 g1 = (i for i in g)#生成器 7 8 g2 = func()#生成器 9 g3 = (i for i in g2)#生成器
10 print(list(g1)) #结果为111 222 333从源头把数据拿走
11 print(list(g3)) #如果没有第8行,执行结果为[],因为源头已经没有数据
生成器表达式的特点:
1.惰性机制
2.只能向前
3.节省内存