迭代器

迭代器和生成器

[亡魂溺海] 提交于 2020-01-17 07:57:50
迭代器(iter) 什么是迭代器 迭代器作为容器,可以保存多个数据,迭代器是一个可以记住遍历的位置的对象,当遍历迭代对象 的时候,下一次的获取到的值会接着上次遍历的位置,直到所有的元素被访问完,那么该迭代对象变成空。迭代器只能依次往后遍历,不能逆向操作。 迭代器的两个基本的方法: iter():将序列转化为迭代器对象 next():依次遍历迭代器中的元素 获取迭代器中的元素 不管用那种方式去获取了元素的值,那么这个元素在迭代器中就不存在了 1)获取单个元素:next(迭代器) / 迭代器. next () -> 获取迭代器中的第一个元素 2)遍历: for 变量 in 迭代器: pass iter1 = 'hello' print ( iter1 ) # <str_iterator at 0x1d529ebbe08> print ( type ( iter1 ) ) # str_iterator print ( next ( iter1 ) ) print ( next ( iter1 ) ) print ( next ( iter1 ) ) print ( iter1 . __next__ ( ) ) print ( iter1 . __next__ ( ) ) # StopIteration如果迭代器为空用next获取元素的时候会报错 或者 for item in iter1

python中的迭代器和生成器

喜你入骨 提交于 2020-01-16 20:13:37
迭代器 在介绍迭代器之前,先说明下迭代的概念: 迭代:通过for循环遍历对象的每一个元素的过程。 Python的for语法功能非常强大,可以遍历任何可迭代的对象。 在Python中,list/tuple/string/dict/set/bytes都是可以迭代的数据类型。 迭代器是什么? 迭代器是一种可以被遍历的对象,并且能作用于next()函数。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 迭代器只能往后遍历不能回溯,不像列表,你随时可以取后面的数据,也可以返回头取前面的数据。 from collections . abc import Iterator , Iterable print ( isinstance ( list ( ) , Iterable ) ) # True print ( isinstance ( list ( ) , Iterator ) ) # False l = [ 1 , 2 , 3 , 4 ] it = iter ( l ) print ( next ( it ) ) print ( next ( it ) ) print ( next ( it ) ) print ( next ( it ) ) for i in it : print ( i ) 在上述代码中,Iterator,

可迭代对象和迭代器的区别和联系

倾然丶 夕夏残阳落幕 提交于 2020-01-16 00:24:44
区别: 可迭代对象:只能使用for循环遍历的数据,如:集合类型【list、tuple、dict、set、string】和生成器【()生成器和函数生成器】 迭代器:可以使用for循环或者next遍历的数据,如:生成器 联系: 迭代器一定是呵迭代对象,可迭代对象不一定是迭代器 可以通过iter()将不是迭代器的可迭代对象转化为迭代器 来源: CSDN 作者: 呆呆文 链接: https://blog.csdn.net/weixin_45527702/article/details/103995164

C++标准库——顺序容器

安稳与你 提交于 2020-01-15 18:41:30
容器是容纳特定类型对象的集合。顺序容器将单一类型元素聚集起来,并且根据位置来存储和访问这些元素。顺序容器中元素排列顺序与元素值无关,而是根据元素值添加到容器中的次序决定的。 标准库中有三种顺序容器,分别是vector,list与deque。其中vector支持随机的快速访问,因为vector中存放数据是在内存中连续存放的。在实际的实现中,vector会提前申请一块较大的内存空间(如果指定了大小,一般是指定大小的两倍),这样每次加入新的元素时不用再申请新的内存空间,提高效率。list容器是类似于链表的存储方式,因此插入元素效率较高,查找元素效率低,因为必须从头开始查找。deque是双端队列,也支持快速访问,同时在两端插入时有高效率。除了三种顺序容器以外,还有三种适配器,分别是stack,queue,priority_queue。适配器在基础的顺序容器基础上提供更高级的数据结构的行为,栈,队列,有优先级的队列。容器都是类模板,支持泛型编程,提供多种数据类型的支持。 容器有多种初始化的方式,包括初始化为另一个相同类型容器(容器类型与容器元素类型都需要相同)的副本,指定容器大小与内容的初始化,初始化为一段元素的副本等。其中初始化为一段元素的副本可以用另一个容器类型不同但是容器元素类型相容的容器来初始化。容器的元素类型有限制,必须可以赋值和复制。由于引用赋值与一般的赋值含义不同

341.扁平化嵌套列表迭代器

喜欢而已 提交于 2020-01-15 11:25:44
难度:中等 题目描述: 思路总结 : 方法一:用递归扁平化整个list 方法二:用栈在调用hasNext()的时候找到下一个元素 题解一: # """ # This is the interface that allows for creating nested lists. # You should not implement it, or speculate about its implementation # """ #class NestedInteger: # def isInteger(self) -> bool: # """ # @return True if this NestedInteger holds a single integer, rather than a nested list. # """ # # def getInteger(self) -> int: # """ # @return the single integer that this NestedInteger holds, if it holds a single integer # Return None if this NestedInteger holds a nested list # """ # # def getList(self) -> [NestedInteger]: #

STL之map容器和multimap容器

