迭代器

MyBatis框架之迭代器模式

落花浮王杯 提交于 2020-01-20 00:06:25
迭代器模式,一直没用过,也不会用。恰巧MyBatis框架中也使用到了迭代器模式,而且看起来还比较简单,在以后的工作中,若有需要咱们可模仿它的套路来干。 直接上代码 import java.util.Iterator; /** * @author Clinton Begin */ public class PropertyTokenizer implements Iterator<PropertyTokenizer> { private String name; private final String indexedName; private String index; private final String children; // 通过这个children属性建立前后两次迭代的关系 public PropertyTokenizer(String fullname) { int delim = fullname.indexOf('.'); if (delim > -1) { name = fullname.substring(0, delim); children = fullname.substring(delim + 1); } else { name = fullname; children = null; } indexedName = name; delim =

python魔法方法-自定义序列

北城以北 提交于 2020-01-19 21:06:29
  自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等)。   如果要实现这个功能,就要遵循 python 的相关的协议。所谓的协议就是一些约定内容。例如,如果要将一个类要实现迭代,可以实现 __iter__() 或者 __getitem__()其中一个方法 。   下面是一下相关的魔法方法: __len__(self) 返回容器的长度。 可变和不可变容器 都要实现它,这是协议的一部分。 __getitem__(self, key) 定义当某一项被访问时,使用self[key]所产生的行为。这也是 可变容器和不可变容器 协议的一部分。如果键的类型错误将产生TypeError;如果key没有合适的值则产生KeyError。 __setitem__(self, key, value) 定义当一个条目被赋值时,使用self[key] = value所产生的行为。这也是 可变容器协议 的一部分。而且,在相应的情形下也会产生KeyError和TypeError。 __delitem__(self, key) 定义当某一项被删除时所产生的行为。(例如del self[key])。这是 可变容器 协议的一部分。当你使用一个无效的键时必须抛出适当的异常。 __iter__(self) 返回一个迭代器

Python函数进阶:闭包、装饰器、生成器、协程

南楼画角 提交于 2020-01-19 13:21:34
/*--> */ /*--> */ 返回目录 本篇索引 (1) 闭包 (2) 装饰器 (3) 生成器 (4) 协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++、Java、JavaScript等都实现或部分实现了闭包功能,很多高级应用都会依靠闭包实现。 一般专业文献上对闭包的定义都比较拗口,比如:“将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象称为闭包。” 其实,简单来说,你可以将闭包看成是一个轻载的类,这个类只有一个函数方法,并且只有为数不多的几个成员变量。 闭包的优点是:实现起来比类稍微轻巧一点(意思就是可以少敲一些代码),并且运行速度比类要快得多(据说约快50%)。下面是一个定义闭包的简单例子: def foo(x, y): def hellofun(): print('hellofun x is %d, y is %d.' %(x,y)) return hellofun a = foo(1,2) b = foo(30,40) a() b() # 运行结果为: hellofun x is 1, y is 2. hellofun x is 30, y is 40. 上例中,foo就定义了一个闭包,它将内部定义的函数hellofun返回(但并不运行这个函数), 同时将入参x,y作为以后hellofun要运行时的环境

python基础学习10-迭代器

别等时光非礼了梦想. 提交于 2020-01-19 01:37:11
迭代器 Iterable可迭代对象 可以直接作用于for 循环的对象统称为可迭代对象(Iterable) 可以直接作用于for的数据类型一般分两种: 集合数据类型,例如list,tuple,set,dict,string generator,包括生成器或带yield的generator function 可以用isinstance()判断一个对象是否是Iterable对象。 导入from collections import Iterable from collections import Iterable #导入 print ( isintance ( [ ] , Iterable ) ) #返回true 迭代器 Iterator 可作用于for循环 被next()函数不断调用返回下一个值,直到提示StopIterable错误结束 可以用isinstance()判断一个对象是否是Iterable对象。 导入from collections import Iterator from collections import Iterator print ( isinstance ( [ ] , Iterator ) ) #返回False print ( isinstance ( ( x for x in range ( 3 ) ) , Iterator ) ) #返回true from

Java设计模式详解-迭代器模式

你说的曾经没有我的故事 提交于 2020-01-18 18:55:29
1 概念 1.1 定义 提供一种方法,顺序访问同一集合对象中的各个元素,而又不暴露该对象的内部表示 1.2 类型 行为型 迭代器模式(Iterator Pattern) 目前已经是一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发,其定义如下: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。) 迭代器是为容器(能容纳对象的所有类型都可以称之为容器,例如Collection、Set等)服务的,迭代器模式就是为解决遍历这些容器中的元素而诞生的 1.3 通用类图 迭代器模式提供了遍历容器的方便性,容器只要管理增减元素就可以了,需要遍历时交由迭代器执行 1.4 角色 Iterator抽象迭代器 抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法: first()获得第一个元素 next()访问下一个元素 hasNext()是否已经访问到底部 ConcreteIterator具体迭代器 具体迭代器角色要实现迭代器接口,完成容器元素的遍历。 Aggregate抽象容器

迭代 装饰器 闭包

