很多同学无论是在学习python还是使用python的过程中,都会遇到yield关键字,这个让人头大的问题,今天,就给大家分享一下我自学yield的心路历程
基本概念:
(1)在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
(2)迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器
用人话讲就是,凡是函数中用到yield的函数便与众不同,改名为生成器,而一个函数里面如果用到yield,那么返回的结果就是一个可以迭代的生成器(generator),便可以通过for循环或者是next.方法实现遍历。
def fab(max): #定义函数名为fab的函数
n, a, b = 0, 0, 1 #分别给n,a,b赋值
while n < max:
yield b # 使用 yield
# print b
a, b = b, a + b
n = n + 1
for m in fab(5):
print m
上面展示的是用yield实现斐波那契数列数列的经典代码,从这个代码讲起。
for m in fab(5)为遍历fab(5)中的每一个元素,这里fab(5),已经不再是一个一般意义上的函数,因为有yield的使用,使其成为一个生成器,因而具有可迭代性。这一点非常重要,一定要从return的函数思想里剥离出来。
下面,进行程序的实现。
再一次强调,这里的fab(5)已经不是单纯意义上的函数了,成为了一个可以迭代的生成器,我们要做的是用for循环实现遍历。
首先执行for循环,进行第一次循环,注意,在调用fab(5)时,python解释器将其视为一个生成器,而开始for循环时,执行函数内部的代码,n=0,a=0,b=1,0<5,成立,执行yield b,这时,返回迭代值b,即1,中断
下面从上次yield中断的地方开始,向下执行代码,a=1,b=1,n=1,继续,再次遇到yield,返回b的值,1,中断
如此进行下去
1
1
2
3
5
而用next方法实现会更便于对比理解
>>>f = fab(5)
>>> f.next()
1
>>> f.next()
1
>>> f.next()
2
>>> f.next()
3
>>> f.next()
5
>>> f.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration