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))是一个生成器表达式,类似于列表推导式,但使用圆括号来表示生成器而不是方括号。生成器表达式会动态地生成指定范围内的值。

  无论是使用生成器函数还是生成器表达式,生成器都可以用于循环中进行迭代:在循环中,生成器会自动迭代并生成每个值。这种逐个生成值的特性使得生成器非常适合处理大型数据集或需要逐步生成值的情况,因为它不会一次性将所有值加载到内存中。

1.3用类的方式实现

  将生成器函数转换为类的形式可以使用 Python 的类和迭代器协议来实现。下面是一个示例,展示了将生成器函数转换为类的形式:

class Range_Generator:
    def __init__(self, start, stop, step):
        self.start = start
        self.stop = stop
        self.step = step
        self.value = self.start

    def __iter__(self):
        return self

    def __next__(self):
        if self.value < self.stop:
            old_value = self.value
            self.value = self.value + self.step
            return old_value
        raise StopIteration()


print("Range_Generator")
g = Range_Generator(0, 10, 1)
for i in g:
    print(i)

  在上述示例中,我们定义了一个名为 Range_Generator 的类,实现了 __iter__() __next__() 方法。iter() 方法返回实例自身,用于满足迭代器协议的要求。__next__() 方法用于生成下一个值并返回。当没有更多值可生成时,抛出 StopIteration 异常。通过创建 Range_Generator 类的实例,并使用迭代器方式调用next()函数,可以逐个获取生成器的值。

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打开并逐行读取文件,每次读取一行并处理。通过使用生成器,我们可以逐行处理大型文件而不必一次性将整个文件加载到内存中。

05-30 15:12