列表生成式的进化版——生成器以及iterator

在列表生成式中其实我们可能会碰到很多的局限性,一般列表生成式都比较简洁,如果想要通过比较复杂的算法生成一个列表的时候,就很难写出语句了。

同时每次使用列表生成式时我们都使用了大量的内存,但是不妨我们使用一个现使用现算的式子来替代列表生成式,当使用这个列表的时候再自动计算生成。

这就是生成器(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可能会对这里的迭代有更好的理解。

原文地址:https://www.cnblogs.com/zy1120192493/p/12853901.html