什么是迭代器?
迭代器可以在访问集合
的时候变得非常方便。之前通过for...in...
的方式访问一个集合
的时候,就是使用迭代器完成的。如果没有迭代器,那么只能通过while循环,每次循环的时候通过下标访问了。
可迭代的对象:
可以直接使用for
循环遍历的对象,成为可迭代的对象,常见的可迭代的对象有:list
、tuple
、dict
、set
、st
r以及生成器
。
更加专业的判断一个对象是否是可迭代的对象是:这个对象有一个__iter__
方法,并且这个方法会返回一个迭代器对象,这种对象就叫做可迭代的对象。
判断一个对象是否可迭代:
可以使用isinstance()
判断一个对象是否是Iterable
的对象:
from collections import Iterable
# 列表是一个可迭代的对象
ret = isinstance([1,2,3],Iterable)
print(ret)
# 字符串是一个可迭代的对象
ret = isinstance("abc",Iterable)
print(ret)
# 整形不是一个可迭代的对象
ret = isinstance(123,Iterable)
print(ret)
迭代器:
- 在Python2中,实现了
next
方法和__iter__
方法,并且在这个方法中返回了值的对象,叫做迭代器对象。 - 在Python3中,实现了
__next__
方法和方法__iter__
方法,并且这个方法返回了值的对象,叫做迭代器对象。 - 如果迭代器没有返回值了,那么应该在next或者是
__next__
方法中抛出一个StopIteration
异常。
使用iter()方法获取可迭代对象的迭代器:
有时候拥有了一个可迭代对象,想要获取这个迭代器,那么可以通过iter(x)
方法获取这个可迭代对象的迭代器。
class MyRangeIterator(object):
def __init__(self,start,end):
self.index = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.index < self.end:
temp = self.index
self.index += 1
return temp
else:
raise StopIteration()
class MyRange(object):
"""
MyRange是可迭代对象
"""
def __init__(self,start,end):
self.start = start
self.end = end
def __iter__(self):
# 这个方法中要返回一个迭代器对象
return MyRangeIterator(self.start,self.end)
初始化一个可迭代的对象
for x in MyRange(1,10):
print(x)
# 使用itre函数将可迭代的对象转换为迭代器
range_iterator = iter(MyRange(1,10))
# 不能遍历迭代器,只能通过next来迭代
for x in range_iterator:
print(x)