通过iter()函数可以将有迭代能力的对象转化成迭代器
可以通过collections类判断一个对象是Iterable还是Iterator
from collections import Iterable, Iterator
# 常见的Iterable: list, dict
a = [1, 2, 4, 5]
isinstance(a, Iterable) # True
isinstance(a, Iterator) # Fasle
b = iter(a)
isinstance(b, Iterable) # True
isinstance(b, Iterator) # True
迭代器是一个可以记住遍历位置的对象。(只能向前迭代不能后退)
迭代器是一个可以被next()函数调用并不断返回下一个值的对象
有迭代能力的对象从集合的第一个元素开始访问,真到所有元素访问完毕
# 两者都可用for语句迭代元素
for i in a:
print(i)
for i in b:
print(i)
# Iterator对象可用next()函数迭代元素(一直向后)
next(b) # 1
next(b) # 2
# 到最后无元素时,抛出StopIteration异常
iter()函数主要映射类中__iter__函数
next()函数主要映射类中__next__函数
class A(object):
def __iter__(self):
print("返回一个类B对象")
return B()
class B(object):
def __next__(self):
print(" you got me!!!!!!")
obj_a = A() # 类A实例
obj_b = B() # 类B实例
iter(obj) # 返回一个类B对象
next(iter(obj)) # 返回一个类B对象 you got me!!!!!!
一个类实现了__iter__, 我们认为它有迭代能力,称其为Iterable.
一个类同时实现了__iter__和__next__,称其为Iterator.
modify(obj_a) # 当前对象为Iterable
modify(obj_b) # 什么都不是
class MyRange(object):
def __init__(self, end):
self.start = 0
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.start < self.end:
ret = self.start
self.start += 1
return ret
else:
raise StopIteration
m = MyRange(5)
modify(m) # Iterable, Iterator
# 利用for语句迭代元素,会捕获StopIteration异常并自动结束for
for i in m:
print(i)
# 利用next()函数迭代元素
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a)) # 其实到这里已经完成了,我们在运行一次查看异常