# 跟你深入剖析可迭代对象和迭代器的区别与联系

WeifaGan

## 导语

• 理解什么是可迭代对象
• 理解检查可迭代对象的方法
• 理解什么是迭代器
• 可迭代对象和迭代器的关系

## 可迭代对象

``````# 示例1
for i in [1,2,3]:
print(i)``````

``````1
2
3``````

``````#示例2
class Vector(object):
def __init__(self,components):
self.components = list(components)

def __iter__(self):
return iter(self.components)

V1 = Vector([1,2,3])
for i in V1:
print(i)``````

``````1
2
3``````

``````from collections.abc import Iterable
print(isinstance(V1,Iterable))#True``````

``````# 示例3
from collections.abc import Iterable
class Vector(object):
def __init__(self,components):
self.components = list(components)

def __getitem__(self,index):
return self.components[index]

V1 = Vector([1,2,3])
for i in V1:
print(i)
print(isinstance(V1,Iterable))``````

``````1
2
3
Flase``````

``````# 示例4
print(iter(V1))
#<iterator object at 0x000001B262E35518>

#去掉__getitem__方法后
print(iter(V1))
#TypeError: 'Vector' object is not iterable``````

• list
• dict
• tuple
• set
• string

## 迭代器

``````# 示例5
import itertools
class Fib:
def __init__(self):
self.pre = 0
self.cur = 1

def __iter__(self):
return self

def __next__(self):
p = self.cur
self.cur += self.pre
self.pre = p
return p

f = Fib()
a = list(itertools.islice(f,0,10))
print(a)
#[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]``````

``````#示例6
>>>s = 'ABCD'
>>>it = iter(s)
>>>while True:print(next(it))
A
B
C
D
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-4-d09d5cde4495> in <module>()
----> 1 while True:print(next(it))

StopIteration:
>>> list(it)
[]
>>>list(iter(s))
['A','B','C','D']``````

``````# 示例7
from collections.abc import Iterator
f = Fib()
print(isinstance(f,Iterator)) #True``````

• for 循环
• 构建和扩展集合类型
• 逐行遍历文本文件
• 列表推导、字典推导和集合推导
• 元组拆包
• 调用函数时，使用*拆包

## 可迭代对象和迭代器的关系

• 可迭代对象不一定是迭代器，迭代器一定是可迭代对象。因为迭代器一定会实现__ iter__方法，而可迭代对象尽管实现了__ iter __ 也不一定实现__next__方法。
• Python 从可迭代对象中获取迭代器，根据示例6的例子，我们知道先是使用iter()函数在迭代对象中获取迭代器，然后使用next()来获取下一个元素，关系如下图所示。

## 总结

• 可迭代对象实现了__iter__ 方法或者实现 __ getitem__方法而且其参数从0开始索引。
• 使用iter()函数判断可迭代对象更准确
• 任何序列都是可迭代对象
• 迭代器对象实现了__ iter __和__next __方法。
• 迭代器是一个可以记住遍历位置的对象，其内部有一个状态用于记录迭代所在的位置，以便下次迭代时候能取出正确的元素
• 检查对象是否为迭代器最好的方式是调用isinstance()方法。

33 声望
48 粉丝
0 条评论