生成器内容

1,生成器
    生成器的本质就是迭代器
    生成器的特点和迭代器一样,取值方式和迭代器一样(__next__(),send():给上一个yield传值)
    生成器一般有生成器函数或者生成器表达式来创建
    其实就是手写的迭代器

2,生成器函数
    和普通函数没有区别,里面有yield的函数就是就是生成器函数
    生成器函数在执行的时候,默认不会执行函数体,返回生成器
    通过生成器的__next__()分段执行这个函数
    send()给上一个yield传值,不能在开头的位置(没有上一个yield),最后一个yield也不可以用send()
3,推导式
    1,列表推导式 [结果, for循环, 条件筛选]
    2,字典推导式 {k:v, for循环, 条件筛选}
    3,集合推导式 { k ,for循环,条件筛选]
4,生成器表达式
    (结果  for循环  条件)
    特点:
        1,惰性机制
        2,只能向前
        3,节省内存

 

1,
def
func(): print(111) yield 222 yield 333 g = func() #获取生成器 g1 = (i for i in g) #生成器 g2 = (i for i in g1) #生成器 print(list(g2)) # 111 \n [222,333] 源头,从源头把数据拿走了 print(list(g1)) # [] 这里执行的时候,源头已经没有数据

 

2,很坑的面试题
def add(a,b):       #求和
    return a+b

def test():         #生成器函数 0,1,2,3
    for i in range(4):
        yield i
g = test()          #获取生成器
for n in [2,10]:   #到最后才放数据(惰性)
    g = (add(10,i)for i in g) 
 #此时的g是一个生成器,实际上内部并没有被执行
  相当于以下代码:
    n = 10
    g = (add(n, i) for i in g)
    g = (add(n, i) for i in g)
print(list(g))      # [20, 21, 22, 23] 此时才会动生成器


  

posted @ 2018-08-13 16:31  傻白甜++  阅读(459)  评论(0编辑  收藏  举报
TOP