1. iter()函数的概述
在Python中,迭代器是一种遍历数据集合的方法,通常用于循环,比如在for循环中。iter()函数是一个内置函数,用来获取可迭代对象的迭代器。可迭代对象是指实现了__iter__() 方法的对象,而迭代器是指实现了__next__()方法的对象。在使用iter()函数获取可迭代对象的迭代器之前,我们先来了解一下Python中的可迭代对象。
2. 可迭代对象
2.1 可迭代对象的概念
可迭代对象是指实现了__iter__() 方法的对象。__iter__()方法必须返回一个迭代器对象,这个迭代器对象必须实现了__next__()方法 。
class MyList:
def __init__(self, data):
self.data = data
def __iter__(self):
return MyListIterator(self.data)
class MyListIterator:
def __init__(self, data):
self.data = data
self.index = -1
def __next__(self):
self.index += 1
if self.index >= len(self.data):
raise StopIteration
return self.data[self.index]
my_list = MyList([1, 2, 3, 4, 5])
for i in my_list:
print(i)
上面是一个自定义列表类的例子,通过重写__iter__()方法并返回一个迭代器对象,在for循环中就能够用来遍历。可迭代对象的实现并不难,但难点在于__iter__()方法的返回值——迭代器对象。
2.2 可迭代对象的种类
可迭代对象不仅仅是Python List、String、Tuple和Dictionary,还包括用户定义的类。只要定义一个类并包含了__iter__()方法,那么我们就可以将这个类的实例对象视为一个可迭代对象。
3. 迭代器
3.1 迭代器的概念
迭代器是指实现了__next__()方法的对象。调用迭代器的__next__()方法可以依次返回迭代器中的每一个元素,当迭代器中没有元素时,__next__()方法会抛出 StopIteration 异常,用来表示迭代结束。
class MyList:
def __init__(self, data):
self.data = data
def __iter__(self):
return MyListIterator(self.data)
class MyListIterator:
def __init__(self, data):
self.data = data
self.index = -1
def __next__(self):
self.index += 1
if self.index >= len(self.data):
raise StopIteration
return self.data[self.index]
my_list = MyList([1, 2, 3, 4, 5])
my_iter = iter(my_list)
print(next(my_iter))
print(next(my_iter))
上面的例子中,可以看到my_list是一个可迭代对象,也就是实现了__iter__()方法的对象。iter()函数可以用来获得可迭代对象的迭代器。在上面的例子中,我们通过iter()函数获得my_list的迭代器对象my_iter。用next()函数来实现迭代器的迭代,每次调用next()函数就会返回迭代器中的下一个元素。
3.2 Python中的迭代器模式
在Python中,for循环就是实现了迭代器模式的一种表现形式。for循环中的in关键字会根据对象是否为可迭代对象来自动获取迭代器。所以,我们可以直接在for循环中使用可迭代对象,而不必通过iter()函数获得迭代器对象。
class MyList:
def __init__(self, data):
self.data = data
def __iter__(self):
return MyListIterator(self.data)
class MyListIterator:
def __init__(self, data):
self.data = data
self.index = -1
def __next__(self):
self.index += 1
if self.index >= len(self.data):
raise StopIteration
return self.data[self.index]
my_list = MyList([1, 2, 3, 4, 5])
for i in my_list:
print(i)
上面的例子与之前的例子类似,区别在于for循环中直接使用了可迭代对象,而不是通过iter()函数获得迭代器对象。
4. 如何使用iter()函数获取可迭代对象的迭代器
iter()函数可以获得可迭代对象的迭代器,在for循环中也是自动调用了iter()函数获得迭代器对象。因此,如果我们需要手动使用迭代器的迭代,就可以使用iter()函数实现。
class MyList:
def __init__(self, data):
self.data = data
def __iter__(self):
return MyListIterator(self.data)
class MyListIterator:
def __init__(self, data):
self.data = data
self.index = -1
def __next__(self):
self.index += 1
if self.index >= len(self.data):
raise StopIteration
return self.data[self.index]
my_list = MyList([1, 2, 3, 4, 5])
my_iter = iter(my_list)
print(next(my_iter))
print(next(my_iter))
上面的例子中,我们通过iter()函数获得了my_list可迭代对象的迭代器my_iter,然后通过调用next()函数实现了迭代器的遍历。如果没有手动调用iter()函数,for循环也是会自动调用的。
总结
iter()函数是一个非常有用的函数,可以用来获取可迭代对象的迭代器,在Python中可以通过for循环和手动调用next()函数来实现迭代器的遍历。需要注意的是,__next__()方法在迭代器中的实现非常重要,必须返回下一个元素,否则就会抛出 StopIteration 异常,用来表示迭代结束。