python中的三大器有迭代器,生成器,装饰器,本文重点讲解下迭代器的概念,使用,自定义迭代器等的介绍。

1.概念:

  迭代器是一个对象,一个可以记住遍历位置的对象,迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完结束,迭代器只能往前,不能后退,实质是具备了__next__和__iter__方法的对象

2.可迭代对象:

  可以通过for in 等类似操作进行遍历取值的对象,本质是具备了__iter__方法的对象,因为__iter__方法提供了迭代器,实现了遍历位置的记录。在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据。

3.代码实现:

3.1通过isinstance()判断

In [1]: from collections import Iterable

In [2]: isinstance({},Iterable)
Out[2]: True In [3]: isinstance((),Iterable)
Out[3]: True In [4]: isinstance("",Iterable)
Out[4]: True In [5]: for item in {}:
...: pass
...: In [6]: for item in "":
...: pass
...: In [7]: for item in ():
...: pass
...:

3.2 for in的本质

就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。

li = [100, 200, 300, 400]
# for num in li:
# print(num) # 1. 通过调用可迭代对象的__iter__()获取迭代器
# 2. 对迭代器调用__next__进行迭代操作,
# 如果没有抛出StopIteration异常,表示迭代没有结束,把获取到的数据元素放到变量中
# 如果抛出了异常,表示迭代结束,退出执行
# 3. 执行循环体
# 4. 跳转到第2步执行 iterator = li.__iter__() while True:
try:
num = iterator.__next__()
except StopIteration:
break
else:
print(num)

3.3 自定义迭代器

class MyIterable(object):
def __init__(self):
self.container = [] # 定义一个容器 def add(self, item):
self.container.append(item) def __iter__(self):
return Iterator(self.container) # 返回一个迭代器 class Iterator(object):
def __init__(self, container):
self.container = container
self.i = 0 def __next__(self):
if self.i < len(self.container):
count = self.i
self.i += 1
return self.container[count]
else:
raise StopIteration def __iter__(self):
pass mi = MyIterable()
it = mi.__iter__()
mi.add(1)
mi.add(2)
mi.add(3) for item in mi:
print(item) from collections import Iterator print(isinstance(it, Iterator))

3.4 合并迭代器

Python要求定义的迭代器必须实现__iter__(self),并且返回self。通常,一个可迭代对象的迭代器都是固定的,并且,类与类之间需要距离性,对象之间需要相似性,所以通常可迭代对象和迭代器写在一起,就是下面的。

class MyIterable(object):
def __init__(self):
self.container = []
self.i = 0 def add(self, item):
self.container.append(item) def __next__(self):
if self.i < len(self.container):
count = self.i
self.i += 1
return self.container[count]
else:
raise StopIteration def __iter__(self):
return self mi = MyIterable()
mi.add(1)
mi.add(2)
mi.add(3) for item in mi:
print(item)

 3.5 迭代器应用场景之实现菲波那切数列

  我们发现迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值。如果每次返回的数据值不是在一个已有的数据集合中读取的,而是通过程序按照一定的规律计算生成的,那么也就意味着可以不用再依赖一个已有的数据集合,也就是说不用再将所有要迭代的数据都一次性缓存下来供后续依次读取,这样可以节省大量的存储(内存)空间。

class Fib(object):
def __init__(self, num):
self.num = num
self.num1 = 0
self.num2 = 1
self.i = 0 def __next__(self):
if self.i < self.num:
self.i += 1
temp = self.num1
self.num1, self.num2 = self.num2, self.num1 + self.num2
return temp
else:
raise StopIteration def __iter__(self):
return self fib = Fib(7)
print(list(fib))

 4.iter()函数与next()函数

对于可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。iter()函数实际上就是调用了可迭代对象的__iter__方法。

>> li = [1,2,3]
>>> li_iter = iter(li)
>>> next(li_iter)
1
>>> next(li_iter)
2
>>> next(li_iter)
3
>>> next(li_iter)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>

