详解Python中迭代器和生成器的原理与使用

  • Post category:Python

详解Python中迭代器和生成器的原理与使用

什么是迭代器

在Python中,迭代器是实现迭代序列的API。如果一个对象可以返回一个迭代器,那么就可以在迭代器上使用for循环,也可以使用next()函数来逐个获取迭代器中的值。

在Python中,我们可以自定义迭代器,只需要实现__iter__()和__next__()这两个方法就可以了。

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

    def __iter__(self):
        return self

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

if __name__ == '__main__':
    mylist = MyList()

    print('Using for loop:')
    for data in mylist:
        print(data)

    print('Using next() function:')
    it = iter(mylist) # get iterator
    while True:
        try:
            data = next(it)
            print(data)
        except StopIteration:
            break

输出结果:

Using for loop:
1
2
3
4
Using next() function:
1
2
3
4

什么是生成器

生成器是一种特殊的迭代器,可以像迭代器那样使用for循环和next()函数获取每一个值,但是生成器的实现方式不同于一般的迭代器。生成器是通过函数来实现的,其中包含yield关键字,函数每次返回yield后面的表达式的值,直到函数执行结束。

def my_generator():
    data = [1, 2, 3, 4]
    for d in data:
        yield d

if __name__ == '__main__':
    for data in my_generator():
        print(data)

    it = my_generator() # get iterator
    while True:
        try:
            data = next(it)
            print(data)
        except StopIteration:
            break

输出结果:

1
2
3
4
1
2
3
4

生成器表达式

生成器表达式是一个方便的生成器创建方式,可以通过类似于列表推导式的形式来创建一个生成器。

g = (x for x in range(1, 5))
for data in g:
    print(data)

it = (x for x in range(1, 5)) # get iterator
while True:
    try:
        data = next(it)
        print(data)
    except StopIteration:
        break

输出结果:

1
2
3
4
1
2
3
4