人人都能学会的python编程教程15:高级特性2

生成器

如果你想要一百万个数,而这些数里只有一百个数是你经常要用的,剩下的都几乎不怎么会用到,那么如果直接把这一百万个数全部放在list中是不明智的因为这会浪费较多存储空间,生成器就是为了解决这个问题而生的。

如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

生成器表达式: 通列表解析语法,只不过把列表解析的[]换成()

宝宝都能学会的python编程教程15:高级特性2

我们可以直接打印出list的每一个元素,但我们怎么打印出generator的每一个元素呢?

如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值:

宝宝都能学会的python编程教程15:高级特性2

当然这种获取值的方法很笨,所以我们一般用循环来迭代生成器的对象

宝宝都能学会的python编程教程15:高级特性2

迭代器

前面我们已经学过了for循环,我们知道for循环可以遍历list、tuple、dict、set、str和生成器。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

可以使用isinstance()判断一个对象是否是Iterable对象:

>>> from collections import Iterable
>>> isinstance([], Iterable)
> True
>>> isinstance({}, Iterable)
> True
>>> isinstance('abc', Iterable)
> True
>>> isinstance((x for x in range(10)), Iterable)
> True
>>> isinstance(100, Iterable)
> False

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

Python的for循环本质上就是通过不断调用next()函数实现的,例如:

宝宝都能学会的python编程教程15:高级特性2
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.1==,is的使用 ·is是比较两个引用是否指向了同一个对象(引用比较)。 ·==是比较两个对象是否相等。 1...
    TENG书阅读 761评论 0 0
  • Python 是一种相当高级的语言,通过 Python 解释器把符合语法的程序代码转换成 CPU 能够执行的机器码...
    Python程序媛阅读 1,980评论 0 3
  • 在python中,代码不是越多好,而是越少越好;代码不是越复杂越好,而是越简单越好;代码越少,开发效率越高! 1 ...
    祐吢房_2c9a阅读 312评论 1 1
  • 切片 对于取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操...
    抽象语法树阅读 306评论 0 0
  • 叶子写的文章《22岁赚足20万,废材的逆袭之路》,读来洒脱劲道,利落顺畅。观点聚焦,故事生动,言之有物,画龙点睛。...
    哈佛妈妈亲子园阅读 523评论 14 7