Python 入门之 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 节省时间,取值方便,使用灵活(具有自己私有方法)

​ 缺点:大量消耗内存

迭代器

​ 优点:节省空间

​ 缺点:不能直接查看值,使用不灵活,消耗时间,一次性,不可逆行

生成器

​ 优点:节省空间,人为定义

​ 缺点:不能直接查看值,消耗时间,一次性,不可逆行

最新文章

  1. git基本配置
  2. 小表驱动大表, 兼论exists和in
  3. 【Java每日一题】20161028
  4. 百度搜索--jquery
  5. poi excel导入
  6. AFN----AFNetworking
  7. matlab读入矩阵数据
  8. Unity-Animator深入系列---目标匹配Target Matching
  9. Linux 命令 - netstat: 检查网络设置及相关统计数据
  10. Linux应用开发环境搭建
  11. 0ctf-pwn_warmup-re_mips4
  12. 操,escape sequence的输入方法我以前找过一次,这次又忘了,又找了一次,记下来,
  13. Delphi Math里的基本函数,以及浮点数比较函数(转)
  14. 解决Ubuntu不能连接xshell
  15. storm学习笔记(一)
  16. C#基础知识之泛型
  17. php 5.6,7.0静态方法调用和new调用方法性能差距
  18. java8_api_stream
  19. [UnityShader基础]07.MaterialPropertyDrawer
  20. &#39;QueryDict&#39; object is not callable 错误解析

热门文章

  1. 牛客挑战赛34 A~E
  2. shiro框架学习-7- Shiro权限控制注解和编程方式
  3. 两个i标签之间有缝隙
  4. ef 分页
  5. es之分页
  6. Integer类源码浅析
  7. fastJson对象转字符串首字母小写问题
  8. 搜索引擎算法研究专题七:Hilltop算法
  9. 使用MingGW-w64 Build Script 3.6.7搭建ffmpeg编译环境
  10. Design a stack that supports getMin() in O(1) time and O(1) extra space