Python生成器深入理解

1、生成器 (1)什么是生成器? 核心:生成器的本质就是一个迭代器 迭代器是Python自带的 生成器程序员自己写的一种迭代器 def func(): print("这是一个函数") return "函数" func() def func(): print("这是一个生成器") yield "生成器" (2)生成器的编写方式: <1> 基于函数编写 <2> 推导式编写 (3)生成器函数:

​ 通过生成器函数构建生成器

<1> 函数体中出现yield代表要声明一个生成器 (generator -- 生成器) <2> 一个yield 对应 一个 next() def func(): msg = input("请输入内容") yield msg print("这是第二次启动") yield "生成器2" yield "生成器3" yield "生成器4" g = func() print(next(g)) print(next(g)) print(next(g)) print(next(g)) # 生成器的本质就是迭代器.迭代器如何取值,生成器就如何取值 <3>yield 和 return 的区别: 1>相同点: 都是返回内容 都可以返回多个,但是return写多个只会执行一个 2>不同点: return终止函数 yield是暂停生成器 yield 能够记录当前执行位置 (4)生成器的作用:节省空间 (5)使用场景: 当文件或容器中数据量较大时,建议使用生成器 (6)区别什么是迭代器,什么是生成器? <1> 通过地址:

​ 迭代器的地址:<list_iterator object at 0x000000987B6E97F0>

​ 生成器的地址:<generator object func at 0x00000087C2A10CA8>

<2> 通过send()方法: (send()方法第一次必须发送None) 没有send()方法就是迭代器 有send()方法就是生成器 def func(): a = yield 1 print(a) b = yield 2 print(b) g = func() print(g.send(None)) # send -- 发送 print(g.send("alex")) # send -- 发送 print(g.send("宝元")) # send -- 发送 1>send和next()区别:

​ 相同点:

​ send 和 next()都可以让生成器对应的yield向下执行一次。

​ 都可以获取到yield生成的值。

​ 不同点:

​ 第一次获取yield值只能用next不能用send(可以用send(None))。

​ send可以给上一个yield置传递值。

(7)yield 和 yield from的区别: yield 将可迭代对象一次性返回 yield from 将可迭代对象逐个返回 def func(): def foo(): print(11) lst = {"key":1,"key1":2} yield foo print(func().__next__()) def func(): lst = [1,2,3,45,6] lst1 = ["alex","wusir","taibi","baoyuan"] yield from lst yield from lst1 g = func() for i in g: print(i) lst = [1,2,3,45,6] lst1 = ["alex","wusir","taibi","baoyuan"] for i in lst,lst1: print(i) (8)可迭代对象、迭代器、生成器的比较:

可迭代对象

​ 优点:list , tuple .str 节省时间,取值方便,使用灵活(具有自己私有方法)

​ 缺点:大量消耗内存

迭代器

​ 优点:节省空间

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/daceb13e7396377c238e6f45a4a3ed17.html