泰山神 发表于 2018-8-9 12:44:38

Python学习笔记__3.4章 生成器

  # 这是学习廖雪峰老师python教程的学习笔记
  1、概览
  列表元素按照某种算法推算出来,在循环的过程中不断推算出后续的元素。这种一边循环一边计算的机制,称为生成器:generator
  1.1、创建 generator
  1)方法一
  只要把一个列表生成式的[]改成(),就创建了一个generator
  L = #这是列表生成式
  g = (x * x for x in range(10)) #这是generator
  >>> g
  <generator object <genexpr> at 0x1022ef630>
  generator的值不能直接打印,需要用 next()函数获得,或者通过for循环打印

[*]  next(g)
  每调用一次,返回一个generator的值,当所有值返回完毕后,再调用会报错StopIteration

[*]  for 循环
  >>> for n in g:
  ...   print(n)
  2)方法二
  在函数体中,有 yield。当然,generator的函数,也可以用 next() 或者 for 循环获取返回值
  函数是顺序执行,遇到return语句或者最后一行函数语句就返回
  generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
  def odd():
  print('step 1')
  yield 1
  print('step 2')
  yield(3)
  print('step 3')
  yield(5)
  >>> o = odd()
  >>> next(o)# next(odd()) 调用效果一样。for循环调用见例题
  step 1
  1
  >>> next(o)
  step 2
  3
  >>> next(o)
  step 3
  5
  2、例题
  1、编写一个生成斐波那契数列的 generator 函数
  # 函数编写
  def fib(max):
  n, a, b = 0, 0, 1
  while n < max:
  yield b
  a, b = b, a + b
  n = n + 1
  return 'done'
  # for循环获取返回值,但获取不到generator 执行完的报错返回
  f=fib(6)# 定义一个generator对象 f
  for n in f:
  print(n)
  # 获取值得同时,获取generator的报错返回
  g=fib(6)
  while True:
  try:
  x=next(g)
  print('g',x)
  except StopIteration as e:# 捕捉错误
  print('Generator return value:',e.value)# 输入错误的返回值
  break
  2、编写一个杨辉三角的generator函数
  # -*- coding: utf-8 -*-
  def triangles():
  N=
  while True:
  yield N      #generator函数与普通函数的差别:在执行过程中,遇到yield就中断,下次又继续执行
  N.append(0)
  N= + N for i in range(len(N))]#杨辉三角的生成式
  if __name__ == '__main__':    # 如果是运行的.py文件,就执行下面的命令。调试用
  n=0
  for t in triangles():
  print(t)
  n=n+1
  if n == 10:
  break
页: [1]
查看完整版本: Python学习笔记__3.4章 生成器