Python生成器(generator)理解

Python进阶——生成器

什么是生成器?

元素可以按照某种算法推算出来,以此得到下一个元素,不必得到全部的元素后再进行输出,既可以边迭代边输出的机制。

生成器的核心特性?

边迭代边输出或者边循环边计算

那么为什么要有生成器呢?

在使用列表等结构时,数据已经事先加载在内存中了,如果此时的列表中数据量很大的话,计算机内存资源会非常吃惊,甚至内存溢出,比如我们加载了一个含有一亿个元素的列表,而只需要获取他的前十个,就算能将这一亿的数据装入列表,后面的元素占用的空间也都是浪费了(我们只用前十个)。

如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的列表,从而节省大量的空间。

☝️ tips:又想要使用大量数据,又想让它占用空间少,那就使用生成器!

怎么创建生成器呢?
  1. 最简单的方法和之前的列表推导式类似只是将[]换成了()

    # 生成器就这么得到了
    generator = (num for num in range(1,5))
    print(generator)
    
    # <generator object <genexpr> at 0x000001C7C9E3FD48>
    
  2. 或者使用yield关键字

    如果一个函数中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

生成器的使用:斐波那契数列
  • 不使用生成器
def fibonacci(n):
    a, b = 0, 1
    result = []
    count = 0

    while True:
        if count > n:
            break

        result.append(a+b)
        a, b = b, a+b
        count += 1
    return result

print(fibonacci(10))
# print(fibonacci(1000000000))   # 可以试试这个,超内存,跑不动

  • 使用生成器
def fibonacci(n):
    a, b = 0, 1

    count = 0
    while True:
        if count > n:
            continue
        yield a+b

        a, b = b, a+b
        count += 1
generator = fibonacci(10000000)  # 边迭代边输出

# 可以遍历全部
# for i in generator:
#     print(i)

# 可以遍历部分
for i in generator:
    if i < 100:
        print(i)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成器是一种特殊的迭代器,它可以在迭代过程中动态生成值,而不需要一次生成所有值并存储在内存中。生成器使用 yield 语句来定义,当调用生成器函数时,它返回一个生成器对象。每次调用生成器的 __next__() 或者 next() 方法时,生成器会执行代码直到遇到 yield 关键字,然后返回 yield 后面的值,并暂停代码的执行状态。当再次调用 __next__() 或者 next() 方法时,生成器会从上次暂停的地方继续执行代码,直到再次遇到 yield 关键字或者函数结束。 通过使用生成器,我们可以按需生成迭代序列,而不必一次性生成所有数据。这在处理大量数据或者无限序列时非常有用。生成器还可以用于节约内存和提高性能。 以下是一个简单的生成器函数的例子: ```python def my_generator(): for i in range(5): yield i gen = my_generator() print(next(gen)) # 输出: 0 print(next(gen)) # 输出: 1 print(next(gen)) # 输出: 2 print(next(gen)) # 输出: 3 print(next(gen)) # 输出: 4 ``` 在这个例子中,my_generator() 是一个生成器函数,它使用 for 循环和 yield 语句来生成从 0 到 4 的整数序列。通过调用 next() 方法,我们可以逐个获取生成器中的值。每次调用 next() 方法时,生成器会从上次暂停的地方继续执行代码,直到遇到下一个 yield 语句。当没有可迭代的值时,生成器会引发 StopIteration 异常,表示迭代结束。 希望这样能够帮助你理解 Python 中的生成器!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值