迭代器

python 迭代器&&生成器

末鹿安然 提交于 2020-01-28 17:21:18
有一篇文章写得迭代器和生成器,写得很好:https://www.cnblogs.com/wj-1314/p/8490822.html #列表生成器print([i*2 for i in range(10)])#生成器:把列表中的[]修改为(),生成器调用时才会产生相应的数据,不调用时不暂用内存,同时只记住当前的位置,只有一个__next__()方法b=(i*2 for i in range(10))for i in b: print(i) 什么是生成器?   通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。   所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在Python中,这种一边循环一边计算的机制,称为生成器:generator   生成器是一个特殊的程序,可以被用作控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可以使用 next()函数和send()函数 恢复生成器。   生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用

C++迭代器(STL迭代器)

会有一股神秘感。 提交于 2020-01-28 14:38:10
迭代器按照定义方式可以分为以下四种: (1)正向迭代器,定义方法如下: 容器类名::iterator 迭代器名; (2)常量正向迭代器,定义方法如下: 容器类名::const_iterator 迭代器名; (3)反向迭代器,定义方法如下: 容器类名::reverse_iterator 迭代器名; (4)常量反向迭代器,定义方法如下: 容器类名::const_reverse_iterator 迭代器名; 通过迭代器,我们可以读取它指向的元素, *迭代器名 就表示迭代器所指向的元素,通过非常量迭代器还能修改其指向的元素 迭代器都可以进行 ++ 操作,反向迭代器和正向迭代器的区别在于: 对正向迭代器进行 ++ 操作时,迭代器会指向容器中的后一个元素; 对反向迭代器进行 ++ 操作时,迭代器会指向容器中的前一个元素; 注意:容器适配器stack,queue,priority_queue 没有迭代器。 常用的迭代器按功能强弱分为:输入,输出,正向,双向,随机访问 五种。 (1)正向迭代器 假设p是一个正向迭代器,则p支持以下操作: ++p,p++,*p,两个迭代器可以进行相互赋值,以及==,!=比较 (2)双向迭代器 双向迭代器具有正向迭代器的所有功能,并且可以进行 --p 和 p-- 的操作 (3)随机访问迭代器 随机访问迭代器具有双向迭代器的所有功能,并且还可以进行以下操作

迭代器Iteration

