##生成器
#在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
'''