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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值