迭代器和生成器

Posted zlw-xyz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器和生成器相关的知识,希望对你有一定的参考价值。

迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式,是一个可以记住遍历位置的对象。
迭代器(Iterator)对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 用于创建迭代器对象, next()用于输出迭代器的下一个元素。

 1 list=[1,2,3,4]
 2 it = iter(list)    # 创建迭代器对象
 3  4 for x in it:
 5     print (x, end=" ")
 6  7 while True:
 8     try:
 9         print (next(it))
10     except StopIteration:
11         sys.exit()

 

把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。
__iter__() 方法返回一个特殊的迭代器对象, __next__() 方法返回下一个迭代器对象,并通过 StopIteration 异常标识迭代的完成。

生成器

在 Python 中,使用了 yield 的函数被称为生成器(Generator),即生成器是一个特殊的函数。
跟普通函数不同的是,生成器的返回值是一个迭代器,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
生成器函数内部一般有循环语句,循环内有yield语句,
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值,
并在下一次执行 next() 方法时从当前位置继续运行,进行下一次循环,
若没有循环,只返回一次,yield则没有意义,直接return一次即可,
生成器可以节省内存空间。

执行过程如下:
调用函数-执行到yield-返回一个迭代器-执行next函数-获取yield返回值-在函数内部从yield下一句开始执行-继续循环;

 1 import sys
 2  
 3 def fibonacci(n): # 生成器函数 - 斐波那契
 4     a, b, counter = 0, 1, 0
 5     while True:
 6         if (counter > n): 
 7             return
 8         yield a
 9         a, b = b, a + b
10         counter += 1
11 f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
12  
13 while True:
14     try:
15         print (next(f), end=" ")
16     except StopIteration:
17         sys.exit()

总结

可以直接作用于 for 循环的对象统称为可迭代对象: Iterable;
可以作用于 next() 函数的对象都是迭代器: Iterator ;
可以使用 isinstance() 判断一个对象是否是 Iterable ;
生成器都是Iterable ,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator ;
可以通过 iter() 函数获得一个 Iterator 对象;

以上是关于迭代器和生成器的主要内容,如果未能解决你的问题,请参考以下文章

python函数:迭代器和生成器

python函数:迭代器和生成器

迭代器和生成器函数

Python中迭代器和生成器的区别与联系

迭代器和生成器

python的生成器与迭代器和可迭代对象