##生成器 #在Python中,这种.边循环.边计算的机制,称为生成器:generator。 #不必创建完整的list,从⽽节省⼤量的空间 # 要创建⼀个⽣成器,有很多种⽅法。第⼀种⽅法很简单,只要把⼀个列表⽣成式的[] 改成() L = [x for x in range(5)] print(L) #[0, 1, 2, 3, 4] L = (x for x in range(5)) print(L) #at 0x000001F2736538E0> print(next(L)) #0 print(L.__next__()) #1 print(L.__next__()) #2
#生成器函数# Python中提供的生成器:# 1.# 生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行# 2.# 生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表## 生成器Generator:# 本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)# 特点:惰性运算, 开发者自定义def generator(): print(1) return 'a'ret = generator()print(ret) #1 a#只要含有yield关键字的函数都是生成器函数# yield不能和return共用且需要写在函数内def generator(): print(1) yield 'a'# #生成器函数 : 执行之后会得到一个生成器作为返回值ret = generator()print(ret) ##print(ret.__next__()) #1 aprint("==============")def generator(): print(1) yield 'a' print(2) yield 'b' yield 'c'g = generator()# for i in g:# print(i)print("||||||||||||")ret = g.__next__()print(ret) #1 aret = g.__next__()print(ret) #2 bret = g.__next__()print(ret) #c#娃哈哈%idef wahaha(): for i in range(2000000): yield '娃哈哈%s'%ig = wahaha()g1 = wahaha()print(g.__next__()) #g和g1没有关系print(g1.__next__())g = wahaha()count = 0for i in g: count +=1 print(i) if count > 50: breakprint('*******',g.__next__())for i in g: count +=1 print(i) if count > 100: breakdef demo(): for i in range(4): yield ig=demo()g1=(i for i in g)g2=(i for i in g1)print(list(g1)) #[0, 1, 2, 3]print(list(g2)) #[]
def test1(): list1 = [1,2,3,4,5,6] for i in list1: yield ig = test1()print(g.__next__()) #1print(g.__next__()) #2def test2(): for i in range(5): yield "编号%s"%ig1 = test2()print(g1.__next__())print(g1.__next__())print("==========")for i in g1: print(i)#结果'''编号0编号1==========编号2编号3编号4'''