##生成器
#在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) #<generator object <genexpr> 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) ##<generator object generator at 0x0000020DBAC8A0F8> print(ret.__next__()) #1 a print("==============") 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 a ret = g.__next__() print(ret) #2 b ret = g.__next__() print(ret) #c #娃哈哈%i def wahaha(): for i in range(2000000): yield '娃哈哈%s'%i g = wahaha() g1 = wahaha() print(g.__next__()) #g和g1没有关系 print(g1.__next__()) g = wahaha() count = 0 for i in g: count +=1 print(i) if count > 50: break print('*******',g.__next__()) for i in g: count +=1 print(i) if count > 100: break def demo(): for i in range(4): yield i g=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 i g = test1() print(g.__next__()) #1 print(g.__next__()) #2 def test2(): for i in range(5): yield "编号%s"%i g1 = test2() print(g1.__next__()) print(g1.__next__()) print("==========") for i in g1: print(i) #结果 ''' 编号0 编号1 ========== 编号2 编号3 编号4 '''