随笔 - 384  文章 - 0  评论 - 35  阅读 - 142万

python 的生成器

生成器(generator)

在Python中,这种一边循环一边计算的机制,称为生成器

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。

而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了

创建生成器只需要将类别生成式的[]改成()

文章参考廖雪峰老师官网https://www.liaoxuefeng.com/wiki/1016959663602400/1017318207388128#0

复制代码
#生成器
g=(x*x for x in range(10))  #<generator object <genexpr> at 0x000002670CC45E48>


#如果要一个个打印出来,可以通过next()函数得到下一个返回值
next(g)  #0
next(g)  #1
next(g)  #4

#每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误
复制代码

当然生成器也可以使用for循环迭代

#创建一个生成器,并输出每一个值
g=(x*x for x in range(1,10))
for i in g:
    print(i)

斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:

复制代码
def fib(max):
    n,a,b=0,0,1
    while n<max:
        print(b)
        a,b=b,a+b
        n=n+1
    return 'done'

fib(10)
复制代码

函数中使用生成器,如果函数中含有yield关键字,那么函数就是一个generator:

函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行;

把函数改成generator后,我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代

复制代码
def fib(max):
    n,a,b=0,0,1
    while n<max:
        yield b
        a,b=b,a+b
        n=n+1
    return 'done'

fib(10)  #<generator object fib at 0x104feaaa0>
复制代码

试着用生成器输出杨辉三角

 

复制代码
#杨辉三角
def triangles():

    L = [1]

    while 1:

        yield L  #执行完后面的,又再此基础上执行下一次

        L = [L[n] + L[n+1] for n in range(len(L) - 1)]  #先处理中间的

        L.insert(0,1)  #再在添加1

        L.append(1)  #再在尾添加1

#输出十行
n = 0
results = []
for t in triangles():
    results.append(t)
    n = n + 1
    if n == 10:
        break

for t in results:
    print(t)
复制代码

 

 






 

posted on   小小喽啰  阅读(181)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示