迭代

为什么使用迭代

1
for i in range(1000): pass

会导致生成一个 1000 个元素的 List

1
for i in xrange(1000): pass

则不会生成一个 1000 个元素的 List,而是在每次迭代中返回下一个数值,内存空间占用很小.

因为 xrange 不返回 List,而是返回一个 iterable 对象

迭代

迭代是一个实现可迭代对象(实现的是 iter() 方法)和迭代器(实现的是 next() 方法)的过程.

可迭代对象(Iterable):可以直接作⽤于for循环的对象统称为可迭代对象

一个实现了 iter方法的对象是可迭代的对象,该方法返回一个迭代器对象

可迭代对象的三个类型

⼀类是集合数据类型,如list,tuple,dict,set,str等
⼀类是generator,包括⽣成器和带yield的generator function
一类是处于打开状态的files,sockets 也是可迭代对象

可以使⽤isinstance()判断⼀个对象是否是Iterable对象:

1
2
3
from collections import Iterable
isinstance([], Iterable) # True
isinstance((x for x in range(10)),Iterable) # True

迭代器(iterator): 一个实现了next方法的对象

迭代器是一个带状态的对象,返回容器中的下一个值,并为下一次调用next()方法修改状态

可迭代对象是你可以从其获取到一个迭代器的任一对象.迭代器是那些允许你迭代可迭代对象的对象

我们自定义一个迭代器,以斐波那契数列为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Fab(object):
def __init__(self, max):
self.max = max
self.n, self.a, self.b = 0, 0, 1
def __iter__(self):
return self
def __next__(self): # python2使用next()
if self.n < self.max:
r = self.b
self.a, self.b = self.b, self.a + self.b
self.n = self.n + 1
return r
raise StopIteration()
>>> for n in Fab(5): print(n)

迭代器就像一个懒加载的工厂,等到有人需要的时候才给它生成值返回,没调用的时候就处于休眠状态等待下一次调用.
迭代器是⼀个可以记住遍历的位置的对象

iter()函数

⽣成器都是Iterator对象,但list,dict,str虽然是Iterable,却不是Iterator
把list,dict,str等Iterable变成Iterator可以使⽤iter()函数

1
2
3
4
5
6
7
8
9
10
it=iter([1,2,3]) iterkeys({1:"1",2:"2"}) iteritems({}) # 可迭代对象
it.next() # python3.0之前 迭代器
next(it) # 之后
# itertools函数返回的都是迭代器对象
from itertools import cycle , islice
colors = cycle(['red', 'white', 'blue'])
next(colors)
limited = islice(colors, 0, 4)
for x in limited:print x
Share Comments