迭代器

Python之路----迭代器与生成器

倾然丶 夕夏残阳落幕 提交于 2020-01-23 08:49:59
一、迭代器 L=[1,,2,3,4,5,]   取值:索引、循环for   循环for的取值:list列表 dic字典 str字符串 tuple元组 set f=open()句柄 range() enumerate枚举   for i in L: 告诉我列表所拥有的所有方法 print(dir[]) 判断某一数据类型是否有__iter__方法(是否可迭代) print('__iter__' in dir(int)) print('__iter__' in dir(bool)) print('__iter__' in dir(list)) print('__iter__' in dir(dict)) print('__iter__' in dir(set)) print('__iter__' in dir(tuple)) print('__iter__' in dir(enumerate([]))) print('__iter__' in dir(range(1))) 只要能被for循环的数据类型,都有_iter_方法 print([].__iter__()) 一个列表执行了__iter__()之后的返回值就是一个迭代器 print(dir([])) print(dir([].__iter__())) print(set(dir([].__iter__())) - set(dir([

STL(标准模板库)

旧时模样 提交于 2020-01-23 07:42:01
(此篇只是一个目录,将分成单篇去完成) STL 主要有三个部分组成: 容器, 迭代器, 算法。 第一部分:知其然 一,容器 * 顺序容器 向量(Vector) 双端队列(Dequeue) 表(List) PS: Copy 方法 * 关联容器 集合(Set) 多重集合(Multiset) 映射(Map) 多重映射(Multimap) * 容器适配器 栈(Stack) 队列(Queue) 优先队列(Priority Queue) 二, 迭代器 输入迭代器 输出迭代器 前向迭代器 双向迭代器 随机访问迭代器 PS:迭代器声明式及流迭代器 三, 算法 非修改算法 修改算法 数字算法 堆算法 PS: 函数对象 插入迭代器 第二部分:知其所以然 来源: https://www.cnblogs.com/wjchang/p/3671664.html

C++ string基本操作

匆匆过客 提交于 2020-01-22 17:58:43
初始化 //string 类型的初始化方法 string s1; string s2 = s1; string s3 = "lol"; string s4("JarvenIV"); string s5(7,'7'); //连续n个字符组成的串 读写 string s; cin>>s; cout<<s; 范围for语句 //c++范围for语句,处理字符串中的每个字符 //将字符串中的每个小写字母转换为大写字母 string str("I can fly high!"); for(auto &c : str) //使用引用以更改字符的值 c = toupper(c); cout<<str<<endl; //统计字符串中的数字个数 string s("clear4396love"); decltype(s.size()) digit_count = 0;//decltype函数返回s.size()的类型 for(auto c : s) if(isdigit(c)) //该字符是数字 ++digit_count; cout<<digit_count; 迭代器操作 //string::const_iterator 为指向常量的迭代器类型 //string::iterator 为迭代器类型 string s("HelloWorld!"); //使用begin(),end()方法修改 for

侯捷 STL

泄露秘密 提交于 2020-01-22 16:42:24
侯捷 STL 源码之前 了无秘密 1.1 headers、版本、重要资源 C++ Standard Library(标准库) vs. Standard Template Library(标准模板库) 2.2 STL 体系结构基础 六大部件: 容器(Container) 分配器(Allocators) 算法(Algorithms) 迭代器(Iterators) 适配器(Adapters) 仿函数(Functors) #include<vector> #include<algorithm> #include<functional> #include<iostream> using namespace std; int main() { int ia[6] = {27, 210, 12, 47, 109, 83}; vector< int , allocator<int> > vi(ia,ia + 6); cout << count_if(vi.begin(), vi.end(), not1(bind2nd( less<int>(), 40 ))); return 0; } 复杂度,Complexity,Big-Oh “前闭后开”区间 range-base for statement and auto (C++11) 3.3 容器 - 结构与分类(一) 大致上分为两种,一个叫做序列式

33迭代器模式(Iterator Pattern)

不羁岁月 提交于 2020-01-22 12:48:17
动机(Motivate): 在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“ 同一种算法在多种集合对象上进行操作”提供了可能。 使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方法。 意图(Intent): 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。-------《设计模式》GOF 结构图(Struct): 适用性: 1.访问一个聚合对象的内容而无需暴露它的内部表示。 2.支持对聚合对象的多种遍历。 3.为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。 生活中的例子: 迭代器提供一种方法顺序访问一个集合对象中各个元素,而又不需要暴露该对象的内部表示。在早期的电视机中,一个拨盘用来改变频道。当改变频道时,需要手工转动拨盘移过每一个频道,而不论这个频道是否有信号。现在的电视机,使用[后一个]和[前一个]按钮。当按下[后一个]按钮时,将切换到下一个预置的频道。想象一下在陌生的城市中的旅店中看电视。当改变频道时,重要的不是几频道,而是节目内容。如果对一个频道的节目不感兴趣,那么可以换下一个频道,而不需要知道它是几频道。 代码实现: 在面向对象 的软件设计中

每周一个 Python 标准库 | itertools

此生再无相见时 提交于 2020-01-22 00:19:19
技术博客:https://github.com/yongxinz/tech-blog 同时,也欢迎关注我的微信公众号 AlwaysBeta ,更多精彩内容等你来。 Python 标准库模块 itertools 提供了很多方便灵活的迭代器工具,熟练的运用可以极大的提高工作效率。 无限迭代器 itertools.count count ( start = 0 , step = 1 ) 创建一个迭代器,生成从 n 开始的连续整数,如果忽略 n,则从 0 开始计算。示例: In [ 2 ] : for n in itertools . count ( ) : . . . : if 100000 < n < 100010 : . . . : print n . . . : if n > 1000000 : . . . : break . . . : 100001 100002 100003 100004 100005 100006 100007 100008 100009 itertools.cycle cycle ( iterable ) 把传入的一个序列无限重复下去。示例: In [ 6 ] : count = 0 In [ 7 ] : for c in itertools . cycle ( "AB" ) : . . . : if count > 4 : . . . : break .

协程(迭代器,生成器等)

我的未来我决定 提交于 2020-01-21 17:30:52
一、 补充知识 isinstance(a,A) True 以上如果返回值为True则表示a是A的一个子类 Iterable是一个类,这个类的子类都是可迭代对象 由上图可以知 列表是可迭代对象 问题来了:是否可以通过自己创建的类产生的对象判断ta可以迭代呢? 发现不可以 如果想让类创建的实例对象用for的话,在类中额外添加方法__iter__ 可行但是依旧不可以拿for来循环‘ 因为 普通列表在for循环中取第一个完成后内部自动跳到第二个,但是自己定义的类没有这个光标 因此得在iter 返回一个对象的引用(这个引用必须包含iter和next方法)才可以进行for循环 for temp in classmate: pass 当for循坏是否判断可以运行的时候就是判断classmate是否是一个可迭代对象 如何判断其是否是一个可迭代对象呢?只要classmate中由iter的这个类就算可迭代对象 此时调用对象中iter函数来得到return的返回值,只要返回值中既包含iter和next俩方法,此值就算是迭代器 使用迭代器中的next来进行正常可迭代对象的光标下移 因此每调用一次for循环的temp的时候j就会调用next返回给temp 第一行代码iter(classmate)返回迭代器,将迭代器给一个变量 第二行代码将返回True时证明其就是迭代器 上两行代码验证其是否是迭代器

迭代器生成器

风流意气都作罢 提交于 2020-01-21 16:13:08
迭代器 迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代 while True: msg = input('>>: ').strip() print(msg) # 仅仅是单纯的循环,没有迭代,不是迭代器 下述while循环才是一个迭代过程,不仅满足重复,而且以每次重新赋值后的index值作为下一次循环中新的索引进行取值,反复迭代,最终可以取尽列表中的值 goods=['mac','lenovo','acer','dell','sony'] index=0 while index < len(goods): print(goods[index]) index+=1 为什么要有迭代器 对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 可迭代对象 要想了解迭代器为何物,必须事先搞清楚一个很重要的概念:可迭代对象(Iterable)。 从语法形式上讲,内置有__iter__方法的对象都是可迭代对象,字符串、列表、元组、字典、集合、打开的文件都是可迭代对象: 'hello'.__iter__ (1

Python标准模块--itertools

那年仲夏 提交于 2020-01-21 15:03:17
1 模块简介 Python提供了itertools模块,可以创建属于自己的迭代器。itertools提供的工具快速并且节约内存。开发者可以使用这些工具创建属于自己特定的迭代器,这些特定的迭代器可以用于有效的遍历。 2 模块使用 2.1 无限迭代器 itertools中有个三个迭代器是无限迭代的,这就意味着当你在使用它们时,你需要了解你要么从这些迭代器中终止,要么就是无限循环。 count count(start = 0, step = 1),count迭代器返回一系列值,以传入的start参数开始,Count也可以接受step参数。 from itertools import count for i in count(10): if i > 20: break else: print i, 通过条件判断,如果超出20,就从for循环中break出来,否则,就打印迭代器中的值,控制台输出, 10 11 12 13 14 15 16 17 18 19 20 另一种限制无限迭代器的输出是通过itertools中的islice方法,如下所示, from itertools import count,islice for i in islice(count(10),10): print i, count从10开始,在10个元素之后结束。islice的第二个变量是指定何时停止迭代,但是

Collection集合-(List集合)

人盡茶涼 提交于 2020-01-21 01:02:18
Collection集合体系 其中蓝色框为接口,红色框为具体实现类 Collection集合概述和使用 Collection是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素 JDK不提供此接口的任何直接实现,它提供更具体的子接口(如list和set)实现 创建Collection集合的对象:多态的方式、具体的实现类为ArrayList 集合使用步骤: //创建Colleciton集合对象 Collection<Student> = new ArrayList<Student>(); //创建学生对象 Student s1 = new ("小明"); Student s2 = new ("老王"); Student s3 = new ("张总"); //把学生添加到集合 s.add(s1); s.add(s2); s.add(s3); //遍历集合(迭代器方式) //通过集合对象获取迭代器 Iterator<Student> it = s.iterator(); while(it.hasNext()){ Student c = it.next(); //输出 System.out.println(c.getName()); } List集合概述和特点 List集合:有序集合(也称为序列),用户可以精确控制列表中每个元素的插入位置