生成器和生成器表达式

一.生成器

生成器的本质就是迭代器

生成器的特点和迭代器一样,取值方式和迭代器一样__next__(),send():给上一个yield.

生成器一般由生成器函数或者生成器表达式创建,其实就是手写的迭代器.

def func():
    print("111")
    yield 222

gener = func() #这个时候函数不会执行,而是获取生成器
ret = gener.__next__() #这个时候函数才会执行,yield的作用和return一样,也是返回数据
print(ret)
结果:
111
222

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.得到的值不一样.列表推导式得到的是一个列表,生成器表达式获得的是一个生成器

posted @ 2018-08-13 15:20  不喜欢酸甜的刘青阳  阅读(123)  评论(0编辑  收藏  举报