关于迭代器的概念及讲解,在廖雪峰老师的网站上已经说的很详细了,这里只是整理下自己的学习笔记
这里要区分下迭代器与可迭代对象
迭代器的含义及范围:
迭代的中文意思是重复反馈过程的活动。它是一个动作,并重复执行相同动作返回结果,并将这个结果作为下次重复动作的输入。
在python中,具有多个相同类型元素的对象,均为可迭代对象,如字典dict,元组tuple,列表list,字符串str等。
而迭代器表示的是一个数据流,可以被python内建函数next()所调用,它是一个惰性过程,需要被使用的时候才会被计算。
可以通过iter()将一个可迭代对象转为一个迭代器对象。
迭代器对象的类型是Iterator
可迭代对象的类型是Iterable
==========================================================================================
重新整理容器、可迭代对象、迭代器、生成器在python中的概念和意义
容器:一种把多个元素组织在一起的数据结构。
容器中的元素可以逐个迭代获取,可以用in;not in等关键字判断元素是否包含在容器中。容器之所以可以使用某种方式来获取其中的每一个值,其原因是因为它是一个可迭代对象。但不是所有容器都是可迭代对象(Bloom filter)。
常见的容器对象:list(列表),set(集合),dict(字典),tuple(元组),str(字符串)
可迭代对象:
可以返回一个迭代器的对象都可以称为可迭代对象。我理解的,凡是可以通过iter()内建方式返回一个迭代器的。
ll = [1, 2, 3] # 构造一个列表,容器
ll1 = iter(ll) # 使用iter方法
next(ll1) # 调用next方法获取ll1中的值
print type(ll) # 可迭代对象
print type(ll1)# 迭代器
可迭代对象和容器一样,是一种通俗的讲法,不是具体的数据类型。可迭代对象实现了__iter__()方法,该方法返回一个迭代器对象。
注:在执行代码for循环遍历一个可迭代对象的时候,实际的执行情况是,将该可迭代对象执行iter()方法获得迭代器,然后执行next()方法依次获取其中的内容。
迭代器:
迭代器是一个带状态的对象。可以在调用next()方法时返回容器中的下一个值。任何实现了__iter__和__next__方法的对象都是迭代器(python3)或实现了next()方法和__iter__方法(python2)。
生成器:
一种特殊的迭代器。不需要像迭代器的类一样具有__iter__和__next__方法,只需要一个yield关键字。生成器一定是迭代器,迭代器却不一定是生成器。因为生成器是以一种懒加载的方式生成值,它定义的是初值及生成数值的方式。
使用生成器生成斐波那契数列的方式:
def fib(): # 0,1,1,2,3,5,8,13,21...
start, end = 0, 1
while true:
yield end
start, end = end, start+end
fib()方法在执行时不会显示的执行里面的代码,直到显示的调用next()方法才会执行并且碰到yield停下来,返回yield的值。