生成器简介

生成器是一个函数,它返回一个对象(迭代器),可迭代

生成器函数与普通函数的区别

  1. 生成器函数包含一个或多个yield语句
  2. 调用时,它返回一个对象(迭代器),但不会立即开始执行
  3. 自动实现iter()和next()方法,可通过next()遍历
  4. 遇到yield,将暂停执行函数
  5. 局部变量在连续调用中可传递
  6. 当函数终止,StopIteration会在进一步调用时自动引发 ```python

    带循环的生成器

    def rev_str(my_str): length = len(my_str) for i in range(length - 1, -1, -1):
    1. # 遇到yield,暂停该函数
    2. yield my_str[i]
    3. # 下一次遍历时从此处开始执行print
    4. print(f"i = {i}")

if name == “main“: for char in rev_str(“hello”): print(char)

“”” o i = 4 l i = 3 l i = 2 e i = 1 h i = 0 “””

  1. <a name="AiOZs"></a>
  2. ### 生成器表达式
  3. 另一个生成器(generator)的最简单的例子,由于列表生成式受内存空间限制,把列表推导式的 [] 换成 (),变成一个生成器,边计算边循环。
  4. ```python
  5. print((x for x in range(10))) #<generator object <genexpr> at 0x0000022293E4DCC8>

生成器的使用

与迭代器相比,生成器实现比较清晰和简单

  1. # 迭代器--实现幂次为2的序列
  2. class PowTwo:
  3. def __init__(self, max=0):
  4. self.n = 0
  5. self.max = max
  6. def __iter__(self):
  7. return self
  8. def __next__(self):
  9. if self.n > self.max:
  10. raise StopIteration
  11. result = 2 ** self.n
  12. self.n += 1
  13. return result
  14. # 生成器--实现幂次为2的序列
  15. def PowTwoGen(max=0):
  16. n = 0
  17. while n <= max:
  18. yield 2 ** n
  19. n += 1

生成器的优点

  1. 节约内存:生成器一次只返回一项

    Case

    生成器实现斐波那契数列

    函数每次执行到yield时,都会中断,并且返回b的值,下次执行则从中断之后的代码开始执行。
    1. def fibo(max_num):
    2. a, b, n = 0, 1, 0
    3. while n < max_num:
    4. yield b
    5. a, b = b, a + b
    6. n += 1
    7. return 'None'

生成器实现杨辉三角

  1. # 生成器实现杨辉三角方法一
  2. def triangles():
  3. p = [1]
  4. while True:
  5. yield p
  6. p = [1] + [p[i] + p[i+1] for i in range(len(p)-1)] + [1]
  7. n = 0
  8. for t in triangles():
  9. print(t)
  10. n += 1
  11. if n == 10:
  12. break
  13. # 生成器实现杨辉三角方法二
  14. # 假设上一个n 为[1, 1]
  15. # 则s = [1, 1, 0]
  16. # 通过式子可得 n = [1, 2, 1]
  17. def triangles():
  18. p = [1] # 初始化为[1],杨辉三角的每一行为一个list
  19. while True:
  20. yield p
  21. s = p[:] # 将p赋值给s,通过s计算下一行
  22. s.append(0) # 将list添加0, 作为最后一个元素,长度增加1
  23. p = [s[i-1] +s[i] for i in range(len(s))] # 通过s来计算出n
  24. n = 0
  25. for t in triangles():
  26. print(t)
  27. n += 1
  28. if n == 10:
  29. break