迭代器

函数对象

寵の児 提交于 2019-12-01 09:49:33
数组 enum eRelation // 表示计算策略的枚举体 { eLess, // 小于 eEqual, // 等于 eGreater // 大于 }; template< typename T, typename ITER_TYPE> ITER_TYPE find_if_number( ITER_TYPE begin, ITER_TYPE end, eRelation relType, const T &target ) // 用数值表示策略的find_if函数 { for(ITER_TYPE iter = begin; iter!=end; iter++) // 遍历迭代器区间 { switch( relType ) // 根据不同的策略 { case eLess: if( *iter < target ) // 比较当前元素与目标 { return iter; // 返回迭代器 } case eEqual: if( *iter == target ) { return iter; } case eGreater: if( *iter > target ) { return iter; } } } return end; // 失败,则返回区间尾部 } int main(int argc, char *argv[]) // 主函数 { int ary[5] = {1,2,3

迭代器

雨燕双飞 提交于 2019-12-01 09:13:01
1、 迭代器 用于统一机制,这种机制允许我们调用next()方法,每次调用都会返回一个对象{value,done},当完成迭代后done值为true,value每次获取的元素 (1)手动使用 let iterator = array.values(); let item ; while(!(item = iterator.next()).done){ console.log(item.value); } (2)使用for-of协助 let iterator = array.values(); for(let v of iterator){ console.log(v); } (3)使用for-of直接遍历可以迭代的对象 for(let v of array){ console.log(v); } (4)如何将一个普通对象变成一个可以迭代的对象 let obj = {name:"terry",age:12} // 如何获取一个迭代器 obj[Symbol.iterator] = [][Symbol.iterator] // 将对象转换为set new Set(obj) 2、具有迭代器 Array Set Map String 类数组对象 Arguments NodeList 3、迭代器是如何添加到Set,Map,Array…这些数据结构上的? var o = { name:

[转]23种设计模式总结

