什么是生成器
我们知道的迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器有的好处是可以节省呢内存。如果在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫做生成器。
python中提供的生成器:
1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行。
2.生成器表达式:类似于列表推到,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。
-
通过生成器函数写
-
生成器表达式
#生成器函数: def func1(x): x+=1 yield x g=func1(5)#生成器对象 g.__next__()#一个next对应一个yield,到yield停止 #yield将值返回给.__next__()
-
return结束函数,给函数的执行者返回值
-
yeild不会结束函数 ,一个next对应一个yield
生成器和迭代器的区别
-
内存级别的区别
-
迭代器是需要可迭代对象进行转化。可迭代对象非常占内存
-
生成器直接创建,不需要转化。从本质就节省内存
-
send 与next
def func1(): print(1) count = yield 6 print (count) print(2) yield 7 print(3) yield 8 g = func1() print(next(g)) print(g.send('alex')) print(next(g)) #send 与 next一样,也是对生成器取值(执行一个yield)的方法。 #send 可以给上一个yield传一个值 #send的坑:1.第一个值永远是next 2.最后一个yield永远得不到send传的值
一行代码几乎搞定你需要的任何的列表
-
循环模式[变量(加工后的变量)for 变量 in iterable]
l = [i for i in range(1,101)] print(l)
筛选模式
l3 =[i for i in range(1,31)ifi%==0]
-
优点:一行解决,方便
缺点:容易着迷,只能构建相对的列表 ,不易排错 不能超过三次循环,
生成器表达式:将列表表达式【】换成()
g = (i for i in range(100)) print(g) print(next(g))