简述 yield和yield from关键字
2024-09-04 07:37:58
1、可迭代对象与迭代器的区别
可迭代对象:指的是具备可迭代的能力,即enumerable. 在Python中指的是可以通过for-in 语句去逐个访问元素的一些对象,比如元组tuple,列表list,字符串string,文件对象file 等。
迭代器:指的是通过另一种方式去一个一个访问可迭代对象中的元素,即enumerator。在python中指的是给内置函数iter()传递一个可迭代对象作为参数,返回的那个对象就是迭代器,然后通过迭代器的next()方法逐个去访问。
2、生成器
生成器的本质就是一个逐个返回元素的函数,即“本质——函数”
生成器有什么好处?
最大的好处在于它是“延迟加载”,即对于处理长序列问题,更加的节省存储空间。即生成器每次在内存中只存储一个值,比如打印一个斐波拉切数列:原始的方法可以如下所示:
def fab(max):
n, a, b = 0, 0, 1
L = []
while n < max:
L.append(b)
a, b = b, a + b
n = n + 1
return L
这样做最大的问题在于将所有的元素都存储在了L里面,很占用内存,而使用生成器则如下所示
def fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b #每次迭代时值加载这一个元素,而且替换掉之前的那一个元素,这样就大大节省了内存。而且程序在遇见yield语句时会 停下来,这是后面使用yield阻断原理进行多线程编程的一个启发,(python协程编程会在后面讲到)
a, b = b, a + b
n = n + 1
生成器其实就是下面这个样子,写得简单一些就是一次返回一条,如下:
def generator():
for i in range(5):
yield i def generator_1():
yield 1
yield 2
yield 3
yield 4
yield 5
上面这两种方式是完全等价的,只不过前者更简单一些。
3、什么又是yield from呢?
简单地说,yield from generator 。实际上就是返回另外一个生成器。如下所示:
def generator1():
item = range(10)
for i in item:
yield i def generator2():
yield 'a'
yield 'b'
yield 'c'
yield from generator1() #yield from iterable本质上等于 for item in iterable: yield item的缩写版
yield from [11,22,33,44]
yield from (12,23,34)
yield from range(3) for i in generator2() :
print(i)
从上面的代码可以看书,yield from 后面可以跟的式子有“ 生成器 元组 列表等可迭代对象以及range()函数产生的序列”
上面代码运行的结果为:
a
b
c
0
1
2
3
4
5
6
7
8
9
11
22
33
44
12
23
34
0
1
2
最新文章
- TopCoder SRM 642 Div.2 1000 --二分+BFS
- &;amp; replace &;
- ios二维码扫描插件,适配当前主流扫描软件,自定义扫描界面。
- ANDROID_MARS学习笔记_S03_006_geocoding、HttpClient
- C++ Primer 5th 第9章 顺序容器
- php增删改查,自己写的demo
- Inno Setup入门(十五)&mdash;&mdash;Inno Setup类参考(1)
- StreamReader 读取文本文件乱码问题
- 【java】实现Interface java.lang.Comparable<;T>;接口的int compareTo(T o)方法实现对象数组或链表或集合的排序,和挽救式对象比较器Interface java.util.Comparator<;T>;
- tape ——cf
- PHP 三元运算 ??与?:
- BZOJ4989 [Usaco2017 Feb]Why Did the Cow Cross the Road 树状数组 逆序对
- Java - LinkedList源码分析
- 将数据导入MongoDB集群与MySQL
- servelt filter listener 的生命周期
- Android开发之使用Handler刷新UI控件
- Map实现java缓存机制的简单实例
- angularjs中的interval定时执行功能
- Linux 文件夹含义(转)
- shell编程——保留元字符
热门文章
- Kendo MVVM 数据绑定(一) attr
- Ionic 2 中的创建一个闪视卡片组件
- Python一个有意思的地方:reduce、map、filter
- CentOS7.3+MySQL5.7+Apache2.4+PHP7.1+phpMyAdmin4.7+JDK1.8+SVN1.6+Jenkins2.1环境搭建
- MySQL查询优化方法总结
- DA层(数据访问层)的方法不用静态的
- JSON 序列化格式
- 【Python图像特征的音乐序列生成】一个更科学的图片分类参考方法,以及一个看起来很好用的数据集
- 使用JPA + Eclipselink操作PostgreSQL数据库
- JDBC对数据库的简单操作