1.什么是迭代器模式?
迭代器模式是一种设计模式,它提供了一种方法来顺序访问对象的元素,而不需要暴露该对象的底层实现。
在 Python 中,对于可迭代对象,内置的 for-in 循环遍历方式就是一种迭代器模式的应用。例如:
my_list = [1, 2, 3, 4]
for element in my_list:
print(element)
这里的 my_list
就是一个可迭代对象,而在 for-in 循环中,element
依次获取到了 my_list
中的每一个元素。
2.如何手动实现迭代器?
2.1 简单的迭代器实现
要实现一个迭代器,需要实现两个方法 __iter__() 和 __next__()。其中,__iter__()
方法返回迭代器对象本身,__next__()
方法返回下一个元素。例如:
class MyIterator:
def __init__(self, my_list):
self.index = 0
self.my_list = my_list
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.my_list):
value = self.my_list[self.index]
self.index += 1
return value
else:
raise StopIteration
my_list = [1, 2, 3, 4]
my_iterator = MyIterator(my_list)
for element in my_iterator:
print(element)
这里定义了一个 MyIterator 类,它的 __init__()
方法接受一个列表,将列表和初始迭代索引保存为实例属性。然后定义了 __iter__()
方法,此方法返回迭代器对象本身。最后定义 __next__()
方法,此方法返回下一个元素,如果已经到达列表末尾,则抛出 StopIteration 异常。
接下来使用 MyIterator 来迭代输出一个列表:
my_list = [1, 2, 3, 4]
my_iterator = MyIterator(my_list)
for element in my_iterator:
print(element)
输出结果为:
1
2
3
4
2.2 带有条件的迭代器实现
如果需要对列表中的元素做过滤,可以在迭代器的 __next__()
方法中加上条件判断。例如:
class MyFilteredIterator:
def __init__(self, my_list):
self.index = 0
self.my_list = my_list
def __iter__(self):
return self
def __next__(self):
while self.index < len(self.my_list):
value = self.my_list[self.index]
self.index += 1
if value % 2 == 0:
return value
raise StopIteration
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
my_iterator = MyFilteredIterator(my_list)
for element in my_iterator:
print(element)
这里的 MyFilteredIterator 类也实现了 __iter__()
和 __next__()
方法,但是在 __next__()
方法中,加入了一个 while
循环来过滤掉不符合条件的元素。例如,这里只返回列表中的偶数元素。
使用 MyFilteredIterator 来迭代输出一个列表:
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
my_iterator = MyFilteredIterator(my_list)
for element in my_iterator:
print(element)
输出结果为:
2
4
6
8
10
3.如何使用生成器?
生成器是一种更简单的迭代器实现方式,在 Python 中,我们可以使用 yield 语句来定义一个生成器函数。
以下是一个使用生成器实现斐波那契数列的例子:
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
for i, element in enumerate(fibonacci()):
if i >= 10:
break
print(element)
这里定义了一个 fibonacci()
生成器函数,它的原理是使用两个变量 a 和 b 来不停地计算斐波那契数列中的下一个数,并使用 yield
语句返回这个数。因为这个函数不会终止,所以使用 while True
循环。在主程序中,我们可以使用 for-in
循环来逐个迭代这个生成器函数返回的值。
使用 enumerate()
函数可以方便地给迭代的元素添加序号。在这里,我们输出了前十个斐波那契数列的值。
4.如何使用迭代器进行文件读写?
在 Python 中,我们可以使用迭代器来进行文件的读写。例如,以下是一个读取文件中每一行数据并计算总行数的例子:
with open('example.txt', 'r') as f:
count = 0
for line in f:
count += 1
print(count)
其中,with open('example.txt', 'r') as f:
用于打开一个名为 example.txt 的文本文件,并将其作为 f 文件对象返回。接下来,我们使用 for-in 循环遍历 f 这个文件对象。由于文件对象本身就是一个迭代器,所以这里的 for-in
循环也是一个迭代器模式的应用。
在这个例子中,我们对文件中的每一行进行了处理,并在循环结束后输出了文件的总行数。