迭代器

Java 中的迭代器 —— Iterator

半城伤御伤魂 提交于 2020-02-15 08:40:19
一、 Iterator 是什么? 1、迭代器模式 迭代器模式( Iterator Pattern )是一种非常常见的设计模式,这种模式用于顺序访问集合对象的元素,而不需要知道集合对象内部的实现方式。 所以,迭代器模式的优点就是: 简化了聚合类 。无论是增加新的聚合类还是增加迭代器类都会很方便,无须修改原有的代码。 它的优点也导致了它的缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类时也需要对应增加新的迭代器类,耦合度很高,这在一定程度上增加了系统的复杂性。 2、Iterator 接口 在 Java 中,提供了一个迭代器接口 Iterator ,把在集合对象中元素之间遍历的工作交给迭代器,而不是集合对象本身,迭代器为遍历不同的集合对象提供一个统一的接口。这就是 Java 集合框架中 Iterable 接口位于框架结构最顶层的原因。这其实也就是面向对象的思想。 二、Iterator 的使用 下面我们先看看 Iterator 是如何使用的。 1、Iterator 中的方法 先从 Iterator 接口的源码来分析一下: public interface Iterator < E > { boolean hasNext ( ) ; E next ( ) ; default void remove ( ) { throw new

JAVA中fail-fast机制

℡╲_俬逩灬. 提交于 2020-02-14 14:07:18
在JDK的Collection中我们时常会看到类似于这样的话: 例如,ArrayList: 注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测 bug。 HashMap中: 注意,迭代器的快速失败行为不能得到保证,一般来说,存在非同步的并发修改时,不可能作出任何坚决的保证。快速失败迭代器尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的程序的做法是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。 在这两段话中反复地提到”快速失败”。那么何为”快速失败”机制呢? “快速失败”也就是fail-fast,它是Java集合的一种错误检测机制。当多个线程对集合进行结构上的改变的操作时,有可能会产生fail-fast机制。记住是有可能,而不是一定。例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出

迭代器&生成器

痴心易碎 提交于 2020-02-14 00:25:06
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法: iter() 和 next() 。 字符串,列表或元组对象都可用于创建迭代器: ## 单独创建迭代器用法 list = [1,"qiao_2",3,"yan_4"] s=iter(list)  #创建迭代器 print(next(s)) #输出迭代器的下一个元素 print(next(s)) print(next(s)) print(next(s)) for与创建迭代器 list = [1,"qiao_2",3,"yan_4"] it = iter(list) # 创建迭代器对象 for i in it: print (i, end=" ") #不回车输出 也可以使用 next() 函数: import sys  #引入sys模块 list = [1,"qiao_2",3,"yan_4"] s = iter(list)  #创建迭代器 while True: try: print (next(s)) except StopIteration: sys.exit() 生成器 在 Python 中,使用了 yield 的函数被称为生成器(generator)。

python3 迭代器与生成器.py

允我心安 提交于 2020-02-13 22:04:57
""" 模块:python3 迭代器与生成器.py 参考:https://www.runoob.com/python3/python3-iterator-generator.html 知识点: 1.迭代器 迭代器是一个可以记住 遍历位置 的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 迭代器只能往前不会后退。 迭代器有两个基本的方法:iter() 和 next()。这区别于可迭代对象。 字符串,列表或元组对象都可用于创建迭代器。 2.生成器。 """ # 一、迭代器 # 1.用列表创建迭代器和迭代。 list1 = [1, 2, 3, 4] it = iter(list1) # 创建迭代器对象 # print("it:", it) # it: <list_iterator object at 0x0000021F28120C70> print(next(it)) # 输出迭代器的下一个元素 # 1 print(next(it)) # 2 # 1.2.迭代器对象可以使用常规for语句进行遍历。 print("1.2:") list1 = [1, 2, 3, 4] it = iter(list1) # 创建迭代器对象 for x in it: print(x, end=" ") # 1 2 3 4 print() # 也可以使用 next() 函数。

C++中STL的容器适配器以及各容器的方法

空扰寡人 提交于 2020-02-13 17:51:38
一.容器适配器 1.stack 需要引入的头文件: #include<stack> 初始化方式: stack<int> stk; 成员函数介绍: stk.empty(); //判断stack是否为空,为空返回true,否则返回false stk.size(); //判断stack中元素的个数 stk.pop(); //删除栈顶元素,但不返回其值 stk.top(); //返回栈顶元素的值,但不删除此元素 stk.push(item) //在栈顶压入新元素item 2.queue 需要引入的头文件: #include<queue>; 初始化方式: queue<int> q; 成员函数介绍: q.empty(); //判断队列是否为空 q.size(); //返回队列长度 q.push(item); //对于queue,在队尾压入一个新元素 //对于priority_queue,在基于优先级的适当位置插入新元素 q.front(); //返回队首元素的值,但不删除该元素 q.back(); //返回队尾元素的值,但不删除该元素 q.top(); //返回具有最高优先级的元素值,但不删除该元素 二、常用容器用法介绍 1.vector 需要引入的头文件: #include<vector> using namespace std; 初始化方式: vector<int>obj; 成员函数介绍:

ES6最具魔力的特性——生成器

有些话、适合烂在心里 提交于 2020-02-13 04:36:22
ES6生成器(Generators)简介 我们从一个示例开始: function* quips(name) { yield "你好 " + name + "!"; yield "希望你能喜欢这篇介绍ES6的译文"; if (name.startsWith("X")) { yield "你的名字 " + name + " 首字母是X,这很酷!"; } yield "我们下次再见!"; } 这段代码看起来很像一个函数,我们称之为生成器函数,它与普通函数有很多共同点,但是二者有如下区别: 普通函数使用function声明,而生成器函数使用function*声明。 在生成器函数内部,有一种类似return的语法:关键字yield。二者的区别是,普通函数只可以return一次,而生成器函数可以yield多次(当然也可以只yield一次)。在生成器的执行过程中,遇到yield表达式立即暂停,后续可恢复执行状态。 这就是普通函数和生成器函数之间最大的区别,普通函数不能自暂停,生成器函数可以。 生成器做了什么? 当你调用quips()生成器函数时发生了什么? > var iter = quips("jorendorff"); [object Generator] > iter.next() { value: "你好 jorendorff!", done: false } > iter.next()

python iter,迭代器&dict,字典详解

不打扰是莪最后的温柔 提交于 2020-02-12 11:25:00
可以直接作用于for循环的对象统称为可迭代对象(Iterable)。 可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator)。 所有的Iterable均可以通过内置函数iter()来转变为Iterator。 迭代器为类序列对象提供了一个类序列的接口。python的迭代无缝地支持序列对象,而且它还允许程序员迭代非序列类型,包括用户定义的对象。迭代器用起来很灵巧,你可以迭代不是序列但表现处序列行为的对象,例如字典的键、一个文件的行,等等。迭代器的作用如下: >>> i=iter('abcd') >>> print i.next() a >>> print i.next() b >>>print i.next() c    s = {'one':1,'two':2,'three':3} print s {'three': 3, 'two': 2, 'one': 1} >>> m = iter(s) >>> print m.next() three >>> print m.next() two >>> print m.next() one dict {'key':value,'key':value} 查询可以用get方法 ,也可以直接通过key查询,不过这样如果不存在这个key将会报错,而get会给出None  可以直接添加或者更改dict,dict('key')

python中迭代器和iter()函数

流过昼夜 提交于 2020-02-12 11:06:59
迭代器为类序列对象提供了一个类序列的接口。python的迭代无缝地支持序列对象,而且它还允许程序员迭代非序列类型,包括用户定义的对象。迭代器用起来很灵巧,你可以迭代不是序列但表现处序列行为的对象,例如字典的键、一个文件的行,等等。迭代器的作用如下: •提供了刻扩展的迭代器接口; •对列表迭代带来了性能上的增强; •在字典迭代中性能提升; •创建真正的迭代接口,而不是原来的随即对象访问; •与所有已经存在的用户定义的类以及扩展得模拟序列和映射的对象向后兼容; •迭代非序列集合(例如映射和文件)时,可以创建更简洁可读的代码 #iter and generator#the first try#=================================i = iter('abcd')print i.next()print i.next()print i.next()s = {'one':1,'two':2,'three':3}print sm = iter(s)print m.next()print m.next()print m.next() D:\Scirpt\Python\Python高级编程>python ch2_2.py a b c {'three': 3, 'two': 2, 'one': 1} three two one 来源: https://www.cnblogs

迭代器、生成器、可迭代对象

两盒软妹~` 提交于 2020-02-11 12:33:22
1、迭代器 可以作用于for循环的数据类型有如下几种: 1、一类是集合数据类型:list、tuple、dict、set、str等; 2、一类是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对象: >>> from collections import

装饰器,迭代器,生成器

匆匆过客 提交于 2020-02-10 16:27:14
1. 装饰器 定义: 在函数运行前或运行后可以添加额外功能且不影响该函数原有的代码功能,并且还可以进行函数执行后的清理工作。 语法 语法: @func1 def func2(): pass 装饰器做得事情就是func1(func2)我们传递了一个函数对象到我们的装饰器里面然后先执行装饰器func1其中的内容,然后再执行函数func2 三类装饰器 1.普通无参装饰器 def wai(func): # func 被装饰函数 def nei(): # a,b 表明被装饰函数的参数 print('函数执行前添加') res = func() print('函数执行后添加') return res # 内层函数将外层函数调用的被装饰函数作为参数返回 return nei # 外层函数返回内层函数的函数名 @wai def func(): print("这是一个函数") return 1 func() 2.被装饰函数带参数 def wai(func): # func 被装饰函数 def nei(a,b): # a,b 表明被装饰函数的参数 a = a + 1 b = b + 1 print('函数执行前添加') res = func(a,b) print('函数执行后添加') return res # 内层函数将外层函数调用的被装饰函数作为参数返回 return nei #