Python与设计模式--迭代器模式

23种计模式之 前言 +(5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、+(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、+(11)策略模式、责任链模式、命令模式、中介者模式、模板模式、迭代器模式、访问者模式、观察者模式、解释器模式、备忘录模式、状态模式 + 设计原则

17-Python与设计模式--迭代器模式

一、迭代器与生成器

python 复制代码
今天的主角是迭代器模式。在python中,迭代器并不用举太多的例子,因为python中的迭代器应用实在太多了
(不管是python还是其它很多的编程语言中,实际上迭代器都已经纳入到了常用的库或者包中)。
而且在当前,也几乎没有人专门去开发一个迭代器,而是直接去使用list、string、set、dict等
python可迭代对象,或者直接使用__iter__和next函数来实现迭代器。

如下例:

bash 复制代码
if __name__=="__main__":
    lst=["hello Alice","hello Bob","hello Eve"]
    lst_iter=iter(lst)
    print lst_iter
    print lst_iter.next()
    print lst_iter.next()
    print lst_iter.next()
    print lst_iter.next()

打印如下:

hello Alice hello Bob hello Eve Traceback (most recent call last):

File "D:/WorkSpace/Project/PyDesignMode/example.py", line 719, in

print lst_iter.next() StopIteration

在这种迭代器的使用过程中,如果next超过了迭代范围,会抛出异常。

在python对象的方法中,也可以轻易使用迭代器模式构造可迭代对象,

如下例:

bash 复制代码
class MyIter(object):
    def __init__(self, n):
        self.index = 0
        self.n = n
    def __iter__(self):
        return self
    def next(self):
        if self.index < self.n:
            value = self.index**2
            self.index += 1
            return value
        else:
            raise StopIteration()

__iter__和next实现了迭代器最基本的方法。如下方式进行调用:

bash 复制代码
if __name__=="__main__":
    x_square=MyIter(10)
    for x in x_square:
        print x

打印如下:

0 1 4 9 16 25 36 49 64 81

注意__iter__方法中的返回值,由于直接返回了self,因而该迭代器是无法重复迭代的,

如以下业务场景:

bash 复制代码
if __name__=="__main__":
    x_square=MyIter(10)
    for x in x_square:
        print x
    for x in x_square:
        print x

只能打印一遍平方值。解决办法是,在__iter__中不返回实例,而再返回一个对象,写成:

bash 复制代码
def __iter__(self):
    return MyIter(self.n)

这样,在每次迭代时都可以将迭代器"初始化",就可以多次迭代了。

另外,在python中,使用生成器可以很方便的支持迭代器协议。生成器通过生成器函数产生,

生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果,

在每个结果之间挂起和继续它们的状态,来自动实现迭代协议。

如下例:

bash 复制代码
def MyGenerater(n):
    index=0
    while index<n:
        yield index**2
        index+=1

注意,这是个函数。在每次调用生成器,得到返回结果后,现场得以保留,下次再调用该生 成器时,返回保留的现场从yield后继续执行程序。

bash 复制代码
if __name__=="__main__":
    x_square=MyGenerater(10)
    for x in x_square:
        print x

二、迭代器模式

bash 复制代码
迭代器模式的定义如下:它提供一种方法,访问一个容器对象中各个元素,而又不需要暴露对象的内部细节。
相关推荐
Ulyanov42 分钟前
卡尔曼滤波技术博客系列:第四篇:多目标跟踪:数据关联与航迹管理
python·目标跟踪·系统仿真·雷达电子战·仿真引擎
Three~stone1 小时前
MATLAB vs Python 两者区别和安装教程
开发语言·python·matlab
soragui1 小时前
【Python】第 1 章:Python 解释器原理
开发语言·python
Ulyanov1 小时前
卡尔曼滤波技术博客系列:第三篇 雷达目标跟踪:运动模型与坐标转换
python·目标跟踪·系统仿真·雷达电子战
nimadan121 小时前
生成剧本杀软件2025推荐,创新剧情设计工具引领潮流
人工智能·python
极光代码工作室1 小时前
基于深度学习的智能垃圾分类系统
python·深度学习·神经网络·机器学习·ai
MediaTea2 小时前
Pandas 操作指南(二):数据选取与条件筛选
人工智能·python·机器学习·数据挖掘·pandas
小陈工2 小时前
Python Web开发入门(十二):使用Flask-RESTful构建API——让后端开发更优雅
开发语言·前端·python·安全·oracle·flask·restful
无心水2 小时前
20、Spring陷阱:Feign AOP切面为何失效?配置优先级如何“劫持”你的设置?
java·开发语言·后端·python·spring·java.time·java时间处理
wwdoffice01102 小时前
薄 膜 干 涉
设计模式