可迭代对象:
可迭代对象是指如:
list1 = [1,2,3,4]
str1 = "abcde"
等可以通过循环来遍历全部内容的对象。
迭代器对象:
通过iter(iterable item) 去创建一个对象,
比如利用上面的list1, 创建一个迭代器对象 我们可以这么做:
t = iter(list1)
接下来我们去可以用t.next() #python2.x中
next(t) #python3.x中
去迭代每一个对象
当迭代结束的时候就会返回一个异常。
--------------------------------------------------------------------------------------------------------------------------
接下来使用继承Iterable 和 Iterator的方式来使用迭代:
这种方法最后迭代的时候最后返回的东西是getStudent 方法中所定义的形式。
在可迭代对象中 都有内部包含一个方法__iter__()方法, 所以我们需要在可迭代对象中调用这个方法,在for循环中 调用的机制是通过调用__next__()方法。
我们可以通过使用dir(list1)查看这个列表的接口 可以看到有__iter__()方法。
切记从collections 这个包中导入这两个类
--------------------------------------------------------------------------------------------------------------------------
使用生成器函数实现可迭代对象:
用生成器对象实现可迭代对象实际上就是利用了yield 来实现这个功能。
yield 在执行完一次后会停留在这 等待信号进行下一次的运行。这就是用yield这个生成函数进行迭代的机制
yield在迭代对象中通常放在__iter__()函数下使用。
比如我们接下来要求一个范围内所有的素数:
在这通过利用了yield 每次迭代后等待的状态来实现了生成器函数的迭代。
--------------------------------------------------------------------------------------------------------------------------
反向迭代:
我们在反向迭代一个列表的时候, 我们会采用reversed
比如说:
list1 = [1,2,3,4]
for i in reversed(list1):
print i
就可以实现了
其中reversed(list1)是一个反向的迭代器对象(类似于iter(l))
也可以用next一一输出
在这我们使用正反两个迭代进行对比。
--------------------------------------------------------------------------------------------------------------------------
迭代器的切片:
在使用迭代器的切片时,我们可以导入 itertools.islice函数
但是在使用的时候我们应该注意 每次使用应该重新去获取一个生成器对象
比如
l = [1,2,3,4,5,6,7,8,9,10]
t = iter(l)
在使用 islice(t,5,8)后
我们会只剩下9,10
所以我们接着
for i in t:
print (t)
只能得到结果9,10.
--------------------------------------------------------------------------------------------------------------------------
在一个for中迭代多个可迭代对象:
并行的情况下我们可以采用zip的方法。
在串行的情况下,我们可以采用itertools包下的chain方法。