1、简单理解生成器
那什么是迭代器?
我们可以理解为我们平时做一件事的步骤。比如我们泡茶:
首先,得去煮水。
然后,拿出茶具,和茶叶
接着,水开了,就开始泡茶
最后,就是品茶了。假如我们定义了一个泡茶的函数(迭代器),然后将泡茶步骤的方法封装进这个函数。每一次调用这个函数就返回一个步骤,并保存好当前执行到哪个状态。如果中途有事,比如我们执行到步骤二的时候突然去接了个电话,回来调用这个函数就会得到步骤三(水开了,就开始泡茶),也就是状态保存好了。我们可以执行这个泡茶函数直到调用完所有步骤为止。
定义一个方法,这个方法是一步步执行的,并能保存状态,这就是迭代器。回到上面上面第二种访问方法中,到第六个print(next(gen))时,系统告诉我们Traceback (most recent call last): StopIteration。也就是gen迭代到最后了,无法继续迭代了。
以上摘自https://blog.csdn.net/weixin_37720172/article/details/78482291
2、细看生成器执行步骤
#-*-coding:UTF-8-*-
def simple_generator():
x=1
yield x #第一次调用next(),执行到这里就停下,返回x
x+=1
yield x #第二次调用next(),从上次停下的地方继续执行到这里
yield x
obj=simple_generator()#当你调用这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象
print next(obj)
print next(obj)
print next(obj)
print next(obj)
当你调用simple_generator()这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象,而且这个对象可迭代,就是可以用 for x in 对象 的结构
第一次next()后: (绿色部分为已经执行部分)(红色部分为未执行部分)
- def simple_generator():
x=1
yield x #第一次调用next(),执行到这里就停下,返回x
x+=1
yield x #第二次调用next(),从上次停下的地方继续执行到这里
yield x- 第二次next():
- def simple_generator():
x=1
yield x #第一次调用next(),执行到这里就停下,返回x
x+=1
yield x #第二次调用next(),从上次停下的地方继续执行到这里
yield x- 第三次next():
- def simple_generator():
x=1
yield x #第一次调用next(),执行到这里就停下,返回x
x+=1
yield x #第二次调用next(),从上次停下的地方继续执行到这里
yield x- 第三次next():已经没有输出了,这说明生成器只能遍历一次!