给你一囗甜甜゛ 提交于 2020-01-18 11:16:28
迭代器: 包含yield表达式的函数是特殊的函数,叫做生成器函数(generator function),被调用时将返回一个迭代器(iterator),调用时可以使用next或send(msg)。它的用法与return相似,区别在于它会记住上次迭代的状态,继续执行。 send(msg)与next()的区别在于send可以传递参数给yield表达式,这时传递的参数会作为yield表达式的值,而yield的参数是返回给调用者的值。初始调用时必须先next()或send(None),否则会报错。 举个例子: 首先生成一个迭代器f,f.next()会使生成器函数执行到yield,生成一个值然后挂起。 然后f.next()或f.send(msg)会在生成器函数内部返回值,执行到下一个yield,生成值后挂起 然后f.next()或f.send(msg)会在生成器函数内部返回值,意图执行到下一个yield,但是后面没有yield了,所以抛出异常。 使用yield可以有效简化代码,并减少空间浪费。 举个简单例子:列表中的每个元素+1 传统写法: Python代码 def addlist(alist): r = [] for i in alist: r.append(i+1) return r 复制代码 yield写法: Python代码 def addlist(alist): for i in

java基础---集合篇

那年仲夏 提交于 2020-01-18 05:05:39
List集合 该添加方法是在集合的指定位置添加元素,指定位置原有元素的位置向后挪了一位(即下标加1): List.add(集合下标,添加元素);(集合实现类: ArrayList () ) 该添加方法是将另外一个集合(参数)的元素添加到集合的结尾处: List.addAll(Collection c ); List集合的底层实现: List集合的子类包括:ArrayList 底层使用的是:数组 注意:实现数组长度可变,指的是重新创建一个新的数组,长度大于旧数组 LinkedList 底层使用:链表结构 特点:每一个元素,前半部分是具体的值,后半部分是地址值 List集合的特点: 元素可重复,不唯一,有序(添加顺序/索引顺序/先后顺序) 集合只能存储对象或引用数据类型,基本数据类型不允许存放在集合当中。 当集合添加基本数据类型的时候,会自动装箱(将基本数据类型转换成引用数据类型)。 引用数据类型可以使用“==”和equals()方法比较,使用equals()方法比较集合元素是否重复。 List集合输出的三种方式: 标准for循环,增强for循环 以及迭代器(重点):(集合中的标准输出方法) System. out .println( "============== 迭代器输出 ===================" ); // 获取迭代器 ----List 集合当中存在一个方法 -

STL中的map、set(学完红黑树后的一个小总结)

亡梦爱人 提交于 2020-01-18 03:59:05
树介绍 树是一种很常用的数据结构,在很多地方都能看到树的应用,因为树往往可以用来优化数据查找的效率。 在一些优秀的系统中就会经常用到各种树结构,比如红黑树、AVL树、B树等。 红黑树的应用: 原理: 根节点是黑色的 只有红黑节点 叶节点都是黑色的nil 红色节点子节点必须是黑色的 对每个节点,从该节点到叶子节点路径上的黑节点数目一致,黑平衡性质 以上的五个性质保证了红黑树是平衡的,所以红黑树的查找效率能够稳定在lgn STL模板库中map和set的底层实现: 红黑树中节点和迭代器的实现 所有这些优秀的底层设计都会把结构和数据分离 struct __rb_tree_node_base { typedef __rb_tree_color_type color_type; typedef __rb_tree_node_base* base_ptr; color_type color; // 红黑树的颜色 base_ptr parent; // 父节点 base_ptr left; // 左子节点 base_ptr right; // 右子节点 } template <class Value> struct __rb_tree_node : public __rb_tree_node_base { typedef __rb_tree_node<Value>* link_type;

生成器迭代器正则视频笔记

僤鯓⒐⒋嵵緔 提交于 2020-01-17 08:57:30
多任务文件夹: import os os.mkdir(old_name+"复件") 创建文件夹 os.listdir("dirname") 返回一个列表 multiprocessing 多进程 创建进程池: po = multiprocessing.Pool(5) for work in works: po.apply_async(函数地址,函数参数) multiprocessing.Queue() print("\r %.2f %% " % args, end="") \r 回到行首 %.2f 保留两位小数 %% 显示% end=""不换行 协程: 迭代器: 只能往前不会回退。 for in 元祖, 列表 , 字典 ,字符串 判断是不是可以迭代对象: collections import Iterable isinstance(Object, Iterable) print("xxxx",isinstance(classmate,Iterable)) 打印元祖 必须有__iter__(self): def 保证一个对象成为一个可迭代对象. 保证类里有__iter__(self): 方法 from collections import Iterable class Classmate(object): def __init__(self): self.name = list()

python模块之itertools

可紊 提交于 2020-01-17 08:48:22
Python:itertools模块简介 itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代联合使用。 先来看下该模块包含的方法或函数,然后我们在对其中的部分进行说明 import itertools print(dir(itertools)) #['__doc__', '__loader__', '__name__', '__package__', '__spec__', '_grouper', '_tee', '_tee_dataobject', 'accumulate', 'chain', 'combinations', 'combinations_with_replacement', 'compress', 'count', 'cycle', 'dropwhile', 'filterfalse', 'groupby', 'islice', 'permutations', 'product', 'repeat', 'starmap', 'takewhile', 'tee', 'zip_longest'] accumulate(iterable[, func]) 返回累计和的序列(或其他二元函数结果)。 import itertools it = itertools