有几天没更了,因为有事不在学校。今天接着上一篇文章继续。上一篇文章介绍了迭代器和生成器,重点在于:生成器自带buff——iter() 、next(),能够很自然的调用这些方法。接下来看看更加精彩的操作。
Method of Operation
正如我们在上一篇文章的介绍中详细阐述的那样,生成器提供了一种生成迭代器的便捷方法,这就是为什么它们被称为生成器的原因。
Method of working:
一个生成器被称为一个函数,它的返回值是一个迭代器,比如一个生成器对象。生成器的代码在这个阶段不会被执行。
迭代器可以通过调用next()方法来使用。第一次执行像一个函数,比如迭代器内的第一行代码,该代码将被执行,直到达到yield语句为止。
yield返回表达式的值,它跟随关键字yield。这就像一个函数,但是Python会跟踪这个yield的位置,并且为下一次调用存储局部变量的状态。
如果生成器主体完全工作,或者如果程序流遇到没有值的返回语句,迭代器工作完成。
我们将在下面的例子中说明这种行为,其中我们定义了一个生成器,它能够迭代所有斐波纳契数字。
Using a ‘return’ in a Generator
自Python 3.3以来,生成器也可以使用返回语句,但生成器仍然至少需要一个yield语句才能成为生成器!生成器内部的return语句相当于引发StopIteration()
让我们来看看引发StopIteration的生成器:
对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令.
send Method
生成器不仅可以发送对象,还可以接收对象。通过将发送方法应用于发生器对象,可以将消息(即对象)发送到发生器中。
我们必须首先调用生成器,因为生成器需要启动。发送到尚未启动的生成器会导致异常:
throw Method
用来向生成器函数送入一个异常,可以结束系统定义的异常,或者自定义的异常。throw()后直接跑出异常并结束程序,或者消耗掉一个yield,或者在没有下一个yield的时候直接进行到程序的结尾。
输出: