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

最新文章

  1. TopCoder SRM 642 Div.2 1000 --二分+BFS
  2. &amp;amp; replace &amp;
  3. ios二维码扫描插件,适配当前主流扫描软件,自定义扫描界面。
  4. ANDROID_MARS学习笔记_S03_006_geocoding、HttpClient
  5. C++ Primer 5th 第9章 顺序容器
  6. php增删改查,自己写的demo
  7. Inno Setup入门(十五)&mdash;&mdash;Inno Setup类参考(1)
  8. StreamReader 读取文本文件乱码问题
  9. 【java】实现Interface java.lang.Comparable&lt;T&gt;接口的int compareTo(T o)方法实现对象数组或链表或集合的排序,和挽救式对象比较器Interface java.util.Comparator&lt;T&gt;
  10. tape ——cf
  11. PHP 三元运算 ??与?:
  12. BZOJ4989 [Usaco2017 Feb]Why Did the Cow Cross the Road 树状数组 逆序对
  13. Java - LinkedList源码分析
  14. 将数据导入MongoDB集群与MySQL
  15. servelt filter listener 的生命周期
  16. Android开发之使用Handler刷新UI控件
  17. Map实现java缓存机制的简单实例
  18. angularjs中的interval定时执行功能
  19. Linux 文件夹含义(转)
  20. shell编程——保留元字符

热门文章

  1. Kendo MVVM 数据绑定(一) attr
  2. Ionic 2 中的创建一个闪视卡片组件
  3. Python一个有意思的地方:reduce、map、filter
  4. CentOS7.3+MySQL5.7+Apache2.4+PHP7.1+phpMyAdmin4.7+JDK1.8+SVN1.6+Jenkins2.1环境搭建
  5. MySQL查询优化方法总结
  6. DA层(数据访问层)的方法不用静态的
  7. JSON 序列化格式
  8. 【Python图像特征的音乐序列生成】一个更科学的图片分类参考方法,以及一个看起来很好用的数据集
  9. 使用JPA + Eclipselink操作PostgreSQL数据库
  10. JDBC对数据库的简单操作