Python基础18
生成器(迭代器的一种)
生成器背景
数据过多的时候,就会占用内存空间,节省内存空间我们我们会把这些数据变为一个对象给你,不会给具体数据,要用的时候在给你
解决问题
节省内存空间
range关键字在Python3中也是一个生成器
1 def index(): 2 print(‘来了老弟’) 3 yield
函数中只要有出现yield关键字,那么该函数就从普通函数变成了生成器,就不会在执行该函数
要想使用生成器只需要使用next取值即可
我们使用next取值时,每next一次,代码就走到第一个yield处停止,在执行一次就会从上次yield处开始执行到下一个yield停止
如果答应next的结果,就会返回yield关键字后面的值
当yield关键字后面的数据用逗号隔开,有多个时,会以元组的形式返回
自定义range功能
range函数不能使用,写一个和range函数一样的功能
1 def my_range(start,stop=None,step=1): 2 3 if not stop: 4 stop=start 5 start=0 6 while start<stop: 7 yield start 8 start+=step 9 10 for i in my_range(10): 11 print(i)
yield关键字的传参问题
def eat(name): print(‘%s正在干饭’%name) while Ture: food=yield print(‘%s正在吃%s’%(name,food)) 函数里面只要有yield关键字,就不会执行函数,变成了生成器 res=eat(‘kevin’) next(res) res.send(‘烤全羊’) ''' 1利用send把参数传给yield 2执行了next()取值 '''
生成器表达式
1 列表生成式 2 res = [i for i in range(10)] 3 4 res1 = (i for i in range(10)) 5 print(res1) # <generator object <genexpr> at 0x0000018083EA3A50> 6 7 print(res1.__next__()) 8 print(res1.__next__()) 9 print(res1.__next__()) 10 print(res1.__next__()) 11 print(res1.__next__())
生成器表达式如果不next()取值是不会给数据的
迭代器和生成器关系
生成器也是一种特殊迭代器
迭代器、生成器我们都可以把它们看成是"工厂"
你什么时候要数据我们就设么时候给你生产
上述这样做的原因:
节省内存空间
# 求和 def add(n, i): return n + i # 调用之前是函数 调用之后是生成器 def test(): for i in range(4): yield i g = test() # 初始化生成器对象 for n in [1, 10]: g = (add(n, i) for i in g) res = list(g) print(res) #A. res=[10,11,12,13] #B. res=[11,12,13,14] #C. res=[20,21,22,23] #D. res=[21,22,23,24]
、
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 分享4款.NET开源、免费、实用的商城系统