#一边循环,一边计算的机制,称为生成器generator。generator保存的是算法,可推算出列表中的某个元素值,可节省大量的存储空间
#生成器:只有在调用的时候才会生成相应的数据。只记录当前位置。
#只有一个__next__()方法
#要把函数变成生成器,只需把print命令改为:yield命令即可
#如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。
#函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用__next__()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
#生成器不能像普通的列表一样,通过下标或者切片的方式去取。生成器只能通过循环或者__next__()方法去取。
#创建生成器方法一:
generator1 = (i*2 for i in range(100)) #与列表很相似,只是把[]改成为()。如果在Pyton命令行执行,将返回内存地址
for i in generator1:
print(i)
###或者将for循环改用以下命令一个个的输出:
print(generator1.__next__()) #读取第一个元素值
print(generator1.__next__()) #读取第二个元素值
print(generator1.__next__()) #只能往后读取,不能往前
print(generator1.__next__()) #读取到最后一个值时,抛出StopIteration的错误。
###################################
#创建生成器方法二:
def odd():
print("step 1")
yield 1 #执行过程中,遇到yield执行后就中断。后面的数值为可选的返回值
print("step 2")
yield 3
print("step 3")
yield 5
o = odd()
o.__next__()
o.__next__()
o.__next__()