直接可以作用于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. 建议收藏,从零开始创建一个Activiti工作流,手把手教你完成

    环境配置 项目环境: JDK1.8 tomcat7 maven3.5 开发工具: IDEA activiti7 创建项目 目标:创建一个maven项目,集成Activiti,并自动生成25张数据库表 ...

  2. Serilog 源码解析——数据的保存(下)

    上一篇中,我们提到了日志数据是如何进行解析了.然而,Serilog 灵活采用了不同的策略(Policy)决定一个日志对象如何解析到LogEventPropertyValue的子类对象中,即采用了ISc ...

  3. Service Cloud零基础学习(二)Entitlement & MileStone

    https://trailhead.salesforce.com/content/learn/modules/entitlements 很少会有人不买东西,买的多了也很少没有人没有经历过售后流程.我们 ...

  4. Vegas教程:教你制作抖音热门人物穿越门窗特效

    抖音上经常会有很多特效视频,例如换妆.分镜.合拍.放大等,合适的特效总是会让视频更加出彩.这些特效,除了一部分是抖音自带以外,很多都是用的其他视频特效软件制作而成.这些视频编辑软件操作简单易上手,强大 ...

  5. kube-flannel.yml 文件

    ---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1beta1metadata: name: flannelrules: - api ...

  6. 基于Kubernetes和OpenKruise的可变基础设施实践

    本文首发在OPPO互联网公众号,欢迎点击转载 https://mp.weixin.qq.com/s/hRvZz_bZfchmP0tkF6M2OA 对于可变基础设施的思考 kubernetes中的可变与 ...

  7. 编程入门选什么语言好?C 语言还是Python ?为你解析

    前面我分享过计算机行业已经成了学校选择排名第一,家长和学生都很看好计算机类专业.现在IT行业也越来越火爆,程序员越来越被人看好.面对相比同龄人高薪资的诱惑,人们很难不心动,即使秃头也值得! 那么问题来 ...

  8. VMware Workstation Pro 16 官方正式版下载(含密钥)

    VMware官方网站 https://www.vmware.com VMware Workstation Pro已于近日更新.毫无疑问,这可能是Windows系统上最强大最好用的虚拟机! VMware ...

  9. java顺序、选择、循环结构

    一.顺序结构 二.选择结构 1.if都执行 2.if else if else 条件满足才执行 3.选择结构switch 一个case后有多条语句要加花括号 多个case的值不能相同 case中要加b ...

  10. 去除openwrite.cn博客验证码限制

    相信有的小伙伴肯定遇到过如下这种情况,但是作为老白嫖党肯定是 「下次一定」 了,所以今天我们来看看如何不关注公众号实现 「阅读原文」. 如何解决呢? 1.通过 F12 打开控制台,切换至 Elemen ...