迭代器

行为型模式(三) 迭代器模式(Iterator)

断了今生、忘了曾经 提交于 2019-11-27 10:15:39
动机(Motivate) 在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能。  使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。 意图(Intent) 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 ——《设计模式》GoF 结构图 模式的组成 从迭代器模式的结构图可以看出,它涉及到四个角色,它们分别是: (1)、抽象迭代器(Iterator) :抽象迭代器定义了访问和遍历元素的接口,一般声明如下方法:用于获取第一个元素的first(),用于访问下一个元素的next(),用于判断是否还有下一个元素的hasNext(),用于获取当前元素的currentItem(),在其子类中将实现这些方法。 (2)、具体迭代器(ConcreteIterator) :具体迭代器实现了抽象迭代器接口,完成对集合对象的遍历,同时在对聚合进行遍历时跟踪其当前位置。 (3)、抽象聚合类(Aggregate) :抽象聚合类用于存储对象,并定义创建相应迭代器对象的接口,声明一个createIterator()方法用于创建一个迭代器对象。 (4)、具体聚合类

STL标准模板库之set

不想你离开。 提交于 2019-11-27 09:52:20
目录 一、关联式容器 二、什么是set? 特点 优缺点和适用场景: 三、定义及初始化 四、基本操作 1)容量函数 2)修改函数 3)迭代器 4)其他函数 五、与序列容器的不同点 一、关联式容器 关联式容器依据特定的排序准则,自动为其元素排序。排序准则以函数形式呈现,用来比较元素值(value)或元素键(key)。缺省情况下以 operator< 进行 比较,不过你也可以提供自己的比较函数,定义出不同的排序准则。 通常关联式容器由二叉树(binary tree)实现。在二叉树中,每个元素(节 点)都有一个父节点和两个子节点;左子树的所有元素都比自己小,右子树的所有元素都比自己大。关联式容器的差别主要在于元素的类型以及处理重复元素时的方式。 STL预先定义好的关联式容器有:集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。 二、什么是set? 集合(set)简而言之是一种包含已排序对象的关联容器,不允许有重复元素。 一个集合通过一个链表来组织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些慢。具体实现采用了红黑树的平衡二叉树的数据结构。 特点 set中的元素都是排好序的。 set中没有重复的元素。 map和set的插入删除效率比用其他序列容器高,因为对于关联容器来说,不需要做内存拷贝和内存移动。 优缺点和适用场景

迭代器