徘徊边缘 提交于 2020-01-28 03:38:57
迭代器Iteration能够以指针的形式迭代遍历集合中的元素。 使用方法: 1.iterator()方法得到一个迭代对象 2.iterator.hasNext()判断是否有下一个元素 3.iterator.next()取出元素,并把指针向后移动一位 public static void main ( String [ ] args ) { Collection < String > strs = new ArrayList < > ( ) ; strs . add ( "赵" ) ; strs . add ( "钱" ) ; strs . add ( "孙" ) ; strs . add ( "李" ) ; strs . add ( "周" ) ; strs . add ( "吴" ) ; strs . add ( "郑" ) ; strs . add ( "王" ) ; //1.创建迭代器对象,Iterator是个接口 // 多态写法 接口 实现类对象 Iterator < String > iterator = strs . iterator ( ) ; //2.iterator.hasNext(),判断是否有下一个元素 while ( iterator . hasNext ( ) ) { //3.iterator.next(),取出下一个元素,并把指针向后移动一位

173. 二叉搜索树迭代器

人盡茶涼 提交于 2020-01-27 06:53:22
实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。 调用 next() 将返回二叉搜索树中的下一个最小的数。 示例: BSTIterator iterator = new BSTIterator(root); iterator.next(); // 返回 3 iterator.next(); // 返回 7 iterator.hasNext(); // 返回 true iterator.next(); // 返回 9 iterator.hasNext(); // 返回 true iterator.next(); // 返回 15 iterator.hasNext(); // 返回 true iterator.next(); // 返回 20 iterator.hasNext(); // 返回 false 可以看出本题是中序遍历二叉树的应用。 注意点:正常二叉树结构 、单叉树结构都需要考虑。 考虑实时计算,而不是直接计算出结果然后存储。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class BSTIterator

1286.字母组合迭代器

爱⌒轻易说出口 提交于 2020-01-27 03:46:24
请你设计一个迭代器类,包括以下内容: 一个构造函数,输入参数包括:一个 有序且字符唯一 的字符串 characters(该字符串只包含小写英文字母)和一个数字 combinationLength 。 函数 next() ,按 字典序 返回长度为 combinationLength 的下一个字母组合。 函数 hasNext() ,只有存在长度为 combinationLength 的下一个字母组合时,才返回 True;否则,返回 False。 示例: CombinationIterator iterator = new CombinationIterator("abc", 2); // 创建迭代器 iterator iterator.next(); // 返回 "ab" iterator.hasNext(); // 返回 true iterator.next(); // 返回 "ac" iterator.hasNext(); // 返回 true iterator.next(); // 返回 "bc" iterator.hasNext(); // 返回 false 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/iterator-for-combination 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

day13迭代器与生成器

亡梦爱人 提交于 2020-01-26 19:37:22
三个作业: # 1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码 login_dic = {'alex':False} def login(func): def inner(*args,**kwargs): if not login_dic['alex']: usrname = input('用户名 : ') passwd = input('密 码 : ') with open('userinfo') as f: for line in f: line = line.strip() usr,pwd = line.split(' ') if usrname.strip() == usr and passwd.strip() == pwd: print('登陆成功') login_dic[usrname] = True if login_dic['alex']: ret = func(*args,**kwargs) return ret return inner @login def home(): print('欢迎来到home页') # home() # home() # home() # 2.编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件 def log(func):

详解设计模式 迭代器模式

可紊 提交于 2020-01-26 14:53:49
迭代器模式 迭代器模式属于行为型模式,描述的是类之间的关系 定义: 它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节 迭代器模式就是为解决遍历元素而诞生的,java而言,使用java提供的iterator就可以了,不用需要手动去写迭代器 模式类图 角色: 抽象迭代器: Iterator ,负责定义访问和遍历元素的接口 具体迭代器: ConcreteIterator ,实现 Iterator 接口 抽象容器: Aggregate ,负责提供创建具体迭代器角色的接口 具体容器: ConcreteAggregate ,实现 Aggregate 接口 模式代码实现 源码地址:https://github.com/mingyuHub/design-patterns 抽象迭代器 Iterator 提供两个方法,返回下一个元素,是否还有下一个元素 /** * @author: chenmingyu * @date: 2019/3/17 19:07 * @description: 抽象迭代器 */ public interface Iterator { /** * 返回下一个元素 * @return */ public Object next ( ) ; /** * 是否还有下一个元素 * @return */ public boolean hasNext ( ) ; }

SPL 全面剖析

别等时光非礼了梦想. 提交于 2020-01-26 12:08:31
SPL 全面剖析 来自百度百科 http://baike.baidu.com/view/1130234.htm?fr=aladdin SPL(Standard PHP Library) IN PHP5 作者: 洪建家/Jiania E-mail:jiania@php.net 笔者认为下一步中大型PHP商业应用的主流的开发将会是以OO,OA软件开发模式主领潮流,从PHP5到PHP6,google Trends足以证明这一点,过去传统的面向过程的开发模式将会被弃之,如果你是一位真正合格程序员,你会发现OO所带来的好处是深远的,不仅是软件工程所带来的收益,而且此种思维理念对个人思维方式定有大的变革,你会发现你做事情开始OO方式,^_^,OO无处不在. 当然笔者不想去论述用面向过程写PHP代码所带来的好处(如简单的应用),那种单人时代的开发方式如儿童时代已不适合需求复杂,变化过快的现代商业环境.笔者发现,如今支持面向过程的开发者大多知识不够全,不够广.还不足以用OO来解决商业开发.当然这不是绝对,但一位有着C++,JAVA, Smalltalk、EIFFEL等开发语言背景的程序员,他会无一不支持OO开发模式,相反网络知识框架基础较少,各种协议一知半解,只会PHP的开发人员他们会觉得面向过程最适合他们. 不断有人在网上问笔者,目前主流的CMS我要用哪种来做二次开发,来做为中大型业务系统平台

【SPL标准库专题(1)】 SPL简介

空扰寡人 提交于 2020-01-26 11:58:28
什么是SPL SPL是Standard PHP Library(PHP标准库)的缩写。 根据官方定义,它是"a collection of interfaces and classes that are meant to solve standard problems" SPL是用于解决典型问题(standard problems)的一组接口与类的集合。 但是,目前在使用中,SPL更多地被看作是一种使object(物体)模仿array(数组)行为的interfaces和classes。SPL的核心概念就是Iterator。 在我的理解中,SPL以及后面要说的设计模式专题都是用于同一个目的: 构建优雅简洁易于扩展和维护的代码 ,有时候我们看上去写了更多的代码,但事实上却让代码的扩展性和维护性变得更强。 另外本专题属于PHP进阶课程。在本专题中给出的一些Example,看上去是有更简单的替代方案,但在实际上在更复杂的开发中,看似更多的代码却使得程序的可插拔性,可维护性变得更强,SPL以及设计模式都算是面向对象中的精髓了,所以面向对象的基础一定要掌握得非常牢才更能理解; Iterator 迭代器有时又称光标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如list或vector)上遍访的接口,设计人员无需关心容器物件的内容。 PHP5开始支持了接口,

Iterator迭代器remove元素出现**UnsupportedOperationException**异常

无人久伴 提交于 2020-01-26 05:47:49
Iterator迭代器remove元素出现 UnsupportedOperationException 异常 今天在学习迭代器时,发现remove元素时出现 UnsupportedOperationException 异常。查阅别人的博客发现自己犯了一个错误。 由于我的list是有Arrays.asList(“kelly”,“jerry”,“helen”)得到的,这样得到的list跟java.util.arraylist中的list是不一样的。Arrays.asList(“kelly”,“jerry”,“helen”)返回的是Arrays内部的list,而不是java.util.ArrayList。 Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList, remove、add等方法AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。java.util.ArrayList重新了这些方法,而Arrays的内部类ArrayList没有重写,所以会抛出异常 。 //AbstractList的源码 public E remove ( int index ) { throw new UnsupportedOperationException ( ) ; }