什么是生成器
我们知道的迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行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))