迭代器:

1.认识迭代器

  迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

  我们怎样才能判定一个对象是都是可以迭代的呢?

2.可迭代对象

  list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,这类对象被称为可迭代对象

3. 如何判断一个对象是否是一个可迭代对象

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

 

from collections import Iterable
# 使用isinstance() 函数检测某个对象是否是一个可迭代的对象# 列表是可迭代对象
result = isinstance([1,2], Iterable)
print(result)# 元组是可迭代对象
result = isinstance((1,2), Iterable)
print(result)# 字符串是可迭代对象
result = isinstance("hello", Iterable)
print(result)# 字典是可迭代对象
result = isinstance({"a": 10, "b": 100}, Iterable)
print(result)# 数字不是可迭代对象
result = isinstance(100, Iterable)
print(result)# 定义类
class MyClass(object):pass# 创建对象
c1 = MyClass()
# 对象c1不是可迭代对象
result = isinstance(c1, Iterable)
print(result)

运行结果

True
True
True
True
False
False

4.如何将一个不可迭代的对象转换为可迭代对象:

  在探讨这个问题之前我们需要了解,可迭代对象的本质:可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。而在python中内置的魔法方法__iter__()方法可以将一个对象转换为可迭代对象,因此只要一个类中有__iter__()方法,那么这个类实例出的对象就是个可迭代对象,接下来我们你验证下:

from collections import Iterable
# 使用isinstance() 函数检测某个对象是否是一个可迭代的对象class MyClass(object):# 可迭代对象的本质是,类中是否定义了 __iter__() 方法def __iter__(self):return selfc1 = MyClass()
# 对象c1不是可迭代对象
result = isinstance(c1, Iterable)
print(result)

 运行结果

true

5.创建一个迭代器类

  那么上面的创建的迭代对象能用next()访问吗?结果肯定是不能的,我们虽然在类中定义了一个__iter__()方法,但我们并没有定义一个函数去迭代这个类,这时我们需要用python的内置方法__next__()去迭代这个对象,接下来我们会分别创建一个迭代器和迭代对象去s验证:

from collections import Iterable
from collections import Iteratorclass StudentList(object):def __init__(self):# 创建列表self.items = list()def addItem(self,item):# 追加元素到列表中self.items.append(item)def __iter__(self):# 创建迭代器对象studentIterator = StudentIterator(self.items)# 返回迭代器对象return studentIterator# 定义迭代器
class StudentIterator(object):# 定义构造方法# 1)完成 索引下标定义和初始化# 2)接收要遍历的列表值def __init__(self, items):self.items = itemsself.current_index = 0def __iter__(self):return selfdef __next__(self):# 判断位置是否合法if self.current_index < len(self.items):# 根据current_index 返回列表值item = self.items[self.current_index]# 让 下标+1self.current_index += 1# 返回元素内容return itemelse:# 停止迭代# 主动抛出异常,迭代器没有更多的值(到了迭代器末尾)raise StopIteration# 实例化对象
stulist = StudentList()stulist.addItem("小明")
stulist.addItem("小红")
stulist.addItem("小刚")
# 检查是否是可迭代对象
result = isinstance(stulist, Iterable)
print(result)for value in stulist:print(value)image-20180704185515374

  运行结果

小明
小红
小刚

  注意:如果我们用next()访问的次数超过迭代对象的范围会报错,也许你会疑问为什么平时我们遍历列表,元组等可迭代对象时为什么没有这种情况,那是因为python内部在我们遍历可迭代对象时超出范围会自动停止,我们定义迭代器类时直接抛出错误了,没有做那么复杂的处理。

    

  

 

  

转载于:https://www.cnblogs.com/xuchuankun/p/9508329.html

