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. Hbase框架原理及相关的知识点理解、Hbase访问MapReduce、Hbase访问Java API、Hbase shell及Hbase性能优化总结

    转自:http://blog.csdn.net/zhongwen7710/article/details/39577431 本blog的内容包含: 第一部分:Hbase框架原理理解 第二部分:Hbas ...

  2. JAVA内部线程1

    在做一个RuntimeException的异常验证的时候,发现即便是JVM的main线程遇到了此类异常,JVM也不一定进行退出,查阅了相关资料:                线   程        ...

  3. tortoiseSVN 合并代码方法

    http://blog.csdn.net/zhuyong0722/article/details/8965095 转自:http://tangzhifei.iteye.com/blog/1143553 ...

  4. CentOS 6.8 安装 RabbitMQ

    放上来做个备份. 1.下载RabbitMQ http://www.rabbitmq.com/download.html 选择 RHEL/CentOS 6.x 下载即可. 或者 http://www.r ...

  5. 三个支持正则表达式的行处理的工具: grep/sed/awk

    grep: 全称Global Regular Expression Print, 是干什么的,不多说了: 用法:grep [-options] [pattern] [filename] 选项: -c: ...

  6. Java数组扩展

    Java中,数组初始化后如何扩展数组? 示例 以下示例显示如何在创建新并初始化数组后扩展数组. package com.yiibai; public class ExtendingArray { pu ...

  7. JDBC删除数据实例

    在本教程将演示如何在JDBC应用程序中,删除数据库表中数据记录. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式的数据库表中删除数据记录. 要执行以下示例,需要用 ...

  8. 114ic电子元器件网

    http://www.114ic.cn/datasheet-pdf/TPA0211DGN-163932.html

  9. (转)关于yuv 格式:planar和semi-planar格式

    关于yuv 格式 YUV 格式通常有两大类:打包(packed)格式和平面(planar)格式.前者将 YUV 分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);而 ...

  10. Websphere下删除某个文件(ibm-partialapp-delete.props)

    Websphere下删除某个文件(ibm-partialapp-delete.props)