两颗米随州网站建设,wordpress安装数据库端口,免费网络短剧,家居企业网站建设市场23种计模式之 前言 #xff08;5#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、#xff08;11#xff09;策略模式、责任链模式、命令模式、中介者模…23种计模式之 前言 5单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、11策略模式、责任链模式、命令模式、中介者模式、模板模式、迭代器模式、访问者模式、观察者模式、解释器模式、备忘录模式、状态模式 设计原则
17-Python与设计模式–迭代器模式
一、迭代器与生成器
今天的主角是迭代器模式。在python中迭代器并不用举太多的例子因为python中的迭代器应用实在太多了
不管是python还是其它很多的编程语言中实际上迭代器都已经纳入到了常用的库或者包中。
而且在当前也几乎没有人专门去开发一个迭代器而是直接去使用list、string、set、dict等
python可迭代对象或者直接使用__iter__和next函数来实现迭代器。如下例
if __name____main__:lst[hello Alice,hello Bob,hello Eve]lst_iteriter(lst)print lst_iterprint 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对象的方法中也可以轻易使用迭代器模式构造可迭代对象 如下例
class MyIter(object):def __init__(self, n):self.index 0self.n ndef __iter__(self):return selfdef next(self):if self.index self.n:value self.index**2self.index 1return valueelse:raise StopIteration()__iter__和next实现了迭代器最基本的方法。如下方式进行调用
if __name____main__:x_squareMyIter(10)for x in x_square:print x打印如下 0 1 4 9 16 25 36 49 64 81 注意__iter__方法中的返回值由于直接返回了self因而该迭代器是无法重复迭代的 如以下业务场景
if __name____main__:x_squareMyIter(10)for x in x_square:print xfor x in x_square:print x只能打印一遍平方值。解决办法是在__iter__中不返回实例而再返回一个对象写成
def __iter__(self):return MyIter(self.n)这样在每次迭代时都可以将迭代器“初始化”就可以多次迭代了。 另外在python中使用生成器可以很方便的支持迭代器协议。生成器通过生成器函数产生 生成器函数可以通过常规的def语句来定义但是不用return返回而是用yield一次返回一个结果 在每个结果之间挂起和继续它们的状态来自动实现迭代协议。 如下例
def MyGenerater(n):index0while indexn:yield index**2index1注意这是个函数。在每次调用生成器得到返回结果后现场得以保留下次再调用该生 成器时返回保留的现场从yield后继续执行程序。
if __name____main__:x_squareMyGenerater(10)for x in x_square:print x二、迭代器模式
迭代器模式的定义如下它提供一种方法访问一个容器对象中各个元素而又不需要暴露对象的内部细节。