python中生成器的用法及案例
1.生成器介绍
1.1使用函数创建生成器
def my_generator():
yield 1
yield 2
yield 3
g = my_generator()
print(next(g))
print(next(g))
print(next(g))
在上述示例中,my_generator
是一个生成器函数,使用yield
关键字来生成值。每次调用next()
函数时,生成器会执行到yield
语句处,返回相应的值。通过连续调用next()
函数,可以逐个获取生成器的值。
1.2使用生成器表达式创建生成器
g = (i for i in range(0, 10))
for value in g:
print(value)
在上述示例中,(x for x in range(0, 10))
是一个生成器表达式,类似于列表推导式,但使用圆括号来表示生成器而不是方括号。生成器表达式会动态地生成指定范围内的值。
无论是使用生成器函数还是生成器表达式,生成器都可以用于循环中进行迭代:在循环中,生成器会自动迭代并生成每个值。这种逐个生成值的特性使得生成器非常适合处理大型数据集或需要逐步生成值的情况,因为它不会一次性将所有值加载到内存中。
2.生成器的应用
2.1生成斐波那契数列
斐波那契数列如下:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181
print("fibonacci")
def fibonacci():
a, b = 0, 1
while True:
yield a+b
a, b = b, a + b
g = fibonacci()
for i in range(0, 20):
print(next(g))
写成类的形式如下:
class Fib:
def __init__(self, count):
self.count = count
self.first = 0
self.second = 1
self.sum = self.first + self.second
self.current_count = 0
def __iter__(self):
return self
def __next__(self):
if self.current_count < self.count:
self.current_count = self.current_count + 1
ret = self.sum
self.first = self.second
self.second = self.sum
self.sum = self.first + self.second
return ret
raise StopIteration
g=Fib(20)
for i in range(22):
print(next(g))
2.2生成无限序列
print("count_up")
def count_up():
start = 0
while True:
yield start
start = start+1
g = count_up()
for i in range(0, 20):
print(next(g))
在上述示例中,我们使用生成器生成一个无限序列。生成器函数count_up从指定的起始数字开始,通过循环使用yield语句生成下一个数字。通过调用next()函数逐个获取序列中的值。
2.3处理大型文件
def process_large_file(file_path):
with open(file_path, 'r') as file:
for line in file:
# 处理文件中的每一行
processed_line = process_line(line)
yield processed_line
# 处理大型文件的生成器对象
file_generator = process_large_file('large_file.txt')
# 逐行处理大型文件
for line in file_generator:
print(line)
在上述示例中,我们使用生成器来处理大型文件。生成器函数process_large_file打开并逐行读取文件,每次读取一行并处理。通过使用生成器,我们可以逐行处理大型文件而不必一次性将整个文件加载到内存中。