Python迭代器笔记的更多相关文章

  1. 【python学习笔记】9.魔法方法、属性和迭代器

    [python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...

  2. Python学习笔记之生成器、迭代器和装饰器

    这篇文章主要介绍 Python 中几个常用的高级特性,用好这几个特性可以让自己的代码更加 Pythonnic 哦 1.生成器 什么是生成器呢?简单来说,在 Python 中一边循环一边计算的机制称为 ...

  3. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  4. 【Python学习笔记之二】浅谈Python的yield用法

    在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...

  5. Python学习笔记(十一)

    Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...

  6. Python学习笔记(十)

    Python学习笔记(十): 装饰器的应用 列表生成式 生成器 迭代器 模块:time,random 1. 装饰器的应用-登陆练习 login_status = False # 定义登陆状态 def ...

  7. Python学习笔记(八)

    Python学习笔记(八): 复习回顾 递归函数 内置函数 1. 复习回顾 1. 深浅拷贝 2. 集合 应用: 去重 关系操作:交集,并集,差集,对称差集 操作: 定义 s1 = set('alvin ...

  8. 【python学习笔记】5.条件、循环和其他语句

    [python学习笔记]5.条件.循环和其他语句 print: 用来打印表达式,不管是字符串还是其他类型,都输出以字符串输出:可以通过逗号分隔输出多个表达式 import: 导入模块     impo ...

  9. 【python学习笔记】4.字典:当索引不好用时

    [python学习笔记]4.字典:当索引不好用时 字典是python中唯一内建的map类型 创建: key可以为任何不可改变的类型,包括内置类型,或者元组,字符串 通过大括号: phonebook={ ...

随机推荐

  1. FatJar in 创新实训 自然语言交流系统

    Fat Jar Eclipse Plug-In是一个可以将Eclipse JavaProject的所有资源打包进一个可执行jar文件的小工具,可以方便的完成各种打包任务,我们经常会来打jar包,但是e ...

  2. 在C++中调用DLL中的函数(3)

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  3. python 读写二进制文件实例

    本程序,首先写入一个矩阵到二进制文件中,然后读取二进制文件恢复到另外一个矩阵中. #coding:utf--8 #https://www.cnblogs.com/cmnz/p/6986979.html ...

  4. Axiom3D:资源引用与加载基本流程.

    Archive:对应文件夹位置,包含文件夹,压缩文件,网络位置,包含Load,Unload,Open,Create,Remove,FineFile等主要虚方法,用于对应各具体Archive来实现. R ...

  5. 第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能

    第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...

  6. 查看eclipse版本信息

    http://www.cnblogs.com/caiyuanzai/archive/2013/01/11/2855796.html 如果要查询eclipse数字版本号的话,可按如下进行操作: 1. 找 ...

  7. (个人)CentOS的JDK安装

    一. 卸载JDK 1. 通过如下命令查看当前JDK的相关内容 rpm -qa | grep java 2. 如果出现如下内容 java-1.7.0-openjdk-1.7.0.9-2.3.4.1.el ...

  8. 纯CSS3实现牛奶般剔透的3D按钮特效

    今天我们要来看一款非常特别的纯CSS3 3D按钮,它的外观酷似纯白剔透的牛奶,点击按钮的时候还会出现一种很柔和的弹力效果.按钮按下时,按钮会轻轻的弹动一下,非常逼真.本文我们在观赏演示的同时,也将源代 ...

  9. 基于Redis实现分布式锁以及任务队列

    一.前言 双十一刚过不久,大家都知道在天猫.京东.苏宁等等电商网站上有很多秒杀活动,例如在某一个时刻抢购一个原价1999现在秒杀价只要999的手机时,会迎来一个用户请求的高峰期,可能会有几十万几百万的 ...

  10. Docker命令之 save

    docker save : 将指定镜像保存成 tar 归档文件. 语法 docker save [OPTIONS] IMAGE [IMAGE...] OPTIONS说明: -o :输出到的文件. 实例 ...