python的yield使用

在python中,yield被称之为generator(生成器)。

下面举个小例子来理解,yield在程序是怎么执行的

代码:

def func():
    print "begin"
    yield 1
    print "mid"
    yield 2
    print "end"
 
f = func()
f.next()  //1
f.next()  //2
f.next()  //3

f获得的是一个生成器(generator),next()每次都获取生成器中的下一个值。1的next会从函数的起始部分执行到第一个yield,也就是执行print “begin”和yield 1。所以语句1执行完输出begin,2执行完输出mid,3执行完输出end,并且会报错,报错是因为后面没有yield的了,当函数执行结束时,generator自动抛出StopIteration异常,表示迭代完成。在for循环里,无需处理StopIteration异常,循环会正常结束。

python的yield使用_第1张图片

--------斐波那契数列------

知道了生成器的一些概念后,下面来看另一个例子

对于斐波那契数列,我们很容易想到下面的实现形式:

# coding=utf-8
 
def fab(n):
    index, a, b = 0, 0, 1
    res = []
    while index < n:
        res.append(b)
        a, b = b, a + b
        index = index + 1
    return res
 
for n infab(5):
    print n

使用yield的话,可以改写成如下形式:

# coding=utf-8
 
def fab(n):
    index, a, b = 0, 0, 1
    while index < n:
        # res.append(b)
        yieldb
        a, b = b, a + b
        index = index + 1
 
for n infab(5):
    print n

打印结果同前面那个程序的,如下:

python的yield使用_第2张图片


原理就是第一次执行是从开始到yield b,yield b会返回b这个值。然后从后面执行到第二个yield b,以此类推。

 

------判断是否是generatorfunction------

使用isgeneratorfunction()函数判断一个函数是否是生成器函数

>>>from inspect import isgeneratorfunction
>>>isgeneratorfunction(fab)
True
 
>>>import types
>>>isinstance(fab, types.GeneratorType)
False
>>>isinstance(fab(5), types.GeneratorType)
True

区别fab和fab(5),fab是一个generatorfunction,而fab(5)是调用fab返回的一个generator

 

 

你可能感兴趣的:(python)