迭代器:

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 self c1 = MyClass()
# 对象c1不是可迭代对象
result = isinstance(c1, Iterable)
print(result)

 运行结果

true

5.创建一个迭代器类

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

from collections import Iterable
from collections import Iterator class 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 = items
self.current_index = 0 def __iter__(self):
return self def __next__(self):
# 判断位置是否合法
if self.current_index < len(self.items):
# 根据current_index 返回列表值
item = self.items[self.current_index]
# 让 下标+1
self.current_index += 1
# 返回元素内容
return item else:
# 停止迭代
# 主动抛出异常,迭代器没有更多的值(到了迭代器末尾)
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内部在我们遍历可迭代对象时超出范围会自动停止,我们定义迭代器类时直接抛出错误了,没有做那么复杂的处理。

    

  

 

  

python三大神器===》迭代器的更多相关文章

  1. Python 三大神器

    Python 三大神器 Python 中有很多优秀的包,本文主要讲一下 pip, virtualenv, fabric 1. pip 用来包管理 文档:https://pip.pypa.io/en/l ...

  2. Python三大器之迭代器

    Python三大器之迭代器 迭代器协议 迭代器协议规定:对象内部必须提供一个__next__方法,对其执行该方法要么返回迭代器中的下一项(可以暂时理解为下一个元素),要么就引起一个Stopiterat ...

  3. python三大神器之迭代器

    可迭代协议: 内部含有__iter__方法的值/变量都是可迭代的.可迭代类型和python语言之间的协议. 可迭代对象: iterable,内部包含__iter__()函数. 迭代器: iterato ...

  4. Python三大神器:装饰器,迭代器,生成器

    一.装饰器 由于一个函数能实现一种功能,现在想要在不改变其代码的情况下,让这个函数进化一下,即能保持原来的功能,还能有新的"技能",怎么办? 现已经存在一个自定义的函数func1, ...

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

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

  6. python三大神器之生成器

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

  7. python三大神器之一fabric使用

    fabric 是一个python包 是一个基于ssh的部署工具包 通常用来对网站 微服务等等的批量部署 例如 我有5台线上服务器 可以通过一台对着5台分发,实现自动部署的目的. 简单介绍下 fabri ...

  8. python三大神器

    Python 中有很多优秀的包,本文主要讲一下 pip, virtualenv, fabric 1. pip 用来包管理 文档:https://pip.pypa.io/en/latest/instal ...

  9. python三大神器之装饰器

    装饰器的形成过程 假如你要写一个计算函数执行时间的函数,代码如下: import time def func1(): print('in func1') def timer(func): def in ...

随机推荐

  1. [ DLPytorch ] 注意力机制&机器翻译

    MachineTranslation 实现过程 rstrip():删除 string 字符串末尾的指定字符(默认为空格). 语法:str.rstrip([chars]) 参数:chars -- 指定删 ...

  2. zookeeper 启动和停止脚本

    启动 sh zkServer.sh start 停止脚本 sh zkServer.sh stop

  3. JAVA 常用包

    JAVA是以包的形式进行语言结构组织的. 引入这些包的关键词就是 import 下面说说 JAVA常用包有下面的几个 1. java.lang 这个是默认引入的,也是一个最基础的包.其中lang不是中 ...

  4. 「JSOI2014」序列维护

    「JSOI2014」序列维护 传送门 其实这题就是luogu的模板线段树2,之所以要发题解就是因为学到了一种比较NB的 \(\text{update}\) 的方式.(参见这题) 我们可以把修改操作统一 ...

  5. 复盘实战营一期毕业典礼----HHR计划----以太入门课--第一课

    你要永远记住,实事求是. 我好像没能力给大家分享什么.分享点我的专业知识吧.我是做推荐+增长的,在一家D轮 DAU快千万的创业公司做增长优化负责人.一路优化,我把人均时长提高了30多分钟(现在人均时长 ...

  6. ES5-严格模式

    在es5中可以开启一种严格模式的代码形式,开启方式是:将全局或者函数的第一条语句定义为:'use strict';. 如果浏览器不支持,会将其解析为一条普通语句,没有任何的副作用. 开启全局模式后会有 ...

  7. navicat12破解详细教程

    以管理员身份运行此注册机: 运行注册机 打开注册机后,1) Patch勾选Backup.Host和Navicat v12,然后点击Patch按钮: 默认勾选 找到Navicat Premium 12安 ...

  8. python中numpy.concatenate()函数的使用

    numpy库数组拼接np.concatenate 原文:https://blog.csdn.net/zyl1042635242/article/details/43162031 思路:numpy提供了 ...

  9. Duilib XML嵌套/自定义控件

    转载:https://www.jianshu.com/p/0fe8610dcc8d  // https://github.com/Washington-DC/Duilib-ListView  //这是 ...

  10. springcloud gateway nullpointerexception (NettyRoutingFilter)

    最近在做一个下载功能时,发现直接调用服务是可以下载的,但是通过gateway路由下载会报NPE异常,具体如下 java.lang.NullPointerException: null at java. ...