一.生成器
生成器的本质就是迭代器
生成器的特点和迭代器一样,取值方式和迭代器一样__next__(),send():给上一个yield.
生成器一般由生成器函数或者生成器表达式创建,其实就是手写的迭代器.
def func(): print("111") yield 222gener = func() #这个时候函数不会执行,而是获取生成器ret = gener.__next__() #这个时候函数才会执行,yield的作用和return一样,也是返回数据print(ret)结果:111222
yield和return的效果是一样的,区别是yield是分段来执行一个函数,return是直接停止执行函数
二.生成器函数
和普通函数没有区别,里面有yield的函数就是生成器函数.
生成器函数在执行的时候,默认不会执行函数体,返回生成器. 通过生成器的__next__()分段执行这个函数. send()给上一个yield传值,不能在开头(没有上一个yield),最后一个yield也不可以用send()
send 和__next__()区别:
1.send和next()都是让生成器向下走一次
2.send可以给上一个yield的位置传递值,不能给最后一个yield发送值,在第一次执行生成器代码的时候不能使用send()
生成器可以使用for循环获取内部元素.
三.推导式.
1.列表推导式[结果 for循环 条件筛选]
2.字典推导式 {k:v for循环 条件筛选}
3.集合推导式{k for 循环 条件}
四.生成器表达式
(结果 for 循环 条件) 特点: 1.惰性机制 2.只能向前 3,节省内存
生成器表达式和列表推导式的区别:
1.列表推导式比较耗内存,一次性加载,生成器表达式几乎不占内存,使用的时候才分配和使用内存.
2.得到的值不一样.列表推导式得到的是一个列表,生成器表达式获得的是一个生成器