python基础-生成器
# 生成器的本质就是迭代器,在python中有两种方式来获取生成器: # 1.通过生成器函数 yield # 2.通过生成器表达式来实现生成器 (推导式) def func(): print("123") yield "你好!" # 该函数当中有yield,该函数就是一个生成器函数,yield也有返回的意思 gen = func() #生成器函数在被执行的时候,创建生成器 print(gen) # <generator object func at 0x00000216F3854040> # 生成器对象 func 在 0x00000216F3854040 ret = gen.__next__() # 可以让生成器函数执行到下一个yield # 输出 123 print(ret) # 输出 你好 # 在一个函数当中可以有多个yield def func(): print(11) yield "你好" print(22) yield "你不好" print(33) yield "你很好" gen = func() r = gen.__next__() print("接受到的数据", r) r2 = gen.__next__() print("接受到的数据", r2) r3 = gen.__next__() print("接受到的数据", r3) r4 = gen.__next__() print("接受到的数据", r4) # 当程序后面没有yield之后,此时会报错,StopIteration """ 生成器函数: 1. 里面有yield 2. 生成器函数在被执行的时候,实际是创建一个生成器函数出来 3. 必须使用__next__()来执行一段代码,会自动执行到下一个yieldj结束 4. yield也有返回的意思,可以让下一个函数分段执行 5. 当后面没有yield之后,再次使用__next__()会报错StopIteration """ # 生成器函数的最大作用就是节省内存 # 举个例子 # 买一万件衣服 # 常规做法 def order(): lst = [] for i in range(10000): # 会比较消费内存 lst.append(f"衣服{i}") return lst lst = order() print(lst) # 生成器,执行一次next就只会输出一次 def order(): for i in range(10000): yield f"衣服{i}" lst = order() print(lst.__next__()) # def order(): lst = [] for i in range(10000): lst.append(f"衣服{i}") if len(lst) == 50: yield lst lst = [] lst = order() print(lst.__next__()) """ __next__ send 相同点:可以执行到下一个yield 不同点:send可以给上一个yield位置传参 """ def func(): print("111") a = yield "你好" print("222", a) b = yield "我不好" print("333", b) c = yield "你也不好" yield "红烧" g = func() r1 = g.__next__() # 第一次执行必须用next 不能使用send print(r1) r2 = g.send("呵呵") # send给上一个yield位置发送 “呵呵” print(r2) # 输出 # 111 # 你好 # 222 呵呵 # 我不好 # yield from def func(): lst1 = [1, 2, 3] lst2 = [4, 5, 6] # for item in lst1: # yield item # for item in lst2: # yield item yield from lst1 # 把每一个可迭代对象中的每一项分别返回 yield from lst2 g = func() print(list(g))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~