我们已经知道,可以直接作用于 for 循环的数据类型有以下几种:

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

这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。

可以使用 isinstance() 判断一个对象是否是 Iterable 对象:

>>> Iterable
<class 'collections.abc.Iterable'>
>>> isinstance('abc',Iterable) #str 是可迭代类型
True
>>> isinstance(100,Iterable) #int 不是可迭代类型
False

而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续进行,返回下一个值了。

  • 可以被 next() 函数调用并不断返回下一个值的对象成为迭代器:Iterator。

可以使用 isinstance() 判断一个对象是否是 Iterator 对象。

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

生成器都是 Iterable 对象,但 list、dict、str 虽然是 Iterable ,但都不是 Iterator。

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

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

你可能会问,为什么 list、dict、str 等数据类型不是 Iterator ?

这是因为Python的 Iterator 对象表示的是一个数据流,Iterator 对象可以被 next() 函数调用并不断返回下一个数据,直到没有数据时抛出 StopIteration 错误。可以把这个数据流看作是一个有序序列,但是我们却不能提前知道序列的长度,只能不断通过 next() 函数实现按需计算下一个数据,所以 Iterator 的计算是惰性的,只有在需要计算下一个数据时它才会计算。

Iterator 甚至可以表示一个无限大的数据流,例如全体自然数。而使用 list 时永远不可能存储全体自然数的。

Python全栈之路----函数进阶----迭代器的更多相关文章

  1. Python全栈之路----函数进阶----装饰器

    Python之路,Day4 - Python基础4 (new版) 装饰器 user_status = False #用户登录后改为True def login(func): #传入想调用的函数名 de ...

  2. Python全栈之路----函数进阶----名称空间

    又名name space,顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的=地方 名称空间共3种,分别如下 ...

  3. Python全栈之路----函数进阶----作用域的查找空间

    n = 10 def func(): n = 20 print('func:',n) def func2(): n = 30 print('func2:',n) def func3(): print( ...

  4. Python全栈之路----函数进阶----闭包

    关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个这样的内部函数在包含它们之外被调用时,就会形成闭 ...

  5. Python全栈之路----函数进阶----生成器

    生成器特点: 不能立即产生,取一次创建一次 只能往前走 等到走到最后,就会报错 >>> a = [i for i in range(1000)] >>> a [0, ...

  6. Python全栈之路----函数进阶----列表生成式

    列表生成式 现在有个需求,看列表[0,1,2,3,4,5,6,7,8,9],要求你把列表里每个值都加1,你怎么实现?你可能会想到两种方法. 二逼青年版 >>> a = [0,1,2, ...

  7. Python全栈之路----函数----返回值

    函数外部的代码想要获取函数的执行结果,就可以在函数里用return语句,把结果返回. def stu_register(name,age,course='PY',country='CN'): prin ...

  8. python全栈开发-前方高能-函数进阶

    python_day_10 一.今日主要内容 1. 动态参数 位置参数的动态参数: *args 关键字参数的动态参数 : **kwargs 顺序: 位置,*args,默认值,**kwargs 在形参上 ...

  9. python全栈学习--day10(函数进阶)

    一,引言 现在我有个问题,函数里面的变量,在函数外面能直接引用么? def func1(): m = 1 print(m) print(m) #这行报的错 报错了:NameError: name 'm ...

随机推荐

  1. D2欧拉路,拓扑排序,和差分约束

    第一题:太鼓达人:BZOJ3033 题意:给出k,求一个最长的M位01串,使其从每一个位置向后走k个得到 的M个k位01串互不相同(最后一个和第一个相邻,即是一个环).输出 字典序最小的答案. 2 ≤ ...

  2. Codeforces 333E Summer Earnings - bitset

    题目传送门 传送门I 传送门II 传送门III 题目大意 给定平面上的$n$个点,以三个不同点为圆心画圆,使得圆两两没有公共部分(相切不算),问最大的半径. 显然答案是三点间任意两点之间的距离的最小值 ...

  3. selenium+java利用AutoIT实现文件上传

    转自https://www.cnblogs.com/yunman/p/7112882.html?utm_source=itdadao&utm_medium=referral 1.AutoIT介 ...

  4. 理解 Python 装饰器看这一篇就够了

    讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...

  5. MySQL安装指南(转)

    MySQL安装指南   安装MySQL sudo apt-get install mysql-server 这个应该很简单了,而且我觉得大家在安装方面也没什么太大问题,所以也就不多说了,下面我们来讲讲 ...

  6. 记 Java 各版本新特性

    Java 8: Lambda 表达式: (paramList) -> expression; 或者 (paramList) -> {statments;} 演示用例: public int ...

  7. javax.servlet-api 和 servlet-api 区别

    作者:Night Silent链接:https://www.zhihu.com/question/35812310/answer/64578510来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...

  8. winform左右滑动

    public static class FormTransform { public static void TransformSize(Form frm, int newWidth, int new ...

  9. Git Github的区别 & Pycharm使用GitHub

    首先:git和github功能很强大,随着使用深入,我将随时填充,更新这篇文章,记录随时遇到的新的问题和感悟. 第一次知道github是看廖雪峰的课程,所谓版本管理,之前在辉煌科技用的是SVN,了解一 ...

  10. 1.6 安全认证与授权(springboot与安全)

    引言:以下文档是学习尚硅谷关于springboot教学视频后整理而来! 一.安全 认证(Authentication):证明你是谁? 授权(Authorization):你能干什么? 参考资料: Sp ...