设为首页 收藏本站
查看: 1026|回复: 0

[经验分享] python之迭代器

[复制链接]

尚未签到

发表于 2018-8-7 09:31:33 | 显示全部楼层 |阅读模式
  防伪码:忘情公子著
  何为迭代?迭代就是重复做一件事
  可迭代(iterable)对象有哪些:
  支持每次返回自己所包含的一个成员的对象;
  对象在内部实现了__iter__方法或者__getitem__方法:
  序列类型,如:list、str、tuple
  非序列类型,如:dict、file
  用户自定义的一些包含了__iter__()或__getitem__()方法的类
DSC0000.jpg

  可以直接作用于for循环的数据有以下几种:
  1、集合数据类型:list、tuple、dict、file、str等
  2、生成器对象:generator,包括生成器和带yield的generator function
  这些可直接作用于for循环的对象统称为可迭代对象:Iterable
  可以使用isinstance()判断一个对象是否是Iterable对象。
In [3]: from collections import Iterable  

  
In [4]: isinstance([],Iterable)
  
Out[4]: True
  

  
In [5]: isinstance('abc',Iterable)
  
Out[5]: True
  可迭代对象能干什么?
  可迭代对象支持每次返回自己所包含的一个成员的对象,每次取得一个,从头遍历到尾部。也就是说可迭代对象本身是可遍历的。
  以下举例来说明:
  定义一个列表:
list1 = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']  使用dir()函数查看list1列表所支持的所有方法和属性
In [2]: dir(list1)  
Out[2]:
  
['__add__',
  
'__class__',
  
'__contains__',
  
'__delattr__',
  
'__delitem__',
  
'__delslice__',
  
'__doc__',
  
'__eq__',
  
'__format__',
  
'__ge__',
  
'__getattribute__',
  
'__getitem__',
  
'__getslice__',
  
'__gt__',
  
'__hash__',
  
'__iadd__',
  
'__imul__',
  
'__init__',
  
'__iter__',
  
'__le__',
  
'__len__',
  
'__lt__',
  
'__mul__',
  
'__ne__',
  
'__new__',
  
'__reduce__',
  
'__reduce_ex__',
  
'__repr__',
  
'__reversed__',
  
'__rmul__',
  
'__setattr__',
  
'__setitem__',
  
'__setslice__',
  
'__sizeof__',
  
'__str__',
  
'__subclasshook__',
  
'append',
  
'count',
  
'extend',
  
'index',
  
'insert',
  
'pop',
  
'remove',
  
'reverse',
  
'sort']
  在输出中可以看到list1的方法中有__iter__和__getitem__。
  list1.__iter__()方法返回一个可迭代对象的迭代器地址,而不是返回元素本身,这就意味着,当调用__iter__方法或者__getitem__方法时,在内存中就创建了一个能够遍历某个对象的每一个元素的迭代器
In [3]: list1.__iter__()  
Out[3]: <listiterator at 0x7fec6bbafb90>
  一直在说迭代器,那么到底什么是迭代器呢?
  迭代器(iterator)又称游标(cursor),它是程序设计的软件设计模式,是一种可以在容器物件(container,如列表等)上实现元素遍历的接口。迭代器是一种特殊的数据结构,它是以对象的形式存在的。
  说白点,可以被next()函数调用并不断返回下一个值的对象称之为迭代器:Iterator
  对于集体中每一个元素,想要执行遍历,那么针对这个集体的迭代器定义了遍历集体中每一个元素的顺序或者方法。对于迭代器来说,我们可以对它调用next方法来获取其每一个元素或者说遍历其每一个元素。
  迭代器是不可逆的,当遍历结束后抛出异常,不会从头开始再次迭代,若想从头再来一遍只能重新创建一个迭代器
  除了调用__iter__和__getitem__方法能生成一个迭代器以外,还可以调用iter()函数来生成迭代器,其方法是:
  iter(可迭代对象),如:
In [4]: iter(list1)  
Out[4]: <listiterator at 0x7fec6bbe6450>
  iter(list1)相当于调用了list1的__iter__方法
  生成器是迭代器对象,但list、tuple、dict、str虽然是可以迭代对象,却不是迭代器对象,因为他们都没有next()方法。
  我们可以用iter()函数将list、tuple、dict、str等转换成迭代器。
  既然我们可以通过iter()函数将list、tuple、dict、str等这些数据类型转换成迭代器,那为什么不一开始就让这些数据类型默认就是一个迭代器对象呢?
  这是因为python中的Iterator迭代器对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration异常。
  我们可以把这个数据流看成是一个有序的序列,但我们不可能知道这个序列的准确长度,只能通过next()函数不断的按需生成下一个数据,所以Iterator的计算是惰性的。
  在python中,迭代器是遵循迭代协议的对象,使用iter()可从任何序列对象中得到迭代器,若要实现迭代器,需要在类中定义next()方法(python3中是__next__())
  要使得迭代器指向下一个元素,则使用成员函数next():
  在python中,是函数next(),而非成员函数
  当没有元素时,则引发StopIteration异常。
In [5]: a = iter(list1)  

  
In [6]: a.next()
  
Out[6]: 'Sun'
  

  
In [7]: a.next()
  
Out[7]: 'Mon'
  

  
In [8]: a.next()
  
Out[8]: 'Tue'
  

  
In [9]: a.next()
  
Out[9]: 'Wed'
  

  
In [10]: a.next()
  
Out[10]: 'Thu'
  

  
In [11]: a.next()
  
Out[11]: 'Fri'
  

  
In [12]: a.next()
  
Out[12]: 'Sat'
  

  
In [13]: a.next()
  
---------------------------------------------------------------------------
  
StopIteration                             Traceback (most recent call last)
  
<ipython-input-13-aa817a57a973> in <module>()
  
----> 1 a.next()
  

  
StopIteration:
  for循环可用于任何可迭代对象:
  for循环开始时,会通过迭代协议传递给iter()内置函数,从而能够从可迭代对象中获得一个迭代器,返回的对象有需要的next方法。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-547988-1-1.html 上篇帖子: python 答题小游戏 下篇帖子: python连接SQL Server数据库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表