学会迭代器设计模式,帮你大幅提升python性能

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 循环也是一个迭代器模式的应用。

在这个例子中,我们对文件中的每一行进行了处理,并在循环结束后输出了文件的总行数。

后端开发标签