时光怂恿深爱的人放手 提交于 2019-11-27 09:30:55
Java中有的多的集合,他们的底层数据结构是不同的,因此在集合遍历的时候采取的方式也各不相同,迭代器抽取出了集合的共有功能,出现了Iterator接口。在遍历集合的时候不用在意集合的具体内部结构。 迭代器方法: 创建Person类: public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { if (age >= 0 || age <= 200) this.age = age; } public Person(String name, int age) { this.name = name; this.age = age; } } 创建IteratorDemo类,包含遍历集合的三种方法: import java.util.ArrayList; import java.util.Iterator; public class IteratorDemo { public void addPerson

Python中下划线

旧时模样 提交于 2019-11-27 09:27:46
Python中下划线---完全解读 Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划线作为变量名的开始。 因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。一般来讲,变量名_xxx被看作是“私有 的”,在模块或类外不可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。因为变量名__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。 “单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量; “双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。 以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。 现在我们来总结下所有的系统定义属性和方法, 先来看下保留属性: >>> Class1.__doc__ # 类型帮助信息

Java 迭代器

醉酒当歌 提交于 2019-11-27 08:38:06
目前先简单使用认识迭代器,留坑,后续深入了解 迭代器 从集合篇了解到,Java集合容器的种类有很多种,ArrayList、LinkedList、HashSet...,每种容器都有自己的特点,ArrayList底层维护的是一个数组;LinkedList是链表结构的;HashSet依赖的是哈希表,每种容器都有自己特有的数据结构。 因为容器的内部结构不同,很多时候可能不知道该怎样去遍历一个容器中的元素。所以为了使对容器内元素的操作更为简单,Java引入了 迭代器模式 ! 把访问逻辑从不同类型的集合类中抽取出来,从而避免向外部暴露集合的内部结构。 Iterator Iterator iterList = li.iterator(); while(iterList.hasNext()){ System.out.println(iterList.next()); } 最强大的迭代器 它是一个接口类型,它不关心集合或数组的类型 随时能 修改 和 删除 元素 能将遍历的操作与序列底层的结构分离,随时能换另一个遍历对象,降低了耦合性 这里之所以可以在遍历过程中删除元素而不影响索引,是需要使用接口自己的移除方法,否则还是会报错 Foreach for(int i :arr){ System.out.println(i); } 最方便的迭代器 需要先知道集合的类型,即需要访问内部的成员 失去了索引信息

迭代器

╄→尐↘猪︶ㄣ 提交于 2019-11-27 07:56:06
1.Iterator接口 (1)Iterator迭代器的作用: iterator主要用于遍历Collection中的元素 (2)Iterator遍历集合的过程: 当遍历集合时,首先调用集合的iterator()方法获取迭代器对象,使用hashNext()判断是否存在下一个元素, 如果存在(hashNext.equals(true)),调用next()方法取出元素;否则停止遍历元素。 (3)Iterator迭代器的工作原理: Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素 在Iterator的next()方法之前,迭代器的索引位于第1个元素之前,不指向任何元素。 当第一次调用迭代器的next()方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回。 当再次调用next(),迭代器的索引会指向第2个元素并将该元素返回。直到hashNext方法返回false,表示到达集合的末尾,终止对集合遍历。 当通过迭代器获取ArrayList集合中的元素时,会返回Object类型,如果想得到特定类型的元素,则需要强制类型转换。 来源: https://www.cnblogs.com/chaunceyji/p/11352334.html

迭代器的简要概述

我的未来我决定 提交于 2019-11-27 07:53:31
迭代器的简要概述 在说迭代器之前我们先来看一下以下的代码: for element in iterable 在我们之前学习的for循环中,实际上就是从迭代器中一个一个地拿元素。 我们注意到,在python中有许多类型的对象可以被定义为可迭代的。基本容器类型,如列表、元组和集合,都可以被定义为迭代类型。此外,字符串也可以产生它的字符迭代,字典可以生成它的键的迭代,文件可以产生它的行的迭代。用户自定义类型也可以迭代。在python中,迭代器的机制基于以下的规定: 迭代器是一个对象,通过一系列的值来管理迭代。如果 i 定义为一个迭代器对象,那么每次调用内置函数 next(i) ,都会从当前的序列中产生一个后续的元素;如果没有后续的元素了,那么就会抛出一个 StopIteration 异常。 对象 object 是可迭代的,那么通过语法 iter(object) 可以产生一个 迭代器 。 通过这些定义, list 的实例是可迭代的, 但是它本身不是一个迭代器 。比如 data = [1,3,5,7] 调用 next(data) 是 非法的 。只有通过 i = iter(data) 则可以产生一个迭代器对象,然后调用 next(i) 将返回列表中的元素。python中的 for 循环语法就是使这个过程自动化,为可迭代对象创造了一个迭代器,然后反复调用下一个元素知道捕获

概念术语

我的梦境 提交于 2019-11-27 06:10:10
1. 格式化输出:利用format "{1} {0} {1}".format("hello", "world") # 设置指定位置 'world hello world' 或 %s,%d % str1,int1 * format的四种玩法(python推荐使用format做格式化输出) ```python # 第一种 按位置占位 跟%s原理一致 str1 = 'my name is {}, my age is {}'.format(18,'age') print(str1) # 第二种 按索引占位 str1 = 'my name is {1}, my age is {0}'.format('egon',18) print(str1) # 第三种 指名道姓占位(关键字传参) str1 = 'my name is {name}, my age is {age}'.format(name='egon',age=18) print(str1) #第四种 format简写,两个变量进行拼接时用 name='egon' age=18 str1 = f'my name is {name}, my age is {age}' print(str1) ``` 2. 形参 实参 位置参数 关键字参数 默认参数 形参: def func(arg1,arg2) arg1,arg2即为形参 实参

迭代器 续

感情迁移 提交于 2019-11-27 06:08:52
在python中,itreable可迭代的——>--iter--。即只要含有--iter--方法的都是可以迭代的 如: [].__iter__() 迭代器——>__next__。通过next就可以从迭代器中一个一个·的·取值。 只要含有__iter__方法的都是可迭代的——可迭代协议。 迭代器协议 内部含有__iter__和__next__方法的都是迭代器。 from collections import Iterator from collections import Iterable class A: def __iter__(self):pass def __next__(self):pass a = A() print(isinstance(a,Iterator)) print(isinstance(a,Iterable)) View Code 当注释掉其中一个时 from collections import Iterator from collections import Iterable class A: #def __iter__(self):pass def __next__(self):pass a = A() print(isinstance(a,Iterator)) print(isinstance(a,Iterable)) View Code from

壹拾肆

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-27 05:57:15
函数进阶 一、三元表达式 ​ 条件成立时的返回值 if 条件 else 条件不成立时的返回值。 x = 1 if x == 1: print(1) else: print(0) print(1) if x == 1 else print(0) 1 1 ​ 三元表达式只支持双分支结构。 二、列表推到式 lt = [] for i in range(10): lt.append(i**2) print(lt) lt = [i ** 2 for i in range(10)] print(lt) ​ 列表推到式可直接实现幂运算。 dic = {'a': 1, 'b': 2} lt = [(k, v) for (k, v) in dic.items()] print(lt) [('a', 1), ('b', 2)] ​ 列表推到式可将字典转换成列表或者元组。 三、字典生成式 3.1 字典生成 dic = {'a': 1, 'b': 2} new_dic = {k * 2: v ** 2 for k, v in dic.items()} print(new_dic) {'aa': 1, 'bb': 4} ​ 字典生成式生成字典,还可以对k、v进行算术运算。 3.2 zip()方法 ​ zip(拉链函数)是压缩方法,是python内置方法的一种,()里应填入可迭代的对象。 z = zip([