功能:可以按照某种算法推算,仅仅需要访问前面几个元素
运作机制:一边循环一边计算。保存的是算法

创建

把一个列表生成式的[ ]改成( )
eg

  1. g = (x * x for x in range(10))

next()

每次调用next(g),就计算出g的下一个元素的值
获得generator的下一个返回值
用途:依次获取每一个元素
最后无元素,报错StopIteration

yield

如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

斐波拉契数列

  1. def fib(max):
  2. n, a, b = 0, 0, 1
  3. while n < max:
  4. print(b) #
  5. a, b = b, a + b # 注意等号连续赋值
  6. n = n + 1
  7. return 'done'

变成generator:
print(b)改为yield b

  1. def fib(max):
  2. n, a, b = 0, 0, 1
  3. while n < max:
  4. yield b #
  5. a, b = b, a + b
  6. n = n + 1
  7. return 'done'

执行流程

每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
和函数不一样(遇到return语句或者最后一行函数语句就返回);

??用for循环调用generator