一、迭代器

迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter()next()
字符串,列表或元组对象都可用于创建迭代器:

1.demo

  1. a = [1, 2, 3, 4]
  2. c = iter(a) # 创建迭代器对象
  3. print(next(c)) # 输出迭代器的下一个元素

2、使用for循环遍历迭代器

  1. tmp_list = list(range(10))
  2. tmp_iter = iter(tmp_list)
  3. for i in tmp_iter:
  4. print(i)

3、迭代器遍历数据

  1. tmp_list_1 = list(range(10, 20))
  2. tmp_iter_1 = iter(tmp_list_1)
  3. while True:
  4. try:
  5. print(next(tmp_iter_1)) # 输出迭代器对象从集合的第一个元素开始访�
  6. except StopIteration:
  7. sys.exit()

4、创建一个迭代器

把一个类作为一个迭代器使用需要在类中实现两个方法 iter() 与 next() 。
如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 init(), 它会在对象初始化的时候执行。
更多内容查阅:Python3 面向对象
iter() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 next() 方法并通过 StopIteration 异常标识迭代的完成。
next() 方法(Python 2 里是 next())会返回下一个迭代器对象。
创建一个返回数字的迭代器,初始值为 1,逐步递增 1:

  1. class Mynumbers():
  2. def __iter__(self):
  3. self.a = 1
  4. return self
  5. def __next__(self):
  6. x = self.a
  7. self.a += 1
  8. return x
  9. myClass = Mynumbers()
  10. myiter = iter(myClass)
  11. print('next(myIter)is ', next(myiter))
  12. print('next(myIter)is ', next(myiter))
  13. print('next(myIter)is ', next(myiter))
  14. print('next(myIter)is ', next(myiter))

二、生成器

生成器 使用了 yield 的函数被称为生成器
# 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
# 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
# 调用一个生成器函数,返回的是一个迭代器对象。

  1. # 斐波那契数列
  2. def num(num, n, i=0):
  3. while num < n:
  4. num += 1
  5. yield num
  6. tmp = num(10, 20)
  7. print(next(tmp))
  8. print(next(tmp))
  9. print(next(tmp))
  10. def fib(max):
  11. n, a, b = 0, 0, 1
  12. while n < max:
  13. yield b
  14. a, b = b, a + b
  15. n = n + 1
  16. return 'done'
  17. f = fib(10) # f 是一个迭代器,由生成器返回生成
  18. print('fib(10):', f)
  19. for x in f:
  20. print(x)
  21. # call generator manually:
  22. g = fib(5)
  23. while True:
  24. try:
  25. x = next(g)
  26. print('g:', x)
  27. except StopIteration as e:
  28. print('Generator return value:', e.value)
  29. break