欢迎访问宙启技术站
智能推送

Python的迭代器和生成器函数的使用方法

发布时间:2023-06-21 05:03:37

## 迭代器

### 1.什么是迭代器?

迭代器(Iterator)是一个遍历数据集合的对象,可以使用 for 循环访问集合中的元素,也可以通过 next() 方法逐个访问集合中的元素,直到遍历完整个数据集合为止。

在 Python 中,迭代器是一种内置类型的对象,其核心方法有__iter__()__next__()

### 2.使用迭代器

通过 iter() 函数可以将一个可迭代对象(Iterable)转换成一个迭代器:

a = [1, 2, 3]
it = iter(a)
print(next(it))  # 1
print(next(it))  # 2
print(next(it))  # 3
print(next(it))  # StopIteration

可以看出,使用 next() 方法可以遍历迭代器中的元素,当迭代器中没有更多元素可供遍历时,会抛出 StopIteration 异常。

### 3.自定义迭代器

如果要自定义迭代器,需要实现 __iter__()__next__() 两个方法。在 __next__() 方法中,如果没有更多元素可以遍历,则需要抛出 StopIteration 异常。

下面是一个简单的 Python 类示例,说明如何定义和使用迭代器:

class MyIterator:
    def __init__(self):
        self.counter = 0
        
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.counter < 5:
            self.counter += 1
            return self.counter
        else:
            raise StopIteration
            
my_iterator = MyIterator()
for i in my_iterator:
    print(i)  # 1,2,3,4,5

在上面的示例中,我们定义了一个 MyIterator 类,它的 __next__() 方法可以遍历数字 1~5,遍历完成之后会抛出 StopIteration 异常。

## 生成器函数

### 1.什么是生成器函数?

生成器函数(Generator Function)是一种使用 yield 关键字生成迭代器的函数。一个包含至少一个 yield 语句的函数就是一个生成器函数。在每次调用 yield 语句时,函数暂停执行,并将生成的值返回调用者,下次从停止的地方继续执行。

### 2.使用生成器函数

使用生成器函数的时候,遍历整个生成器的调用方也就是迭代器。可以通过 next() 方法逐个访问生成器中的元素,直到遍历完整个数据集合为止。

def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()

print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # 3
print(next(gen))  # StopIteration

### 3.自定义生成器函数

如果要自定义一个生成器函数,只需要在函数中使用 yield 关键字即可。在每次调用 yield 语句时,函数暂停执行,并将生成的值返回调用者,下次从停止的地方继续执行。

下面是一个简单的 Python 函数示例,说明如何定义和使用生成器函数:

def my_generator():
    i = 0
    while i < 5:
        yield i
        i += 1

gen = my_generator()

for i in gen:
    print(i)  # 0,1,2,3,4

在上面的示例中,我们定义了一个 my_generator() 函数,它的 yield 语句可以遍历数字 0~4,遍历完成之后会抛出 StopIteration 异常。

## 总结

迭代器和生成器函数都可以用来遍历一个数据序列。迭代器是将数据序列封装成了一个可迭代的对象,在使用时需要使用 iter() 函数将其转化为迭代器。生成器函数是使用 yield 关键字生成了一个迭代器,可以通过遍历整个迭代器来获取数据。

总的来说,生成器比迭代器更加灵活,而且在处理大量数据时的性能表现也比较优秀。如果数据量较小,可以使用迭代器;如果数据量较大,应该使用生成器。