直接可以作用于for循环的数据类型有以下几种:
   •  集合数据类型:
        list、tuple、dict、set、str
   •  Generator:
        生成器 和 带 yield 的generator function.
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以通过isinstance() 判断一个对象是否是Iterable对象:
        >>> from collections import Iterable
        >>> isinstance('abc', Iterable)
        True
        >>> isinstance([], Iterable)
        True
        >>> isinstance({}, Iterable)
        True
        >>> isinstance((), Iterable)
        True
        >>> isinstance((123), Iterable)
        False
        >>> isinstance((x*x for x in range(1,5)), Iterable)
        True
        >>> isinstance([ x*x for x in range(1,5)], Iterable)
        True
生成器不但可以用for循环,还可以被next()函数不断获取下一个值,直到最后抛出StopIteration错误。
可以被next()函数不断返回下一个值的对象成为迭代器Iterator。
生成器都是Iterable对象,但是Iterable对象不一定是迭代器Iterator,如 list、dict、str。
        >>> l = [1,2,3,4,5,6,7]
        >>> l.next()
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        AttributeError: 'list' object has no attribute 'next'
        >>> next(l)
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        TypeError: 'list' object is not an iterator
把list、dict、str等Iterable变成Iterator,可以使用iter()函数:
        >>> from collections import Iterator
        >>> isinstance('abc', Iterator)
        False
        >>> isinstance(iter('abc'), Iterator)
        True
        >>> isinstance([], Iterator)
        False
        >>> isinstance(iter([]), Iterator)
        True
        >>> next('abc')                                     #从这行开始,这块实验其实是有问题的,但是问题在哪,我目前还不知道。
        Traceback (most recent call last):            #在下面使用iter()函数之后,可以使用next()函数进行操作,
          File "<stdin>", line 1, in <module>           #但是操作多次后,结果一直为'a' , 不知道为什么。
        TypeError: 'str' object is not an iterator
        >>> next(iter('abc'))
        'a'
为什么list、dict、tuple、str、set等数据类型不是Iterator呢?
Iterator对象表示的是一个数据流,可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出的StopIteration错误。这个数据流可以看作是一个有序序列,但是却不能提前知道序列的长度,只能不断通过next()函数来实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时才会进行计算。
Iterator甚至可以表示一个无限大的数据流,而list、tuple等对象是永远不可能存储无限大的数据的,例如全体自然数。

迭代器小结:
   1.  可以for循环的对象都是Iterable ,可迭代对象。
   2.  可以作用于next()函数的对象都是Iterator,迭代器,表示是一个惰性计算的序列。
   3.  集合数据类型如dict、list、tuple等对象是Iterable,但是不是Iterator,但是可以通过iter()函数获得Iterator对象。
   
   
for循环本质上就是不断调用next()函数实现的,如:
    for x in [1,2,3,4,5]:
        pass
    等同于
    it = iter([1,2,3,4,5])
    while True:
        try:
            x = next(it)
        except StopIteration:       #遇到StopIteration时则退出循环。
            break

