迭代器和生成器
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 对象;
以上是关于迭代器和生成器的主要内容,如果未能解决你的问题,请参考以下文章