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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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训练数据并当服务器共享给他人