迭代器

python 之迭代器

孤街醉人 提交于 2019-12-19 12:55:59
我们已经知道,可以直接作用于 for 循环的数据类型有以下几种: 一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等; 一类是 generator ,包括生成器和带 yield 的generator function。 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。 可以使用 isinstance() 判断一个对象是否是 Iterable 对象: >>> from collections import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('abc', Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False 而生成器不但可以作用于 for 循环,还可以被 next() 函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续返回下一个值了。 可以被 next() 函数调用并不断返回下一个值的对象称为迭代器: Iterator 。 可以使用 isinstance() 判断一个对象是否是

迭代器模式(Iterator)

隐身守侯 提交于 2019-12-19 10:25:04
一、迭代器模式介绍 迭代器模式: 提供一种方法顺序的访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 一般情况,我们自己开发时很少自定义迭代器,因为java本身已经把迭代器做到内部中了(比如:常用的list和set中都内置了迭代器)。 当然,如果真有这种需求需要我们自定义迭代器的话,可以参考jdk的迭代器实现方式来实现自己的迭代器。 迭代器是可以 从前往后 ,或者 从后往前 遍历的。 为遍历不同聚集结构提供如:开始,下一个,是否有下一个,是否结束,当前哪一个等等的一个统一接口。 迭代器模式UML图: 聚集类:Aggregate(抽象类)和ConcreteAggregate(具体聚集类)表示聚集类,是用来存储迭代器的数据。 在Aggregate(抽象类)中有一个CreateIterator方法,用来获取迭代器 迭代器:迭代器用来为聚集类提供服务,提供了一系列访问聚集类对象元素的方法。 二、模拟迭代器的实现 首先定义一个迭代器的抽象,这里使用接口定义 1 2 3 4 5 6 7 8 9 10 //迭代器接口 public interface MyIterator { void first(); //将游标指向第一个元素 void next(); //将游标指向下一个元素 boolean hasNext(); //判断是否有下一个元素 boolean isFirst(); /

迭代器模式

倾然丶 夕夏残阳落幕 提交于 2019-12-19 09:45:11
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 介绍 意图: 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 主要解决: 不同的方式来遍历整个整合对象。 何时使用: 遍历一个聚合对象。 如何解决: 把在元素之间游走的责任交给迭代器,而不是聚合对象。 关键代码: 定义接口:hasNext, next。 应用实例: JAVA 中的 iterator。 优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。 缺点: 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。 使用场景: 1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。 注意事项: 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。 实现

Python可迭代对象与迭代器详解

牧云@^-^@ 提交于 2019-12-18 22:29:02
Python可迭代对象与迭代器详解 首先先来了解几个概念 可迭代对象 (Iterable) : 实现了 __iter__ 方法的对象就是可迭代对象 (生成迭代器的对象) 迭代器 (iterator) : __iter__ 方法返回的, 同时实现了 __iter__ 方法与 __next__ 方法的对象就是迭代器 (真正执行迭代的对象) 迭代: 调用迭代器的 __next__ 方法使之返回一个元素 迭代器耗尽: 迭代器主动抛出了 StopIteration 异常, 就表示迭代器耗尽, Python会自动处理这个异常 (迭代器同时也是可迭代对象, 可迭代对象不一定是迭代器) (可迭代对象是用来创建迭代器的, 迭代器是通过可迭代对象创建的, 真正执行迭代的是迭代器) 通过 iter(Iterable) 内置函数 创建迭代器 通过 next(iterator) 内置函数或者 iterator.send(object) 方法创建迭代器进行 迭代 实现迭代器 请仔细反复阅读以下代码, 可以复制到代码编辑器运行查看 # 可迭代对象 class MyIterable ( object ) : def __init__ ( self , items ) : self . items = items def __iter__ ( self ) : print ( 'MyIterable.__iter_

迭代器

﹥>﹥吖頭↗ 提交于 2019-12-18 18:42:14
1.1. 迭代器 为了方便的处理集合中的元素 ,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.该对象就叫做迭代器(Iterator). 对 Collection 进行迭代的类,称其为迭代器。还是面向对象的思想,专业对象做专业的事情,迭代器就是专门 取出 集合元素的对象。但是该对象比较特殊,不能直接创建对象(通过 new),该对象是以内部类的形式存在于每个集合类的内部。 如何获取迭代器? Collection接口中定义了获取集合类迭代器的方法(iterator()),所以所有的Collection体系集合都可以获取自身的迭代器。 正是由于 每一个容器都有取出 元素的 功能。这些功能定义都一样,只不过实现的具体方式不同 ( 因为每一个容器的数据结构不一样 ) 所以 对共性的取出功能 进行了抽取,从而出现了 Iterator 接口。而每一个容器都在其内部对该接口进行了内部类的实现。也就是将取出方式的细节进行封装。 1.1.1. Iterable Jdk1.5 之后添加的新接口 , Collection 的父接口 . 实现了 Iterable 的类就是可迭代的 .并且 支持增强 for 循环 。该接口只有一个方法即获取迭代器的方法iterator ()可以获取每个容器自身的迭代器 Iterator 。( Collection

C++STL 学习 之 迭代器(iterators)

戏子无情 提交于 2019-12-18 16:08:58
首先要明确迭代器是一个抽象的设计概念,是一种设计模式. Design Patterns 一书中对 Iterators模式的定义如下:提供一种方法,使之能够依序访问某个容器所包含的各个元素,而无需暴露该容器的内部表达方式,也就是说,Iterators的实现依赖于具体的容器,是针对某种容器特别设计的,只是对外提供一套统一的访问接口. 此外,STL的设计思想就是将数据容器和算法分离,彼此独立设计,最后用一种方式将他们粘合在一起,而Iterators便是这其间的粘合剂.从这个角度看,Iterators设计模式正好可以胜任该目标. 1.STL中 Iterators 的设计思路 迭代器本质是一种智能指针,是一种类似指针的对象,因此,对迭代器的设计主要是实现解引用( )和成员访问(->),所以,主要的编程工作就是对operator he operator->进行重载 2.迭代器的相应型别(associated types) 迭代器的相应型别指的是迭代器所指之物的类型。 思考:假如要声明一个变量,该变量的类型是迭代器所指对象的类型,如何声明?解决办法:利用函数模板中的参数推导机制。 3. Traits(特性萃取)编程技巧 为了解决如何断定迭代器所指之物的类型问题,相应型别无法完美解决,引入Traits技巧 如何实现? (1)首先,在类模板中声明一个内置类型:typedef T value_type

C#中的IEnumerable接口深入研究

人盡茶涼 提交于 2019-12-18 12:41:38
C#和VB.NET中的LINQ提供了一种与SQL查询类似的“对象查询”语言,对于熟悉SQL语言的人来说除了可以提供类似关联、分组查询的功能外,还能获取编译时检查和Intellisense的支持,使用Entity Framework更是能够自动为对象实体的查询生成SQL语句,所以很受大中型信息系统设计者的青睐。 IEnumerable这个接口可以说是为了这个特性“量身定制”,再加上微软提供的扩展(Extension)方法和Lambda表达式,给开发者带来了无穷的便利。本人在最近的开发工作中使用了大量的这种特性,同时在调试过程中还遇到了一个小问题,那么正好趁此机会好好研究一下相关原理和实现。 先从一个现实的例子开始吧。假如我们要做一个商品检索功能(这只是一个例子,我当然不可能把公司的产品业务也在这里贴出来),其中有一个检索条件是可以指定厂家的名称并进行模糊匹配。厂家的包括两个名称:注册名称和一般性名称,我们只按一般性名称进行检索。当然你可以说直接用SQL查询就行了,但是我们的系统是以实体对象为核心进行设计的,厂家的数量也不会太多,大概1000条。为了不增加系统的复杂性,只考虑使用现有的数据访问层接口进行实现(按过滤条件获取商品,以及获取所有厂商),这时LINQ的便捷性就体现出来了。 借助IEnumerable接口和其辅助类,我们可以写出以下代码: public

python 迭代器

房东的猫 提交于 2019-12-18 08:46:30
学习材料: learning python 4th 例子代码: 1 ### file: script1.py2 3 # A first Python script4 import sys # Load a library module5 print(sys.platform)6 print(2 ** 100) # Raise 2 to a power7 x = 'Spam!'8 print(x * 8) # String repetition 开始测试: 结果1: 1 >>> f = open('script1.py') 2 >>> f.readline() 3 '### file: script1.py\n' 4 >>> f.readline() 5 '\n' 6 >>> f.readline() 7 '# A first Python script\n' 8 >>> f.readline() 9 'import sys # Load a library module\n'10 >>> f.readline()11 'print(sys.platform)\n'12 >>> f.readline()13 'print(2 ** 100) # Raise 2 to a power\n'14 >>> f.readline()15 "x = 'Spam!'\n"16 >>> f

第六周学习总结

 ̄綄美尐妖づ 提交于 2019-12-18 01:08:28
这个星期主要内容如下: 迭代器(Iterator)是一个对象,它的工作是遍历并选择序列中的对象,它提供了一种访问一个容器(container)对象中的各个元素,而又不必暴露该对象内部细节的方法。 (1) 每种容器类型都定义了自己的迭代器类型,如vector: vector<int>::iterator iter;这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。 1) 正向迭代器,定义方法如下: 容器类名::iterator 迭代器名; 2) 常量正向迭代器,定义方法如下: 容器类名::const_iterator 迭代器名; 3) 反向迭代器,定义方法如下: 容器类名::reverse_iterator 迭代器名; 4) 常量反向迭代器,定义方法如下: 容器类名::const_reverse_iterator 迭代器名; (2) 使用迭代器读取vector中的每一个元素: vector<int> ivec(10,1); for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter) { *iter=2; //使用 * 访问迭代器所指向的元素 } vector<int>::const_iterator 和 const vector<int>:

《C++标准程序库》学习笔记3 -- 第五章

こ雲淡風輕ζ 提交于 2019-12-18 00:16:20
这一章主要是大概的介绍一下容器,迭代器,算法,仿函数等,为6,7,8,9章的概括。 1.(P74) STL的基本概念就是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当粘合剂。任何算法都可以和任何容器交互运作。 2.(P75) 容器(Containers) 容器类别用来管理一组元素。 总的来说,容器分为两大类: ①.序列式容器(Sequence containers),是可序(ordered)群集。包括vector, queue, list。 ②.关联式容器(Associative containers),是已序(sorted)群集。包括set, multiset, map, multimap。 关联式容器依据特定的排序准则,自动为其元素排序。排序准则以函数形式呈现,用以比较元素值(value)或元素键(key)。缺省情况以operator< 进行比较,不过也可以自己提供比较函数,定义出不同的排序准则。 eg set < int > tk1; // 从小到大排序 set < int , greater < int > > tk2; // 从大到小排序 序 通常关联式容器是由二叉排序树实作出来的。 另外,C++标准库还提供了容器配接器(Container Adpters), stack, queue, priority queue. 3.