Python迭代器和生成器的区别及其各自实现方式和使用场景

目录

1.迭代器(Iterator)

 1.1迭代器的创建

1.2自定义迭代器

2.生成器 (Generator)

2.1生成器的创建

2.2 生成器一个范围

2.3生成器死循环

 2.4生成器大文件处理

 3.区别对比

4.总结

 


1.迭代器(Iterator)

迭代器提供了一种惰性(lazy evaluation)获取数据的方法,使得我们能够逐步访问序列中的元素,而无需一次性加载所有数据。其主要优点包括节省内存、提高性能、支持自定义遍历逻辑等。

特点:

  1. 惰性计算:按需生成数据,节省内存。

  2. 实现协议

    • __iter__():返回自身。

    • __next__():返回下一个元素;如果没有更多元素,则抛出 StopIteration 异常。

  3. 可迭代对象(Iterable)与迭代器不同:

    • 可迭代对象实现 __iter__() 方法,返回一个迭代器。

    • 迭代器既实现 __iter__() 又实现 __next__()

 1.1迭代器的创建

# 示例 可迭代对象
L = [1, 3, 5, 7]
it = iter(L)  # 从L对象中获取迭代器
next(it)  # 1  从迭代器中提取一个数据
next(it)  # 3
print(next(it))   # 5
next(it)  # 7
# 示例2 生成器函数
It = iter(range(1, 10, 3))
next(It)  # 1
print(next(It))  # 4
next(It)  # 7

1.2自定义迭代器

# 自定义迭代器类
class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self  # 迭代器返回自身

    def __next__(self):
        if self.index < len(self.data):
            result = self.data[self.index]
            self.index += 1
            return result
        else:
            raise StopIteration  # 数据迭代结束

# 使用自定义迭代器
my_iter = MyIterator([1, 2, 3])
for item in my_iter:
    print(item)

2.生成器 (Generator)

生成器是一种特殊的迭代器,通过函数定义,用 $yield$ 语句生成值。生成器可以自动实现迭代协议,无需手动实现 __iter__()__next__()

特点:

  1. 简洁:比手动实现迭代器更易写。

  2. 惰性计算:生成器在每次调用 $next()$ 时生成一个值,而不是一次性生成所有值。

  3. yield:暂停函数执行并返回值,保留函数的状态,以便下一次继续执行

2.1生成器的创建

def my_generator():
    print('first')
    yield 1
    
    print('second')
    yield 2
    
    print('thrird')
    yield 3
    

generator = my_generator()
print(next(generator))
print(next(generator))
print(next(generator)

2.2 生成器一个范围

def my_generator(n):
    for i in range(n):
        yield i
    
   

generator = my_generator(10)
print(generator)
print(next(generator))

for j in generator:
    print(j)

2.3生成器死循环

def my_generator(n):
    i = 0
    while True:
        i += 1 
        yield f'第{i}帧画面'
        
        if i >= n:
            break
    

camer = my_generator(1000)

for p in camer:
    print(p)

 2.4生成器大文件处理

def open_large_file(path):
    
    with open(path, mode='r', encoding='utf-8') as f:
        for line in f:
            yield line
            
            
# 不会把文件里面的数据全部加载到内容:一条一条处理的,内存压力很小            
data = open_large_file('./00.iree.json')
for i, d in enumerate(data):
    print(f'第{i}条数据......')

生成器应用场景:

  • 数据流处理:处理大文件或流式数据,避免内存耗尽。

  • 无限序列生成:如斐波那契数列、素数序列。

  • 管道化数据处理:与 itertools 模块结合使用。

 

 3.区别对比

特性 迭代器 生成器
实现 通过类实现,手动定义方法 使用函数和 yield 定义,自动实现迭代协议
代码简洁性 代码较复杂 代码简单
状态管理 手动管理状态 自动保存函数的运行状态
惰性计算 支持 支持
示例应用 自定义复杂的迭代逻辑 简单的数据流生成

4.总结

 学完迭代器和生成器后,我理清了两者的核心区别。迭代器是实现了__iter__()__next__()方法的对象,通过next()逐步返回数据,耗尽后触发StopIteration,如自定义的序列迭代器。生成器则是简化版迭代器,用yield关键字定义,每次执行到yield暂停并返回值,下次从暂停处继续,写法更简洁。

使用场景上,迭代器适合封装复杂遍历逻辑,如自定义数据结构遍历;生成器适合处理大数据流或惰性计算,如读取大文件、生成无限序列,能节省内存,避免一次性加载全部数据,两者都支持for循环遍历,但生成器实现成本更低。

 

你可能感兴趣的:(Python迭代器和生成器的区别及其各自实现方式和使用场景)