迭代器

3-22函数进阶——迭代器

心不动则不痛 提交于 2019-11-26 23:35:24
概述    迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 延迟计算或惰性求值 (Lazy evaluation)   迭代器不要求你事先准备好整个迭代过程中所有的元素。仅仅是在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。 可迭代对象   迭代器提供了一个统一的访问集合的接口。只要是实现了__iter__()或__getitem__()方法的对象,就可以使用迭代器进行访问。   序列:字符串、列表、元组   非序列:字典、文件   自定义类:用户自定义的类实现了__iter__()或__getitem__()方法的对象 创建迭代器对象   使用内建的工厂函数iter(iterable)可以获取迭代器对象:   语法:     iter(collection) -> iterator     iter(callable,sentinel) -> iterator   说明:     Get an iterator from an object.     In the first form, the argument must supply its own iterator, or be a sequence.     In

迭代器与生成器

梦想与她 提交于 2019-11-26 23:25:29
一、迭代器 1、什么是迭代器协议 1、迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stopiteration异常,以终止迭代。(只能往后走不能往前退) 2、可迭代对象:实现了迭代器协议的对象。(如何实现:对象内部定义了一个__iter__()方法) 3、协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。 2、迭代器与可迭代对象 1、迭代器:可以被 next() 函数调用并不断返回下一个值的对象称为迭代器。 2、可迭代对象:可以直接作用于 for 循环的对象。 3、for循环 for循环的本质:循环所有的对象,全部都是使用迭代器协议。 for循环的实现: L = [1,2,3,4,5] L = L.__iter__() #使用内部方法__iter__()将其变为可迭代对象 print(L.__next__()) #使用可迭代对象提供的方法__next__()循环取值 print(L.__next__()) print(L.__next__()) print(L.__next__()) print(L.__next__()) View Code 可迭代对象会抛出 StopIteration ,为了解决这一问题,加入异常处理,模拟真实的for循环机制 L

白话C++系列(35) -- C++标准模板库

