python中生成器的用法及案例

本文介绍了Python中的生成器,包括如何通过函数和表达式创建生成器,以及它们在生成斐波那契数列、无限序列和处理大型文件等场景中的应用。生成器利用yield关键字实现迭代,有效节省内存,适合处理大量数据。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值