生成器:
通过列表⽣成式,我们可以直接创建⼀个列表。但是,受到内存限制,列表容量肯定是有限的。⽽且,创建⼀个包 含100万个元素的列表,不仅占⽤很⼤的存储空间,如果我们仅仅需要访问前⾯⼏个元素,那后⾯绝⼤多数元素占 ⽤的空间都⽩⽩浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推 算出后续的元素呢?这样就不必创建完整的list,从⽽节省⼤量的空间。在Python中,这种⼀边循环⼀边计算的机 制,称为⽣成器:generator。
1. 节约内存
2. 迭代到下⼀次的调⽤时,所使⽤的参数都是第⼀次所保留下的,在整个所有函数调⽤的参数都是第⼀次所调⽤时保 留的,⽽不是新创建的
#列表生成式 列表生成的表达式 #list1=[0,1,2,3,4,5] 没有用生成器 创建一个列表 list1=[x for x in range(1,10)] #列表生成式 print(list1) #无法解决内存受限的问题 #生成器: 里边式一个对象 保存了产生元素的算法,同时会记录游标的位置 (游标)输出到第几个数值 #创建一个生成器:(两种方法) #1.通过列表生成式创建 #2.通过函数来创建一个生成器 (yield) #遍历生成器中的元素内容(4种方法) #1.通过next(g) 可能会抛异常 stopiteration 当生成器中已经没有数值 而程序还在继续输出时会抛出异常 #2.通过for 循环来遍历 #3.object内置的__next__ 可能会抛异常 stopiteration 当生成器中已经没有数值 而程序还在继续输出时会抛出异常 #4.send 函数遍历生成器对象 生成器的第一个值必须使用send(None),后面的就没有限制了 g=(x for x in range(1,10)) #print(next(g)) #print(next(g)) #print(next(g)) #print(next(g)) #print(next(g)) #for i in g: # print(i) g2=(x for x in range(10) if x%2==0) print(next(g2)) print(next(g2)) print(next(g2)) print(next(g2)) print(next(g2)) print(next(g2)) print(next(g2))
--------------------------------------------------------------------------------------------------------------------------------
def test1(times): #初始化 a,b=0,1 n=0 while n<times: #tield 一般用于创建一个生成器 返回后面的变量值给生成器 yield b #print(b) #B就式斐波拉且数列中的一元素 a,b=b,(a+b) n+=1 return "done" #print(test1(6)) #前6个斐波拉且数 g=test1(6) print(g) print(next(g)) def test2(): #初始化 a,b=0,1 while True: #tield 一般用于创建一个生成器 返回后面的变量值给生成器 temp=yield b #print(b) #B就式斐波拉且数列中的一元素 a,b=b,(a+b) print(temp)#输出None return "done" g1=test2() print(g1) #print(next(g1)) #print(g1.__next__()) #__next__第3中遍历生成器的方法 print(g1.send(None)) print(g1.send('')) print(g1.send('')) print(g1.send('')) print(g1.send('')) print(g1.send(''))