生成器

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.节省内存

原文地址:https://www.cnblogs.com/s593941/p/9469992.html