*爱你&永不变心* 提交于 2019-11-26 22:27:16
C++标准模板库,简称为STL:Standard Template Lib。关于STL涉及的部分比较多,我们这里只选具有代表性和最常用的部分给大家进行分享。 vector向量 vector 的本质就是:对数组的封装 。大家可以将其看作是一个数组,只不过对于vector这个数组来说,相对于我们之前所学的传统数组的功能要强大得多。它可以根据所存储的元素个数,自动变长或者缩短,同时,它还具有一个很优秀的特点,即能够在常数时间内完成数据的随机读取。也就是说,无论这个向量数组中有10个元素还是10000个元素,它都能够很快的找出我们想要的数据来。 具体使用方法如下: 向量初始化之后必须要有一些配套的使用方法: 接下来我们来看一看实际使用的例子: 我们去定义一个向量的时候,我们可以写上vector,然后就像我们使用类模板的时候通过类模板去实例化一个模板类,需要传入一个参数int,后面再加上一个变量名vec。当变量vec去调用push_back函数的时候,就会在当前这个向量的最尾部插入一个传入的元素(这里传入的是10),而当调用pop_back函数的时候,就会将这个向量的最尾部的那个元素删掉(这里删掉的就是10,因为上面一行在最尾部插入了10,那么10成了这个向量的最尾部元素了),当我们再去调用size函数的时候,打印出来的就是这个向量元素的个数(这里打印出来的数据元素个数应该是0

15.迭代器模式

一世执手 提交于 2019-11-26 22:12:15
迭代器模式 一、迭代器模式 1.基本介绍 1)如果我们集合元素是用不同的方式实现的,有数组,还有java的集合类等,当客户端要遍历这些集合元素时就要使用多种遍历方式,还会暴露元素的内部结构,可以考虑使用迭代器模式解决。 2)提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示。 2.原理类图 1)Iterator:迭代器接口,是系统提供,含义hasNext,next,remove 2)Concretelterator:具体的迭代器类,管理迭代 3)Aggregate:一个统一的聚合接口,将客户端和具体聚合解耦 4)ConcreteAggreage:具体的聚合持有对象集合,并提供一个方法,返回一个迭代器,该迭代器可以正确遍历集合 5)Client:客户端,通过Iterator和Aggregate 依赖子类 二、迭代器模式应用实例 ​ 编写程序展示一个学校院系结构:要在一个页面中展示出学校的院系组成,一个学校有多个学院一个学院有多个系。 1.代码实现 public class Client { public static void main(String[] args) { //创建学院 List<College> collegeList = new ArrayList<College>(); ComputerCollege

集合和Iterator迭代器

旧城冷巷雨未停 提交于 2019-11-26 21:40:55
集合 集合是java中提供的一种容器,可以用来存储多个数据。 注意: ①、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,   其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。 ②、集合存放的是多个对象的引用,对象本身还是放在堆内存中。 ③、集合可以存放不同类型,不限数量的数据类型。 用ArrayList集合存储int类型数组: 1 public static void main(String[] args) { 2 3 ArrayList<Integer> arr=new ArrayList<Integer>(); 4 arr.add(1); 5 arr.add(12); 6 arr.add(2); 7 for(int i=0;i<arr.size();i++){ 8 System.out.print(arr.get(i)+" "); 9 } 10 } ArrayList集合存储5个Person类型元素: 1 ArrayList<Person> arr=new ArrayList<Person>(); 2 arr.add(new Person("小猪佩奇",18)); 3 arr.add(new Person("乔治",17)); 4 arr.add(new Person("熊大",16)); 5 arr.add(new

集合——iterator迭代器

偶尔善良 提交于 2019-11-26 21:40:41
Iterator接口: Iterator接口使用: 其中, 集合Collection接口的定义也是使用多态,必须要创建它的子类对象才行,子类接口也是不能直接创建对象的(List接口); 其中wihle的条件表达式就是iterator迭代器操作步骤的第二步; 用循环语句时候, 已知集合的长度即有多少元素用for循环,未知用while, for循环(初始化表达式;boolean条件表达式;步进表达式){   // 其中,初始化表达式只执行一次,步进表达式在for循环的方法体执行之后执行; } Iterator原理解析: 其中, 有索引即指针,可以使用for循环遍历; 来源: https://www.cnblogs.com/wmqiang/p/10656240.html

集合迭代器Iterator

☆樱花仙子☆ 提交于 2019-11-26 21:40:06
迭代器模式:就是提供一种方法对一个容器对象中的各个元素进行访问,而又不暴露该对象容器的内部细节。 什么是迭代器Iterator? Java集合框架的集合类,我们有时候称之为容器。容器的种类有很多种,比如ArrayList、LinkedList、HashSet...,每种容器都有自己的特点,ArrayList底层维护的是一个数组;LinkedList是链表结构的;HashSet依赖的是哈希表,每种容器都有自己特有的数据结构。 因为容器的内部结构不同,很多时候可能不知道该怎样去遍历一个容器中的元素。所以为了使对容器内元素的操作更为简单,Java引入了迭代器模式! 把访问逻辑从不同类型的集合类中抽取出来,从而避免向外部暴露集合的内部结构。 Iterator怎么使用?有什么特点? 1.java.util.Iterator package java.util; public interface Iterator<E> { boolean hasNext();//判断是否存在下一个对象元素 E next();//获取下一个元素 void remove();//移除元素 } 2.Iterable Java中还提供了一个Iterable接口,Iterable接口实现后的功能是‘返回’一个迭代器,我们常用的实现了该接口的子接口有:Collection<E>、List<E>、Set<E>等

生成器、BIF

狂风中的少年 提交于 2019-11-26 21:39:54
列表解析式 列表解析式是一种利用 [ 表达式 + for 循环 [ + if判断 ] ] 快速生成列表对象的python语法,方便使用者快速构建列表。 语法 : # 列表解析式 第一种效率会明显高于第二种 [(i,j) for i in range(1000) if i > 700 for j in range(1000) if j > 900] [{i,j} for i in range(1000) for j in range(1000) if j>900 if i > 700] 集合解析式 # 注:其中的元素必须可哈希,不允许是列表,字典,set()等不可哈希对象,否则将会报错 { (i,j) for i in range(1000) if i > 700 for j in range(1000) if j > 900 } 生成器表达式 it = (i for i in range(10)) #将会返回一个生成器对象 生成器对象 一个可以做指定操作,并在每次next()时返回一个值的对象,节省空间存放数据,但每次计算需要等待. 迭代器对象 一个可以被迭代的对象,for 将会全部迭代其中的元素,也可使用next()一个个取值返回,迭代器只可以使用一轮,无法反复使用,生成器也是一个迭代器 可迭代对象 可以被迭代的对象,例如元组,字典,集合,列表等容器,生成器和迭代器也是可迭代对象

迭代器(Iterator)遍历List、Set、Map

℡╲_俬逩灬. 提交于 2019-11-26 21:39:51
大晚上的睡不着觉,还是起来写博客吧。迭代器我主要是用来遍历List、Set、Map的,然而好久没用过,又突然忘记了,所以有写了一遍(妈的,我还就不信了,我写10遍看能不能忘记)。 迭代器也就是将集合的数据放到一个容器中并排成一排,iterator有一个游标,最初的时候,游标在第一个元素前面,调用Iterator.next()是将游标往后移一位,Iterator.hasNext()是判断游标后面还没有可以迭代的元素。 为什么用迭代器了,在《java编辑思想》这本书里说,是因为最初的时候你用for循环遍历List,之后人家又要你遍历Set,但是for循环无法遍历Set,因为Set是无序的,所以后面就统一用迭代器遍历集合了。 遍历List 1 List<String> list = new ArrayList<String>(); 2 list.add("a"); 3 list.add("b"); 4 Iterator<String> iterator = list.iterator(); 5 while(iterator.hasNext()){ 6 String next = iterator.next(); 7 System.out.println(next); 8 } 遍历Set,和List一样 1 Set<String> set = new HashSet<String>();

QT学习笔记(六)

六月ゝ 毕业季﹏ 提交于 2019-11-26 20:49:02
第11章 容器类 Qt提供了自己的容器类,在编写Qt程序时,既可以使用Qt容器,也可以使用STL容器。 连续容器 1)向量 QVector<T> :它是一种与数组相似的数据结构,它可以把项存储到内存中相邻的位置。向量与普通C++数组的区别在于:向量知道自己的大小并且可以被重新定义大小。 在向量的末尾添加或删除额外的项是非常快速有效的,而在向量的前面或中间插入或删除项则是比较耗时的,因为这样可能导致大量的项目在内存中移动一个位置。对于较大的向量来说,这种现象尤为严重,因此Qt提供了QLinkList<T>容器。 2)链表 QLinkList<T> : 它是一种把项存储到内存中不相邻位置的数据结构。与向量不同,链表不支持快速的随机访问,但它提供“常量时间”的插入和删除。链表并未提供[]操作符,因此必须使用迭代器来遍历项而不能使用整数索引。当向一个很大的列表中间插入项目时,QLinklist比下面的QList拥有更好的性能。 3)列表 QList<T> : 它结合了单一类中QVector<T>和QLinkList<T>的最重要的优点,是目前最常用的容器类。它存储了给定值的一个列表,而且这些值可以通过索引访问。在内部QList使用数组实现,它支持随机访问。在QList<T>的任意一端插入或者移除项都是非常快速的