zoukankan      html  css  js  c++  java
  • Python高级特性——迭代器

    可以直接用for循环的数据类型有:

    • 集合数据类型,如:list、tuple、dict、set、str等;
    • 生成器generator,包括生成器和带yield的generator function。

    以上这些可以直接使用for循环的对象统称为可迭代对象:Iterable.

    可以使用isinstance()函数来判断一个对象是不是Iterable对象:

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

    又生成器不但可以使用for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误。可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator.

    可以使用isinstance()判断一个对象是不是Iterator:

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

    注意:生成器都是Iterator对象,但是list、set、str、虽然是Iterable,却不是Iterator.

    把list、dict、str、等Iterable对象变成Iterator对象可以使用iter()函数:

    >>> isinstance(iter([]),Iterator)
    True
    >>> isinstance(iter('abc'),Iterator)
    True

    问题来了:为什么list、dict、str数据类型不是Iterator呢?
    这是因为python中的Iterator迭代器对象表示的是一个数据流,Iterator对象可以被next()调用并不断返回下一个值,知道抛出StopIteration错误。可以把这个数据流看作是一个有序序列,但我们却不知道序列的长度,只能不断的通过next()函数按需去计算下一个数据,我们称Iterator的计算是惰性的,只有在需要返回下一个数据的时候它才会计算。Iterator甚至可以表示一个无限大的数据流,例如正偶数。而使用list是永远不能存储全体正偶数的。

    总结:

    • 凡是可以使用for循环的对象都是Iterable类型;
    • 凡是可以使用next()函数的对象都是Iterator类型,表示一个惰性计算的序列
    • 集合数据类型例如list、dict、str等是Iterable却不是Iterator,可以通过iter()函数获得一个Iterator对象。
    • python的for循环实质上就是通过不断的调用next()函数实现的。
  • 相关阅读:
    Redis list数据结构
    Redis hash结构
    大公司都有哪些开源项目~~~阿里,百度,腾讯,360,新浪,网易,小米等
    使用Nexus搭建Maven私服
    Maven nexus 安装nexus私服出现的两个问题
    SONATYPE NEXUS 搭建MAVEN 私服
    http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html
    将 Smart 构件发布到 Maven 中央仓库
    http://www.ruanyifeng.com/blog/2013/07/gpg.html
    http://www.jianshu.com/p/1e402922ee32/
  • 原文地址:https://www.cnblogs.com/hiwuchong/p/8067975.html
Copyright © 2011-2022 走看看