Day11 python高级特性-- 迭代器 Iterator的更多相关文章

  1. Python高级特性——迭代器

    可以直接用for循环的数据类型有: 集合数据类型,如:list.tuple.dict.set.str等: 生成器generator,包括生成器和带yield的generator function. 以 ...

  2. Python高级特性-迭代器和生成器

    迭代器 Python中可迭代对象(iterable)通俗指可直接作用与For循环的数据对象,如Python中的集合数据类型,字符串(str),列表(list),元组(tuple),集合(set),字典 ...

  3. python高级特性-迭代器

    凡是可作用于for循环的对象都是Iterable类型: 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列: 集合数据类型如list.dict.str等是Itera ...

  4. Python高级特性(1):Iterators、Generators和itertools(转)

    译文:Python高级特性(1):Iterators.Generators和itertools [译注]:作为一门动态脚本语言,Python 对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大 ...

  5. Python 高级特性介绍 - 迭代的99种姿势 与协程

    Python 高级特性介绍 - 迭代的99种姿势 与协程 引言 写这个笔记记录一下一点点收获 测试环境版本: Python 3.7.4 (default, Sep 28 2019, 16:39:19) ...

  6. Python高级特性之:List Comprehensions、Generator、Dictionary and set ...

    今天帅气的易哥和大家分享的是Pyton的高级特性,希望大家能和我一起学习这门语言的魅力. Python高级特性之:List Comprehensions.Generator.Dictionary an ...

  7. 三、python高级特性(切片、迭代、列表生成器、生成器)

    1.python高级特性 1.1切片 list列表 L=['Mli','add','sal','saoo','Lkkl'] L[0:3]  #即为['Mli','add','sal']  从索引0开始 ...

  8. python高级特性:切片/迭代/列表生成式/生成器

    廖雪峰老师的教程上学来的,地址:python高级特性 下面以几个具体示例演示用法: 一.切片 1.1 利用切片实现trim def trim(s): while s[:1] == " &qu ...

  9. python高级特性和高阶函数

    python高级特性 1.集合的推导式 列表推导式,使用一句表达式构造一个新列表,可包含过滤.转换等操作. 语法:[exp for item in collection if codition] if ...

随机推荐

  1. MathType中余弦函数的输入

    余弦函数是三角函数中十分重要的一个知识点,余弦函数的俩种形式分别为a2=b2+c2-2bccosA和cosA=(b2+c2-a2)/2bc,接下来我们分别介绍一下这俩种形式的输入. 具体步骤如下: 步 ...

  2. 为什么企业需要CRM系统?CRM的作用及其重要性分析

    客户管理系统(CRM)是企业核心应用软件之一,对于提高企业业绩起着至关重要的作用,现在很多企业都在客户发展方面投入大量的资金,以求获得更好的回报. 关于CRM CRM是一个客户数据中心,在CRM中,你 ...

  3. Lombok之@Builder注解

    Lombok之@Builder注解 前言 Lombok大家都知道,在使用POJO过程中,它给我们带来了很多便利,省下大量写get.set方法.构造器.equal.toString方法的时间.除此之外, ...

  4. IO模式 select、poll、epoll

    阻塞(blocking).非阻塞(non-blocking):最常听到阻塞与非阻塞这两个词就是在函数调用中,比如waitid这个函数,通过NOHANG参数可以把waitid设置为非阻塞的,也就是问询一 ...

  5. Ajax Status(状态码) & readyState()

    Ajax Status & readyState readyState(状态值) 是指运行AJAX所经历过的几种状态,论访问是否成功都将响应的步骤,可以理解成为AJAX运行步骤,使用" ...

  6. nacos单机,集群安装部署

    nacos单机启动 准备 下载nacos安装包 下载地址 准备centos环境 (本次测试使用docker) PS C:\Users\Administrator> docker run -tid ...

  7. java导出excel并且压缩成zip上传到oss,并下载,使用字节流去存储,不用文件流保存文件到本地

    最近项目上要求实现导出excel并根据条数做分割,然后将分割后的多个excel打包成压缩包上传到oss服务器上,然后提供下载方法,具体代码如下:这里只展示部分代码,获取数据的代码就不展示了 ByteA ...

  8. 一万字详解 Redis Cluster Gossip 协议

    Redis Cluster Gossip 协议 大家好,我是历小冰,今天来讲一下 Reids Cluster 的 Gossip 协议和集群操作,文章的思维导图如下所示. 集群模式和 Gossip 简介 ...

  9. IdentityServer4系列 | 客户端凭证模式

    一.前言 从上一篇关于 快速搭建简易项目中,通过手动或者官方模板的方式简易的实现了我们的IdentityServer授权服务器搭建,并做了相应的配置和UI配置,实现了获取Token方式. 而其中我们也 ...

  10. 浅尝 Elastic Stack (四) Logstash + Beats 读取 Spring Boot 日志

    一.Spring Boot 日志配置 采用 Spring Boot 默认的 Logback: <?xml version="1.0" encoding="UTF-8 ...