瘦欲@ 提交于 2019-12-01 08:04:32
1.单例模式(Singleton Pattern) 定义: Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。) 通用代码:(是线程安全的) public class Singleton { private static final Singleton singleton = new Singleton(); //限制产生多个对象 private Singleton(){ } //通过该方法获得实例对象 public static Singleton getSingleton(){ return singleton; } //类中其他方法,尽量是static public static void doSomething(){ } } 使用场景: ● 要求生成唯一序列号的环境; ● 在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的; ● 创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源; ● 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然

关于函数的默认值与python闭包以及迭代器

醉酒当歌 提交于 2019-12-01 07:55:34
# 在函数中如果默认值参数是一个可变的数据类型, 如果有人调用的时候改变了他. 其他位置看到的也跟着改变了 def fn(val,list=[]): list.append(val) return list print(fn(5)) # 这个位置我们给val传值了打印的结果一定是[5] print(fn(6)) # 这个位置我们继续传值发现结果是[5, 6],那么也就是说函数中参数的默认值是同一个,而不是每次调用函数生产新的默认值 # # 在函数中如果默认值参数是一个可变的数据类型, 如果有人调用的时候改变了他. 其他位置看到的也跟着改变了 # def fn(val,list=[]): # list.append(val) # return list # # print(fn(5)) # # 这个位置我们给val传值了打印的结果一定是[5] # # print(fn(6)) # 这个位置我们继续传值发现结果是[5, 6],那么也就是说函数中参数的默认值是同一个,而不是每次调用函数生产新的默认值 # 什么是闭包以及闭包实际作用 # 我们知道函数声明的时候是不执行的,只有在调用的时候才会在内存开辟空间,python内部的垃圾回收机制,会在函数执行完毕后回收这块内存 def fn1(): val = 100 print(val) fn1() # 这个时候在执行完fn1后

迭代器和生成器

為{幸葍}努か 提交于 2019-12-01 05:40:06
# 最简单的生成器 l1 = [2, 4, 5, 6] # 利用生成器实现生成一个新列表,元素等于l内的每个元素+1 l2 = [x+1 for x in l1] print(type(l2)) # 结果:<class 'list'> print(l2) # 结果:[3, 5, 6, 7] # 因为生成器会根据逻辑遍历可迭代对象(此处是l1)生成新的对象。这本身没什么问题,也符合我们的要求 # 但是如果可迭代对象的内容非常庞大例如: # l3 = [x+1 for x in range(1000000)] # print(l3) # 直接生成新的对象后,存储下来。而对象在接下来会被调用,所以会保存在内存中 # 通过上面的例子,我们知道直接使用生成器如果遇到较大的迭代对象,就会占用非常大的内存 # 下面通过该为迭代器的方法来实现上述例子 # l4 = (x+1 for x in range(1000000)) # print(l4) # 结果是生成器:<generator object <genexpr> at 0x0000000001ED23C8> # 通过next(生成器)取值,取到最后一个值的时候,再次取值会报错 # l5 = (x+1 for x in l1) # print(next(l5)) # 结果是:3 # print(next(l5)) # 结果是:5 #

迭代器

本秂侑毒 提交于 2019-12-01 05:02:27
#int#str#tuple#list#dict#bool#set# print(dir(int))#告诉我所拥有的方法# print([1].__add__([2]))# print(dir(""))# print(dir(()))# print(dir([]))# print(dir(bool))# print(dir(range(10)))#只要可以for循环就可以迭代# print(dir([].__iter__()))#一个列表执行了__iter__返回值就是一个迭代器# print(set(dir([].__iter__()))-set(dir([])))# # print([1,2,3].__iter__().__length_hint__())#元素个数# list=[1,2,3]# Iter=list.__iter__()# print(Iter.__iter__().__next__())#迭代器--》通过__next__在迭代器中一个一个取值# print(Iter.__iter__().__next__())#只要是含有—__iter__方法的都是可迭代的# #只要含有__iter__就是可迭代的-------可迭代协议# #可迭代协议:只要含有__next__和_iter__方法的就是迭代器# print("__iter__"in dir([])._

redis源码分析3---结构体---字典

被刻印的时光 ゝ 提交于 2019-12-01 03:23:28
redis源码分析3---结构体---字典 字典,简单来说就是一种用于保存键值对的抽象数据结构; 注意,字典中每个键都是独一无二的;在redis中,内部的redis的数据库就是使用字典作为底层实现的; 1 字典的实现 在redis中,字典是使用哈希表作为底层实现的,一个hash表里面可以有多个hash表节点,而每个hash表节点就保存了字典中的一个键值对; hash表定义 table属性是一个数组,数组中的每个元素都是一个指向dictEntry结构的指针,每个dictEntry结构保存着一个键值对; 一个空的hash表: hash表节点 key保存键值对中的键,v为值,union表示三个钟选择一个,next是指向另一个hash表节点的指针,这个指针可以将多个hash值相同的键值对连接在一起,以此来解决冲突的问题; 比如 字典结构 总的来说,没有rehash的字节结构图如下 2 hash算法 当要将一个新的键值对添加到字典里面时,程序需要先根据键值对的键计算出hash值和索引值,然后再根据索引值,将包含新建支队的hash表节点放到哈市表数组的制定索引上面。 3 解决冲突 在hash表中不可避免的会出现冲突,当有两个或者两个以上的键被分配到了hash表数组的同一个索引上面时,就说发生了冲突; 在redis中使用链地址法来解决键冲突;就是我们在前面的结构中定义的next指针实现的; 4

redis源码分析2---结构体---链表

你离开我真会死。 提交于 2019-12-01 03:22:43
redis源码分析2---结构体---链表 因为redis包含大量的键值对,redis中列表键的底层实现之一就是链表;当一个链表键包含了数量比较多的 元素,又或者列表中包含的元素都是比较长的字符串时,redis就会使用链表作为底层实现; 另外链表做外数据结构中最常使用的结构,如何高效的实现和值得我们学习;我之前在项目中大量使用了链表 但是感觉总是写的不大好;redis都是大神们写出来的,值得好好学学! redis源码分析1中讲的SDS部分结构:先总说SDS的实现,再分析源代码,这种结构将贯穿整个redis源码分析过程; 希望这样能方便大家理解。 1 为什么使用链表和链表定义。 链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活的调整链表的长度。底层列表键的实现方式之一就是链表。 节点定义如下 是一个双端链表 链表的结构定义如下 dup函数用于复制链表节点所保存的值 free函数用于释放链表节点所保存的值 match函数则用于对比链表节点所保存的值和另一个输入值是否相等; 综合看起来,redis中的链表结构如下:我们以一个list结构和三个listnode结构组成的链表为例。 2 链表的API 3 源代码分析 3.1 迭代器 为了便于访问,在adlist.h中定义了双端链表迭代器,方便访问整个链表; 3.2 直接通过属性获得的函数具体实现办法 3.3

迭代器

杀马特。学长 韩版系。学妹 提交于 2019-12-01 02:44:42
可以被for循环的:列表,元组,字符串,range(),enumerate()。 print(dir([])&dir('')) # iterable __iter__() 用迭代器方便,节省空间(不会把一个程序全部读出,而是一句一句随着循环生成) __next__() l = [1,2] iterator = l.__iter__() while 1: print(iterator.__next__()) 来源: https://www.cnblogs.com/shuoran/p/11649075.html

python2 与 python3的区别

旧城冷巷雨未停 提交于 2019-12-01 02:43:11
几乎所有的python2程序都需要一些修改才能正常的运行在python3的环境下。为了简化这个转换过程,Python3自带了一个2to3的实用脚本.这个脚本会将python2程序源文件作为输入,然后自动转换到python3.但并不是所有内容都可以自动转换。 print语句 python2中print是一个语句,不论想输出什么,直接放到print关键字后面即可。python3里,print()是一个函数,像其他函数一样,print()需要你将要输出的东西作为参数传给它。 python2 python3 备注 print print() 输出一个空白行,python3需要调用不带参数的print() print 1 print(1) 输出一个值,将值传入print()函数 print 1, 2 print(1,2) 输出使用空格分割的两个值,使用两个参数调用print() print 1, 2, print(1,2, end=' ') python2 中如果使用一个,作为print结尾,将会用空格分割输出的结果,然后在输出一个尾随的空格,而不输回车。python3里,把end=' ' 作为一个关键字传给print()可以实现同样的效果,end默认值为'\n',所以通过重新指定end参数的值,可以取消在末尾输出回车符号 print >> sys.stderr, 1, 2, 3 print