学习python有一段时间了,在学习过程中遇到很多难理解的东西,做一下总结,希望能对其他朋友有一些帮助。

完全是个人理解,难免有错,欢迎其他大神朋友们批评指正。

1 迭代

   什么是迭代呢??我们可以这样理解,一个容器类型的数据,比如 列表[ ]  、元组 () 和 字典 { }, 我们可以把这样类型的数据放入for temp in [1,2,3] 当中,temp 被一次一次的赋值成为后面容器内数据,然后我们拿到temp进行一些想做的事情。那么for 循环中自动的帮我们把数据一次一次的取出来,可以理解成,这样的操作就是迭代。

2 可迭代对象

  在python当中有有那么一些特定的数据类型,可以放入for in 循环当中,这样的数据类型,我们可以说他们是可迭代对象。

  我们可以用 isinstance方法来检测一个对象是不是可迭代对象。

  可迭代对象可以放入for in中迭代,也可以放入list() tuple()等帮我们快速生成一个数据。

上代码!

 from collections import Iterable

 print( isinstance( [] , Iterable )  )  #True
print( isinstance( {} , Iterable ) ) #True
print( isinstance( () , Iterable ) )  #True
print( isinstance( 1 , Iterable ) )  #False

从中我们可以看出来,列表、元组、字典都是可迭代对象。而整型数据不是可迭代对象。

可迭代对象的实质是怎么回事呢???? (一脸懵逼)

  其实,可迭代对象的内部必须实现一个方法,__iter__()方法,这个方法的功能是,返回一个迭代器,这个迭代器是帮助自己进行迭代的。实现这个方法的对象,python就认为它是可迭代对象。

迭代器又是啥???(二脸懵逼)不要着急 稍后我再分享

上代码!!先看一看可迭代对象:

 from collections import Iterable
#我们自己创建一个类 里面实现iter方法 python就认为它的对象是可迭代对象了
class MyIterableObj(object):
def __iter__(self):
pass demo1 = MyIterableObj()
print(isinstance( demo1 , Iterable )) #True

从中可以看出来,我们自己写一个类,里面实现了iter方法,即使什么都没有做,创建一个对象之后,判断一下 python就认为这个对象是一个可迭代对象了。

3 迭代器

  刚刚我们说了,可迭代对象里面的iter方法返回一个帮助自己迭代的迭代器。迭代器是什么呢??

  其实我也不知道!(嘻嘻 笑哭) 开玩笑的啦~~~

  在我的理解当中呢,迭代器是帮助可迭代对象一个一个把里面元素取出来的一个对象。迭代器类型的对象都是可迭代对象,为什么呢,我们来看一看实质。

迭代器的实质:  

  迭代器内部必须实现两个方法: __iter__() 和 __next__()

  __iter__() 功能是返回一个迭代器,帮助我们自己这种类型进行迭代,因为自己就是迭代器,所以迭代器中的__iter__() 返回的是self自己

  __next__() 功能是:  简单的说就是返回当前元素的,就像列表当中,取出第一个元素,再调用next的时候就取出了第二个元素。 但是在for循环当中放入列表的时候,for是怎么知道列表最后一个元素都已经取完了呢????(我的天啊!不知道啊!!呜呜!!!)别着急,继续往下看

     复杂的说, next会做两件事:1 如果当前数据没有超出范围,这次当前值返回,然后自己进行标记,找到下一个要返回的值。

                   2 如果当前迭代器上次取出了最后一个元素,这一次当前数据是在范围之外的,那么就抛出异常(StopIteration),告诉for循环等一些内建工具,迭代结束了。

  不是很理解??没关系,上代码我们来看看!!

我们先看一看 python中认为什么样的东西是迭代器:

from collections import Iterator
print( isinstance( [] , Iterator ) ) #False 很显然,可迭代对象不是迭代器
print( isinstance( [].__iter__() , Iterator ) ) #True 这是调用了可迭代对象的iter方法得到一个迭代器对象
#在python中 内建了 iter() 方法和 next() 方法,把对象传进去与__iter__ 和 __next__ 相同功能
print( isinstance( iter([]) , Iterator ) ) #True # 像我说的 我们自己实现一个迭代器
class MyIterator(object):
def __iter__(self):
pass
def __next__(self):
pass demo2 = MyIterator()
print( isinstance(demo2 , Iterator ) ) # True

看的出来,我们自己的类对象里面只要具有这两个方法 python就认为他是迭代器了。

  大家还记不记得我说过,迭代器都是可迭代对象,  因为迭代器一定有__iter__方法,所以它一定是迭代对象

ok!接下来呢,我们把两个函数的业务逻辑补全,看一看迭代器两个方法实际上在干什么??

