yield and Iterator

Generator(生成器)

生成器是特殊的迭代器,迭代器不一定是生成器。

生成器与迭代器均是可迭代对象。

目前学习阶段,有两种方式可以生成一个生成器,一是利用生成式表达式,二是在函数定义中使用yield关键字

  • 生成式:

L = [x*x for x in range(1,10)] 此条语句生成的是一个list对象。

L = (x*x for x in range(1,10)) 生成一个generator对象。

  • 函数定义:

生成一个斐波那契数列

def fib(max):
    a,b,n = 0, 1, 0
    while n < max:
        yield b
        a,b = b,a+b
        n = n + 1
    return 'done'

执行g = fib(6),g得到的是一个生成器对象,其中还没有值,只有在调用时才会计算相应的值。

yield

  • 函数定义中出现yield,则函数不再是普通函数,而是一个generator

函数执行方式改变:

  • 函数定义后只存储算法,只返回一个generator对象,只有在调用时才计算

  • 每次调用next()时执·行,遇到yield则返回yield后面的内容

  • 再次调用next()时,函数从上次返回的yield语句处开始执行,遇到下一个yield返回

  • 如果下面已无yield,再次调用next(),会报错StopIteration

  • 也可以通for来迭代generator对象,其相当于一个个next(),一直到最后一个yield为止

Itreator (迭代器对象)

首先,什么是Iterable(可迭代对象),list,str,tuple,set,dict等都是Iterable,即可以通过for循环来遍历的对象,整数123不是可迭代对象

那什么是迭代器对象呢,不但可以用for循环迭代,还可以通过不断调用next()返回下一个值的对象,称为迭代器,(Iterator)

  • 迭代器持有一个内部状态的字段,它不会一次性把所有元素加上在到内存,只是在需要时才生成返回结果。

  • 可以通过iter()函数将可迭代对象Iterable转化为Iterator对象。

  • 通过list()函数可以将遍历迭代器对象

你可能感兴趣的:(yield and Iterator)