可迭代对象 iterable

可直接作用于for循环的对象统称为可迭代对象。

有 list、 dict、tuple、set、str等数据类型,还有 generator(包括生成器和带yield的generator function)。包括了有序和无序对象。

要判断一个对象是否为iterable对象。方法如下:

from collections import Iterable

isinstance([],Iterable)

迭代器 iterator

迭代,即一些事要重复好多次,就像在循环中做的那样。

一个对象是否可迭代,全都取决于这个对象是否有__iter__方法,只要该对象实现了__iter__方法,调用对象的__iter__方法,就回返回一个迭代器,这个迭代器一定具有next方法(调用这个方法时不需要任何参数),在调用这个迭代器的next方法时,迭代器就回返回它的下一个值,当迭代器中没有值可以返回了,就回抛出一个名为StopIteration的异常,停止迭代。

准确的说,一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象则是迭代器。

例如文件既有iter方法又有next方法,是可迭代对象也是迭代器,为什么还要iter方法呢。iter方法要使所有可迭代对象生成统一的迭代器格式。

每次调用next()方法的时候会做两件事:

1、为下一次调用next()方法修改状态

2、为当前这次调用生成返回结果

特性:不可逆,只能前进,不能后退。只能不断通过next()函数获取下一个数据,有需要的时候才生成值返回,没调用的时候就处于休眠状态等待下一次调用。

for循环就是这样工作的,for循环在循环一个对象的时候,会调用这个对象的__iter__方法,得到迭代器,然后在调用这个迭代器的next方法,去获得这个迭代器中包涵的每个值。

要判断一个对象是否为iterator对象。方法如下:

from collections import Iterator

isinstance((x for x in range(9)),Iterator)

迭代器与列表的区别

迭代器是惰性的,一个接着一个的获取值,只能往后取值。但无法获取迭代器的长度。

列表,一次性获取所有的值。如果有很多值,列表就会占用太多的内存。

例:

class test_class:

def __init__(self,start_num,stop_num):

self.start_num = start_num

self.stop_num = stop_num

def next(self):

if self.start_num <  self.stop_num:

self.start_num += 1

return self.start_num

def __iter__(self):

return self

test_obj = test_class(0,3)

print test_obj.next()

>>>1

print test_obj.next()

>>>2

print test_obj.next()

>>>3

生成器

一种特殊的迭代器。(用普通函数语法定义的迭代器)

生成器的两种表达形式:

函数式生成器:使用yield关键字每次返回一个结果,一个函数中可以出现多个yield。函数之中每一个yield都会返回一个结果。每执行一个yield后,函数都会变成“挂起”(暂停)状态,下次再调用时,会从上次挂起的位置继续向下执行。

生成器表达式:使用类似于列表推导式的方法,但返回的结果不再是一个列表,而是一个生成器。

例: (i for i in range(5))

可以作用于for循环,也可以被next()函数不断调用并返回下一个值,只到最后抛出stopiteration错误表示无法继续返回下一个值。

总结:

可用于for循环的对象都是iterable类型,

可用于next()函数的对象都是iterator类型,

生成器都是iterator对象,但list、dict、str等虽然是iterable,却不是iterator。

可以使用iter()函数可以把list等iterable变成iterator。

python--3、 可迭代对象、迭代器、生成器的更多相关文章

  1. 深入理解python中可迭代对象,迭代器,生成器

    英文原文出处:Iterables vs. Iterators vs. Generators 在python学习中,通常会陷入对以下几个相关概念之间的确切差异的困惑中: a container(容器) ...

  2. 可迭代对象&迭代器&生成器

    在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...

  3. python 可迭代对象 迭代器 生成器总结

    可迭代对象 只要有魔法方法__iter__的就是可迭代对象  list和tuple和dict都是可迭代对象 迭代器 只要有魔法方法__iter__和__next__的就是可迭代对象 生成器 只要含有y ...

  4. 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...

  5. Python--可迭代对象,迭代器,生成器

    记得在刚开始学Python的时候,看到可迭代对象(iterable).迭代器(iterator)和生成器(generator)这三个名词时,完全懵逼了,根本就不知道是啥意识.现在以自己的理解来详解下这 ...

  6. 搞清楚 Python 的迭代器、可迭代对象、生成器

    很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...

  7. 11.Python初窥门径(函数名,可迭代对象,迭代器)

    Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...

  8. Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器

    Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: ​ 1. 可以在局部作用域声明一 ...

  9. python的可迭代对象

    今日所得 迭代器 可迭代对象 迭代器对象 for循环内部原理 生成器 生成器表达式 内会函数 面对过程编程 迭代器 迭代就是指更新换代的过程,要重复进行,而且每次的迭代都必须基于上一次的结果. 我们使 ...

  10. python14 1.带参装饰器 | wrapper 了了解 # 2.迭代器 ***** # 可迭代对象 # 迭代器对象 # for迭代器 # 枚举对象

    ## 复习 '''函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 ...

随机推荐

  1. POJ 3984 迷宫问题 (BFS + Stack)

    链接 : Here! 思路 : BFS一下, 然后记录下每个孩子的父亲用于找到一条路径, 因为寻找这条路径只能从后向前找, 这符合栈的特点, 因此在输出路径的时候先把目标节点压入栈中, 然后不断的向前 ...

  2. elasticsearch学习(1)简单查询与聚合

    elastic 被用作全文搜索.结构化搜索.分析以及这三个功能的组合 一个ElasticSearch集群可以包含多个索引, 每个索引包含多个类型 一个类型存储着多个文档 每个文档又有多个属性 索引(名 ...

  3. MySQL-----一对多

    一对多: 用户表和部门表 用户: 用户id 用户名 部门 1 George   1 2 Elizabeth 1 3 Bruce 2 4 Catherine 3 部门: 部门id 部门名称 1 CEO ...

  4. Python - 面对对象(基础)

    目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代 ...

  5. SqlServer转换为Mysql(mss2sql)

    SqlServer转换为Mysql(mss2sql)工具 http://pan.baidu.com/s/1c2d8R8O 参考链接: http://www.cnblogs.com/angestudy/ ...

  6. Html学习总结(2)——Html页面head标签元素的意义和应用场景

    相信在html5之前,很少人会关注html页面上head里标签元素的定义和应用场景,可能记得住的只有"title"."keyword"和"descri ...

  7. [BZOJ 3221][Codechef FEB13] Obserbing the tree树上询问

    [BZOJ 3221]Obserbing the tree树上询问 题目 小N最近在做关于树的题.今天她想了这样一道题,给定一棵N个节点的树,节点按1~N编号,一开始每个节点上的权值都是0,接下来有M ...

  8. Monitor和Lock以及区别

    1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 ...

  9. 学习webpack过程并上传到github

    使用工具:sublimeText+node+git 1,一个包的文件结构,生成初始文件 在node 命令行窗口中创建demo_a文件夹 使用命令 npm init 初始化包,生成package.jso ...

  10. firdac支持的序列和还原格式

    TFDStorageFormat = (sfAuto, sfXML, sfBinary, sfJSON); FIREDAC支持3种序列格式:XML,JSON和BIN.