面试题答案
一键面试生成器和迭代器的主要区别
- 定义方式:
- 迭代器:实现了
__iter__()
和__next__()
方法的对象。一般通过类来实现,__iter__
方法返回迭代器对象本身(通常是self
),__next__
方法返回下一个值,当没有更多值可返回时引发StopIteration
异常。 - 生成器:是一种特殊的迭代器,它更简洁。生成器可以通过生成器函数(包含
yield
语句的函数)或生成器表达式来创建。生成器函数执行时,遇到yield
语句会暂停执行,保存当前状态,下次调用next()
时从暂停处继续执行。
- 迭代器:实现了
- 内存使用:
- 迭代器:通常需要预先准备好所有数据并存储在内存中,当数据量很大时,可能会导致内存不足。
- 生成器:按需生成数据,只有在调用
next()
时才生成下一个值,大大节省内存,适用于处理大数据集。
- 创建过程:
- 迭代器:需要手动实现
__iter__
和__next__
方法来定义迭代逻辑。 - 生成器:使用
yield
语句就可以轻松创建一个生成器,生成器函数会自动实现迭代器协议。
- 迭代器:需要手动实现
生成器在实际编程中的常见使用场景
- 处理大数据文件:
假设要处理一个非常大的文本文件,逐行读取文件内容进行分析,而不希望一次性将整个文件读入内存。
def read_large_file(file_path): with open(file_path, 'r') as file: for line in file: yield line file_path = 'large_file.txt' for line in read_large_file(file_path): # 在这里对每一行进行处理,例如分析日志文件 print(line.strip())
- 生成无限序列:
生成斐波那契数列是一个经典例子,斐波那契数列理论上是无限的,使用生成器可以按需生成数列中的值。
def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b fib_gen = fibonacci() for _ in range(10): # 这里只取前10个斐波那契数 print(next(fib_gen))