python三大神器===》迭代器相关推荐

  1. Python三大神器(迭代器、生成器、装饰器)和csv文件操作

    三大神器和csv文件操作 迭代器 1.什么是迭代器(iter) 迭代器是容器型数据类型 特点: 无法通过打印迭代器查看元素.也无法统计元素个数 需要使用元素的时候必须将元素从迭代器中取出,取出以后该元 ...

  2. python三大神器装饰器_Python2.x

    1)自动化 2)python编写的 openstack jumpserver ansible SaltStack yuanj zabbix json docker yaml 2)The Zen of ...

  3. python三大神器装饰器_Python3 - 复习(update to Day6)

    # 第一优先级规则声明: # 除了梦境,每一个意识主进程都必须与一个身体参与的机械进程相匹配,否则结束意识主进程.如学习python同时必须伴有记笔记.敲代码等机械进程,学习英语必须伴有朗读.听说.查 ...

  4. python三层装饰器-python三大神器===》装饰器

    1.认识装饰器 如果你经常看我的博客,你已经学会了python的前两大"神器'(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内 ...

  5. python三大神器===》装饰器

    1.认识装饰器 如果你经常看我的博客,你已经学会了python的前两大'神器'(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内部代码的情 ...

  6. python三大神器之生成器

    生成器Generator: 本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现) 特点:惰性运算,开发者自定义 在python中有三种方法来获取生成器: 1.通过生成 ...

  7. python三大神器_常用Python代码及花式写法(函数调用自身+三大神器)

    备注:第33课已经OK 一.urllib from urllib.request import urlopen as uReq from bs4 import BeautifulSoup as sou ...

  8. python三大神器_python函数进阶与三大神器

    一.高阶函数 1.函数就是变量 python中定义函数其实就是定义一个类型是function的变量,函数名就是变量名 def func1(): print('func1') print(type(fu ...

  9. python三大神器_Python之旅:Python上古三大神器之一PIP①

    ●什么是 pip ? pip是Python中的标准库管理器.它允许你安装和管理不属于Python标准库的其它软件包.本教程就是为 Python 新手介绍 pip. 通过本教程,你将学到: 1. 安装 ...

最新文章

  1. 最完美的ASCII 表
  2. 查车的行驶轨迹_怎么查车辆行驶轨迹?
  3. Discuz在线升级中的SC和TC分别是什么意思?
  4. 上传大数据到SharePoint 2010
  5. vmware安装ubuntu的一些成功技巧
  6. step4 . day4 库函数和库函数的制作
  7. SqlServer跨域查询
  8. 联想笔记本连不上手机热点_购买低配笔记本电脑的烦恼:实际重装笔记本系统的辛酸血泪史...
  9. OpenGL网络资源
  10. ubuntu下安装php环境
  11. 科学计数怎么转换成数字_勒夫迈 | 激光尘埃粒子计数器传感器工作原理
  12. 论文绘图-教你如何绘制响应面
  13. R 语言 | 计算可达矩阵
  14. 高德地图初步使用-多点路线连接
  15. 云服务器win10系统搭建ftp,win10系统搭建ftp服务器
  16. 硬笔书法“案”字怎样书写正确?“最美中国字”来教你!
  17. C#、NPOI生成Word文档(模板)
  18. 【学习打卡 Free-Excel 】Task9 数据透视
  19. 二维vector容器输入
  20. Android App 可以定时启动! 并且完成短信自动发送获取内容功能 (以获取闪讯密码为例 大学宿舍宽带)

热门文章

  1. SYSAUX表空间使用率高问题处理
  2. Lucene学习笔记:Field.Store.* 域存储选项
  3. 一门杀人于无形的艺术——社会工程
  4. ArcGIS中的三种查询
  5. Linux系统运维工程师PDF文档精选
  6. python selenium自动化获取oracle,python27+selenium3自动化登录测试
  7. FD.io/VPP — L2 vSwitch
  8. MarkdownPad打开文档This view has crashed错误,内容不显示
  9. 微信生成带参数的二维码,合成海报,扫码后推送小程序?
  10. 美学心得(第一百九十四集)罗国正