时光总嘲笑我的痴心妄想 提交于 2020-01-15 05:18:20
摘要:本文主要介绍了map容器和multimap容器的相关内容。 1、基本概念 1.1 Map的特性 所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。 1.1 map容器的键值无法修改 map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织。如果想要修改元素的实值,那么是可以的。 Map和list拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作时,操作之前的所有迭代器,在操作完成之后依然有效,当然被删除的那个元素的迭代器必然是个例外。 1.2 Multimap容器 Multimap和map的操作类似,唯一区别multimap键值可重复。 Map和multimap都是以红黑树为底层实现机制。 2、常用的API API 意义 构造函数 map<T1, T2> mapTT map默认构造函数 map(const map &mp) 拷贝构造函数 赋值操作 map& operator=(const map &mp) 重载等号操作符 swap(mp) 交换两个集合容器 大小操作 size() 返回容器中元素的数目 empty() 判断容器是否为空 插入数据元素操作 map.insert(...); //往容器插入元素,返回pair

集合(List、Set)遍历和Iterator迭代器

最后都变了- 提交于 2020-01-15 00:51:42
一、Iterator迭代器 1.介绍 迭代器是一种 设计模式 ,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为 “轻量级” 对象,因为创建它的代价小。 Iterator,所有的集合类,都实现了 Iterator 接口(因为Collection 接口继承Iterator接口),这是一个用于遍历集合中元素的接口,并且只能单向移动。主要包含以下三种方法: hasNext () 是否还有下一个元素。 next () 返回下一个元素。 remove () 删除当前元素。 注意:只有Collection接口继承Iterator接口,而Map接口并没有继承Iterator,所以只有List和Set的实现类实现了Iterator接口的iterator方法,而Map的实现类是无法直接使用iterator方法,之前的章节讲了Map遍历的方式(keyset()和entryset()),是通过返回一个set集合在调用iterator方法的。 2.使用 2.1 对 JAVA 集合进行遍历删除时务必要用迭代器 public static void main ( String args [ ] ) { List < String > famous = new ArrayList < String > ( ) ; famous . add ( "liudehua

AbstractCollection介绍

不羁的心 提交于 2020-01-14 17:54:56
AbstractCollection介绍 AbstractCollection抽象类是Collection的基本实现,其实现了Collection中的大部分方法,可以通过继承此抽象类以最少的代价来自定义Collection; 如果要定义一个不可变Collection,只需要继承此类,并实现iterator和size方法,其中iterator方法返回的迭代器必须实现hasNext和next方法; 如果要定义一个可变Collection,只需要继承此类,并实现iterator,size和add(默认会抛出UnsupportedOperationException)方法,其中iterator方法返回的迭代器必须实现remove方法; 按照Collection接口中的规定,客户端程序员应该提供一个无参构造和以Collection为参数的有参构造; 此抽象类的子类可以用更有效率的方式覆盖父类的方法;   /** *从Collection中继承过来的抽象方法 */ public abstract Iterator<E> iterator(); public abstract int size(); /** *直接返回 size() == 0,与size()的具体实现无关 */ public boolean isEmpty() { return size() == 0; } /** *

Redis源码剖析和注释(十二)--- 集合类型键实现(t_set)

自古美人都是妖i 提交于 2020-01-14 12:16:50
Redis 集合类型键实现(t_set) 集合命令介绍 redis中所有的集合命令如下:Redis集合命令详解 集合类型的实现 之前在redis对象系统源码剖析和注释中提到,一个集合类型的对象的编码有两种,分别是 OBJ_ENCODING_HT和OBJ_ENCODING_INTSET 。 关于集合类型底层的两种数据结构的源码剖析和注释,请看下面的博文。 Redis 字典结构源码剖析和注释 Redis 整数集合源码剖析和注释 从OBJ_ENCODING_INTSET转换到OBJ_ENCODING_HT的条件如下: redis的配置文件中的选项:如果数据编码为整数集合的集合对象的元素数量超过 set-max-intset-entries 阈值,则会转换编码 set - max - intset - entries 512 如果向数据编码为整数集合的集合对象插入字符串类型的对象,则会转换编码 集合对象的数据编码转换的源码如下: // 将集合对象的INTSET编码类型转换为enc类型 void setTypeConvert ( robj * setobj , int enc ) { setTypeIterator * si ; serverAssertWithInfo ( NULL , setobj , setobj -> type == OBJ_SET && setobj ->

Python3学习之路~4.2 迭代器

妖精的绣舞 提交于 2020-01-14 08:10:06
可以直接作用于 for 循环的数据类型有以下几种: 一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等; 一类是 generator ,包括生成器和带 yield 的generator function。 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。 可以使用 isinstance() 判断一个对象是否是 Iterable 对象: from collections import Iterable def fib(max): n,a,b=0,0,1 while n<max: #print(b) yield b a,b = b,a+b n=n+1 return 'done' print(isinstance([],Iterable)) # True print(isinstance((),Iterable)) # True print(isinstance({},Iterable)) # True print(isinstance(set([]),Iterable)) # True print(isinstance('abc',Iterable)) # True print(isinstance((x for x in range(10)),Iterable)) # True print(isinstance