Python学习之迭代器详解

  • Post category:Python

Python学习之迭代器详解

什么是迭代器?

迭代器是Python中用于遍历可迭代对象的一种机制。将一个可迭代对象传入内置函数iter()中,可以获得一个对应的迭代器对象。通过调用__next__()方法,迭代器可以一个一个地返回可迭代对象中的元素,遍历完所有元素后,再调用__next__()会触发StopIteration异常。

创建迭代器的方法

Python中有两种创建迭代器的方式:

1. 使用 iter() 和 next() 函数

  • 使用iter()函数将可迭代对象转化为迭代器:
my_list = [1, 2, 3]
it = iter(my_list)
  • 使用next()函数输出迭代器对象的下一个元素:
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3

2. 在自定义类中实现迭代器

通过在自定义类中实现__iter__()__next__()方法,可以创建自己的迭代器。__iter__()方法返回迭代器对象本身,而__next__()方法返回迭代器中的下一个元素。

例如,我们可以定义一个叫做MyList的类,并在其中实现迭代器:

class MyList:
    def __init__(self):
        self.data = [1, 2, 3]
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == len(self.data):
            raise StopIteration
        value = self.data[self.index]
        self.index += 1
        return value

这样,我们就可以创建一个MyList对象,并在使用for循环时遍历其中的元素:

my_list = MyList()
for i in my_list:
    print(i)

输出结果为:

1
2
3

迭代器应用示例

1. 自定义斐波那契数列迭代器

class Fibonacci:
    def __init__(self, n):
        self.n = n
        self.current = 0
        self.a = 0
        self.b = 1

    def __iter__(self):
        return self

    def __next__(self):
        if self.current >= self.n:
            raise StopIteration
        if self.current == 0:
            self.current += 1
            return self.a
        elif self.current == 1:
            self.current += 1
            return self.b
        else:
            self.current += 1
            result = self.a + self.b
            self.a = self.b
            self.b = result
            return result

通过调用自定义的Fibonacci类,我们可以得到一组迭代器:

f = Fibonacci(10)
for i in f:
    print(i)

输出结果为:

0
1
1
2
3
5
8
13
21
34

2. 列表生成式

列表生成式是一种简洁而强大的语法,通过运用迭代器的机制,可以快速地创建列表。例如,下面的代码使用列表生成式和filter()函数将列表中的所有偶数保留下来:

my_list = [1, 2, 3, 4, 5, 6]
even = [i for i in my_list if i % 2 == 0]
print(even) # [2, 4, 6]

在列表生成式中,首先my_list被转换为一个迭代器,然后每个元素被遍历并通过if语句进行筛选,最终得到一个新列表。