我们来实现一个 传入一个n 给我们迭代出 0到n 的迭代器  这个功能就好像是 range(n) 一样 我们自己实现一下!

 '''
接下来,我们具体实现一个能够完成功能, 能够放入for循环遍历的迭代器!! 啊好刺激啊!!
我们要实现的业务是: 传入一个参数n , 我们要迭代出 0到n的数
'''
class NumIterator(object):
#初始化我们接收一个参数n 告诉我们迭代到多少结束
def __init__(self , n):
self.n = n
#我们实际上是把 i 交给函数调用者
self.i = 0
# iter方法 返回一个迭代器,自己就是迭代器 所以返回自己
def __iter__(self):
return self
# next方法 判断是否越界 如果不越界返回一个元素 如果越界了抛出异常
def __next__(self):
#如果 没有越界, 我们返回给调用者迭代结果,并且自己记录下一次迭代的位置
if self.i <= self.n:
res = self.i
self.i += 1
return res
# 进入else说明i已经超过n 迭代越界了 抛出异常告诉for循环 迭代结束了
else:
#如果不抛出这个异常,for循环不知道什么时候停止迭代 会不停的调用next 陷入死循环
raise StopIteration #一个前3的自然数的迭代器对象
demo3 = NumIterator(3)
# 之前说过, 我们可以调用python内建的next方法来获取迭代器的元素
print( next(demo3) ) #
print( next(demo3) ) #
print( next(demo3) ) #
print( next(demo3) ) #
#print( next(demo3) ) # 这时候再调用会抛出异常 因为越界了! #同样我们自己写的迭代器能够放入for循环当中
demo4 = NumIterator(10)
for num in demo4 :
print(num)
#我们发现,会打印出从0 到 10 然后for循环就停了

看完上面的代码,我来解释一下 其实for循环的实质:

  for 不知道我们放在in后面的是可迭代对象还是迭代器,他会先调用iter方法拿到一个迭代器,然后不停的调用next方法取到值,然后提供给我们,一直到取某个值的时候接收到了一个StopIteration异常,for循环就终止了。

ok!! 到这里呢,可迭代对象、迭代器的知识就跟大家分享完了。

不知道小伙伴们都有没有理解,希望对一些不理解这些深层次东西的同学有一些帮助!!

欢迎大家批评指正~~~~谢谢大家的参考!

我是稀里糊涂的林老冷~

python当中的 可迭代对象 迭代器的更多相关文章

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

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

  2. Python中的可迭代对象/迭代器/For循环工作机制/生成器

    本文分成6个部分: 1.iterable iterator区别 2.iterable的工作机制 3.iterator的工作机制 4.for循环的工作机制 5.generator的原理 6.总结 1.i ...

  3. python编程系列---可迭代对象,迭代器和生成器详解

    一.三者在代码上的特征 1.有__iter__方法的对象就是可迭代类(对象) 2.有__iter__方法,__next()方法的对象就是迭代器3.生成器 == 函数+yield 生成器属于迭代器, 迭 ...

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

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

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

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

  6. Python中的可迭代对象与迭代器对象

    刚刚学习Python,对“可迭代对象”和"迭代器对象"的个人理解,不知道对不对. 1.几个概念 (1)迭代工具:包括for循环.列表解析.in成员关系测试.....等等在内的,用于 ...

  7. Python:容器、迭代对象、迭代器、生成器及yield关键字

            在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list, ...

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

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

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

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

随机推荐

  1. 关于JDK和eclipse的安装和汉化

    参考网址:http://jingyan.baidu.com/article/f96699bb8b38e0894e3c1bef.html http://titanseason.iteye.com/blo ...

  2. 使用Angular CLI生成路由

    第一篇文章是: "使用angular cli生成angular5项目" : http://www.cnblogs.com/cgzl/p/8594571.html 第二篇文章是: & ...

  3. IPFS的竞争对手们(一)

    IPFS的竞争对手 IPFS这个项目真的开发很慢,相比其它区块链项目,IPFS的进度可真是让小编捉急,恨铁不成钢啊.然而小编仍然对他们充满信心,来,借用一句盗梦空间里的经典台词: 既然做梦,那就做大点 ...

  4. Maven-07: 插件的自定义绑定

    除了内置绑定以外,用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上,这种自定义绑定方式能让Maven项目在构建过程中执行更多更富特色的任务. 一个常见的例子是创建项目的源码jar包.内置的插 ...

  5. Algorithm --> DFS和BFS

    定义结点 struct MGraph { int vexs[MAXVEX]; //顶点数组 int arc[MAXVEX][MAXVEX]; //邻接矩阵 int numVertex, numEdge ...

  6. 套接字API

    Q:套接字特点 A:管道,消息队列,信号量,共享内存这些通信机制只能允许同一计算机上运行的进程相互通信,而套接字不仅可以提供在同一计算机上的进程间通信,还可以提供不同计算机上的进程间通信. 服务器端: ...

  7. 安装texlive2017(latex的编译软件)

    准备工作是先卸载老版本的texlive,这个只要找到原来安装时的安装目录,然后直接把整个文件夹删掉即可.然后找到最近的Ctan的镜像,下载到对应版本的texlive,例如Mac系统,最好用的就是tex ...

  8. iOS App 启动性能优化

    1. App启动过程 解析Info.plist 加载相关信息,例如如闪屏 沙箱建立.权限检查 Mach-O加载 如果是胖二进制文件,寻找合适当前CPU类别的部分 加载所有依赖的Mach-O文件(递归调 ...

  9. 在Python中使用Redis

    在Python中要使用Redis数据库,首先要安装redis 之前的博客中有写到在命令行模式下操作Redis数据库. 要在项目中使用的话可以这么做: 通过初始化 redis.Redis,得到返回的对象 ...

  10. UGUI中显示粒子特效

    今天在UGUI上显示粒子特效的时候遇到的一些问题,Mark一下.原理:修改特效中每一个ParticleSystem的Layer为UI,并且把ParticleSystemRenderer.sorting ...