可以直接用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()),Iterable)
True
>>> isinstance(,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()函数实现的。

Python高级特性——迭代器的更多相关文章

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

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

  2. python高级特性-迭代器

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

  3. Day11 python高级特性-- 迭代器 Iterator

    直接可以作用于for循环的数据类型有以下几种:   •  集合数据类型:        list.tuple.dict.set.str   •  Generator:        生成器 和 带 y ...

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

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

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

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

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

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

  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. 如何在导航条的button点击变换时,切换对应的控制器

    1.导航条内的button被点击 切换对应的控制器 让控制器作为调航条的代理 1.定义代理 2.遵循代理协议 3.实现代理 4.在合适的地方调用代理    当按钮被点击的时候切换控制器

  2. oracle创建jobs定时任务报错:PLS-00306: wrong number or types of arguments in call to 'JOB'

    原脚本: begin  sys.dbms_job.submit(job => job,                      what => 'xxx;',              ...

  3. 使用 webservice 实现 RPC 调用

    WebService 介绍 Web service 是一个平台独立的,低耦合的 web 的应用程序用于开发分布式的互操作的应用程序.Web Service 技术, 能使得运行在不同机器上的不同应用无须 ...

  4. Spring底层源码分析

    Spring 运行原理 Spring 启动时读取应用程序提供的 Bean 配置信息,并在 Spring 容器中生成一份相应的Bean 配置注册表,然后根据这张注册表实例化 Bean,装配好 Bean ...

  5. Rest微服务案例

    数据库 数据库名称为Product; 创建api子工程,项目名为springcloud_api Product实体类 public class Product implements Serializa ...

  6. [TimLinux] Python 自定义描述符

    1. 含义 在类中,含有属性(该属性需要存在类对象到__dict__属性中,不能为存在示例对象的__dict__属性中),对属性对操作(访问,设置值,删除)可以自定义行为,这样对自定义行为成为自定义属 ...

  7. openlayers4 入门开发系列结合 echarts4 实现散点图(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  8. ARTS-S golang goroutines and channels(二)

    向tcp服务端发消息 package main import ( "io" "log" "net" "os" ) fun ...

  9. 【JS】303- 编写更好的 JavaScript 条件式和匹配条件的技巧

    译者:@chorer 译文:https://chorer.github.io/2019/06/24/Trs-更好的JavaScript条件式和匹配标准技巧/作者:@Milos Protic原文:htt ...

  10. rails 构建 API

    我是来鼓吹使用 Rails 写 API 的. 原文在此: https://labs.kollegorna.se/blog/2015/04/build-an-api-now/ 原文有一个很大的缺陷就是读 ...