Python基础(生成器)

二、生成器(可以看做是一种数据类型)

  描述:   

    通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

    要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

 

  列表解析(列表生成式):

复制代码
 1 #生成一个列表[0,1,2,3,4,5,6,7,8,9]
 2 #方式一:正常思维 for循环方法生成
 3 li=[]
 4 for i in range(10):
 5     li.append(i)
 6 print(li)
 7 
 8 #方式二:列表解析
 9 li2=[i for i in range(10)]
10 print(li2)
11 
12 li3=[i for i in range(10) if i>5]
13 print(li3)
复制代码

 

 生成器的两种生成方式:

复制代码
 1 #创建生成器----列表解析方式
 2 gen=(i for i in range(10))
 3 #如果想获取迭代器中的元素可以通过next()或__next__()获取
 4 print(next(gen))
 5 print(next(gen))
 6 print(gen.__next__())
 7 print(gen.__next__())
 8 print("-----------")
 9 #但是一般都不会使用next方法获取生成器中的元素,太恶心!!!
10 #因为生成器也是可迭代对象,所以一般使用for循环获取生成器中的元素
11 for i in gen:
12     print(i)
13 
14 #创建生成器----函数方式
15 def func():
16     yield 0
17     yield 1
18     yield 2
19     yield 3
20 for i in func():
21     print(i)
复制代码

具有yield关键字的函数都是生成器,yield可以理解为return,返回后面的值给调用者。不同的是return返回后,函数会释放,而生成器则不会。在直接调用next方法或用for语句进行下一次迭代时,生成器会从yield下一句开始执行,直至遇到下一个yield。

 

  迭代器,可迭代对象,生成器关系:

posted @   佛祖让我来巡山  阅读(182)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~

佛祖让我来巡山博客站 - 创建于 2018-08-15

开发工程师个人站,内容主要是网站开发方面的技术文章,大部分来自学习或工作,部分来源于网络,希望对大家有所帮助。

Bootstrap中文网

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