在列表生成式中其实我们可能会碰到很多的局限性,一般列表生成式都比较简洁,如果想要通过比较复杂的算法生成一个列表的时候,就很难写出语句了。
同时每次使用列表生成式时我们都使用了大量的内存,但是不妨我们使用一个现使用现算的式子来替代列表生成式,当使用这个列表的时候再自动计算生成。
这就是生成器(generator)。 列表生成式的[]换成()就是代表生成器的语法。
如果想一个一个使用元素,可以使用next()函数,接受一个iterator,取出其内容并递增。但其实大家很少这么使用,因为generator本身就是一个可以迭代的对象,所以我们不如直接使用for。
生成器里面的一些东西我感觉和iterator有很大的关系,next的调用也是,在循环中每次取出iterator的值然后递增(或是从yield开始向后执行函数)
注意,可以用*取用iterator中的内容,在取出内容之后自动递增迭代,而不需要next()。
注: 一些复杂的函数其实其逻辑和生成器是一样的,通过循环获得对应的值,在一个函数中如果有yield关键字那么它就是一个生成器函数(iterator function),yield关键字比较类似返回但是和return不同,函数每次运行到yield值就会返回yield对应的值然后中断,使用next()函数或者在for语句中迭代到下一个循环中才能够继续执行该函数,每次中断就是一层,类比于产生了一个元素。
>>> def fib(m): a, b, n = 0, 1, 0 while n < m: yield b #这里yield放在前面就是为了首先返回b的初始值 n+1才是迭代次数 a, b = b, a + b #yield后面的迭代的代码就是为了更新元素的值每使用一次更新一次 n += 1
>>> x = fib (10) >>> next(x) 1 >>> for i in x : print(i) 1 2 3 5 8 13 21 34 55
普通函数调用直接返回值,但是generator函数返回一个generator对象,后面学iterator可能会对这里的迭代有更好的理解。