迭代器

python--迭代器和生成器详解

痞子三分冷 提交于 2020-03-06 14:13:22
迭代器和生成器 在Python这门语言中,生成器毫无疑问是最有用的特性之一。生成器同时也满足iterator与iterable。 迭代器 这里有两个概念:Iterable(可迭代)与Iterator。 实现了__next__方法,就叫做Iterator,注意__next__要有退出条件。 实现了__iter__方法就是Iterable,且这个方法返回的是一个Iterator。 所以一个类中我可以不用全部实现__iter__和__next__,只用实现一个,于是我试了一下像这样: class Iterable(object): def __init__(self,MaxIter): self.MaxIter = MaxIter self.Iterator = Iterator(self.MaxIter) def __iter__(self): return self.Iterator class Iterator(object): def __init__(self,MaxIter): self.a, self.b = 0,1 self.iterNum = 0 self.MaxIter = MaxIter def __next__(self): self.iterNum += 1 self.a, self.b = self.b, self.a + self.b if self

C++ STL之list容器的基本操作

时间秒杀一切 提交于 2020-03-06 11:47:56
由于list和vector同属于序列式容器,有很多相同的地方,而上一篇中已经写了vector,所以这一篇着重写list和vector的不同之处和特有之处。 特别注意 的地方: (1)STL中迭代器容器中都要注意的地方(vector中已经提到): 1)任何时候同时使用两个迭代器产生的将会是一个 前闭后开 的区间(具体见插入和删除的例子) 2)begin()指向的是vec中的第0个元素,而 end是指向最后一个元素的后面一个位置 (不是最后一个元素) 3) 迭代器的时效性 ,如果一个迭代器所指向的内容已经被删除,而后又使用该迭代器的话,会造成意想不到的后果 (2) list的迭代器是双向迭代器 (只能++ --,没有偏移功能)而不是像 vector那样的随机迭代器 (和指针几乎一样的所有功能) (3)list和vector的区别,本质区别:list是链式存储,vector在内存中是连续区别的,有本质区别而导致下面区别 1)list不支持随机访问(2)中已经说明,vector可以像数组那样使用平[]访问元素,而list是不可以的 2) list的插入和删除效率很高,所以list有push_front、pop_front、sort而vector中这些操作的效率太低了,所以STL中没有写这些功能 3)list的一些特有的函数remove、reverse、unique、splice

C++标准库

十年热恋 提交于 2020-03-06 09:57:18
C++总结-标准库 一、 容器 1. 顺序容器 1) 定义,初始化,赋值 初始化: a) 默认构造函数(最常用的方式) b) 用其他相同容器初始化,包括用容器本身,或用迭代器 c) 能构造拥有n相同元素容器的构造函数,包括有元素或默认元素的形式 赋值: a) 使用重载的“=”。 b) 使用容器函数assign( )。 c) 使用容器函数swap( ),具有较高的性能(事实上只交换某些内部指针),这个函数的功能是交换两个容器内的函数。 2) 操作 添加: a) 尾部插入元素,push_back( )。 b) 头部插入元素,push_front( ),只适用于list和deque。 c) 任意位置插入元素,insert( ),要指明插入的位置和插入的元素. d) 任意位置插入另个容器或容器中的元素,splice( ),只适用list 删除: a) 删除尾元素,pop_back( ) b) 删除头元素,pop_front( ),只适用于list和deque c) 删除任意位置元素,erase( ),参数是迭代器。 d) 删除特定值或判断值为true的元素,remove(), remove_if(), 只适用list e) 全部清空,clear( ) 大小: a) 获得容器中元素的个数size( ) b) 重新设定容器的大小,resize( ) c)

Python面试题之生成器/迭代器

孤街醉人 提交于 2020-03-06 02:54:57
1.为什么要有生成器? 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以。。。 在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。 第一种方法很简单,只要把一个列表生成式的 [] 改成 () ,就创建了一个generator,其实就是一个tuple。 L = [x * x for x in range(10)] print(L) print(type(L)) L2 = (x * x for x in range(10)) print(L2) print(type(L2)) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # <class 'list'> # <generator object <genexpr> at 0x00FE4FC0> # <class 'generator'> 创建 L 和L2的区别仅在于最外层的 [] 和 () , L 是一个list,而L2是一个generator。

Python高级特性

你离开我真会死。 提交于 2020-03-06 02:53:51
减少代码,提高效率 1.切片 取一个序列的部分元素 L [ start : end : step ] 含头不含尾 1 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 4 L = [ 1, 3, 6, 9, 45, 66] 5 6 print ( L[:4] ) #等同于L[0:4] 切片下标为 0 ~ 3 7 print ( L[-2:] ) #倒数切片 从倒数第2开始往后切 倒数第二、倒数第一 8 print ( L[:5:2] ) #前5个数,每2个取一个 9 print ( L[::5] ) #所有数,每5个取一个 L[ : : -1] 倒切 2.迭代 在Python中,迭代是通过 for...in 来完成的,而很多语言迭代 list 是通过下标完成的。 无论有无下标都可以迭代,如dict dict不是按顺序排列存储,迭代出的结果顺序很可能不一样 dict默认迭代 key 如要要迭代 value: 同时迭代 key 和 value : 判断是否可以迭代 3.迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。 凡是可作用于for循环的对象都是Iterable类型,即迭代对象 凡是可作用于next()函数的对象都是Iterator类型,即迭代器,表示一个惰性计算的序列(只有在需要返回下一个数据时它才会计算)

python迭代器与iter()函数实例教程

我与影子孤独终老i 提交于 2020-03-05 14:24:07
python迭代器与iter()函数实例教程 发布时间:2014-07-16编辑: 脚本学堂 本文介绍了python迭代器与iter()函数的用法,Python 的迭代无缝地支持序列对象,而且它还允许程序员迭代非序列类型,包括用户定义的对象。 迭代器是在版本 2.2 被加入 Python 的,它为类序列对象提供了一个类序列的接口。 序列是一组数据结构,你可以利用它们的索引从0 开始一直“迭代“ 到序列的最后一个条目。 用“计数“的方法迭代序列是很简单的。 Python 的迭代无缝地支持序列对象,而且它还允许程序员迭代非序列类型,包括用户定义的对象。 迭代器用起来很灵巧,可以迭代不是序列但表现出序列行为的对象,例如字典的 key,一个文件的行等。 当使用循环迭代一个对象条目时,几乎不可能分辨出它是迭代器还是序列。不必去关注这些,因为 Python 让它象一个序列那样操作。 如何迭代? 迭代器就是有一个 next() 方法的对象,而不是通过索引来计数。当你或是一个循环机制(例如 for 语句)需要下一个项时,调用迭代器的 next() 方法就可以获得它。条目全部取出后,会引发一个 StopIteration 异常,这并不表示错误发生,只是告诉外部调用者,迭代完成. 不过,迭代器也有一些限制。例如你不能向后移动,不能回到开始,也不能复制一个迭代器.如果你要再次(或者是同时)迭代同个对象

【python】生成器和yield

时光怂恿深爱的人放手 提交于 2020-03-04 19:57:01
python生成器和yield 再一次遇到yield表达,复习了一下生成器,顺手记录一下。 iterable:可迭代对象,只要内部实现了 __iter__ 或 __getitem__ 方法的对象就是可迭代的,如list, dict, tuple, set, str等; iterator:迭代器,内部实现了 __iter__ 和 next() 方法的对象;iterable不一定是iterator,但可以进行转化。 l = [ 1 , 2 , 3 ] iterator_l = iter ( l ) generator:生成器是一种特殊的迭代器,它通过生成函数迭代形成。generator的生成方式一般有两种: yield 和 () generator_ = ( x for x in range ( 5 ) ) def generator_ ( ) : for i in range ( 5 ) : yield i 生成器的特点 惰性求值(lazy evaluation),每次调用next()才会计算下一个值。节省内存空间 一次性,生成器中的元素一次性使用,用完就没了不能重复用。 因此,若涉及到要用到全部元素或排序等操作,相比之下用list会更合适 来源: CSDN 作者: Sarah Huang 链接: https://blog.csdn.net/weixin_44794704

数据结构 - 特殊接口、类

旧街凉风 提交于 2020-03-04 07:43:06
Iterable 接口: Iterable 的子类必须实现iterator()方法,次方法会返回迭代器对象。 Iterable最早出现在JDK 1.5,开始只有iterator()一个抽象方法,需要子类来实现一个内部迭代器Iterator遍历元素.后两个方法是Java 8后新添加的,forEach(Consumer action)是为了方便遍历操作集合内的元素,spliterator()则提供了一个可以并行遍历元素的迭代器,以适应现在cpu多核时代并行遍历的需求.   其中我们可以看下default修饰符,这也是Java 8后新出现的,我们知道,如果我们给一个接口新添加一个方法,那么所有他的具体子类都必须实现此方法,为了能给接口拓展新功能,而又不必每个子类都要实现此方法,Java 8新加了default关键字,被其修饰的方法可以不必由子类实现,并且由dafault修饰的方法在接口中有方法体,这打破了Java之前对接口方法的规范. 来源: CSDN 作者: 袁江南 链接: https://blog.csdn.net/nan8426/article/details/104615905

泛型算法(3)——迭代器

ぃ、小莉子 提交于 2020-03-04 05:27:32
迭代器 除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额为几种迭代器,包括以下几种 插入迭代器 绑定到一个容器上,可用来向容器插入元素 流迭代器 绑定到输入或输出流上,可用来遍历所关联的IO流 反向迭代器 向后而不是向前移动,除了forward_list之外的标准库都有反向迭代器 移动迭代器 不是拷贝其中的元素,而是移动它们 1、插入迭代器 back_inserter front_inserter inserter 只有在容器支持push_front的情况下,才可以使用front_inserter。同理, 只有在容器支持push_back的情况下,才可以使用back_inserter。 插入迭代器操作 it=t 在it指定的当前位置插入值t *it,++it,it++ 不会对it做任何事情 2、iostream迭代器 标准库定义了可以用于IO类型对象的迭代器 istream_iterator读取输入流;ostream_iterator向一个输出流写入数据。 通过使用流迭代器,可以用泛型算法从流对象读取数据以及向其写入数据. istream_iterator操作 istream_iterator<T> in(is) in从输入流is读取类型为T的值 istream_iterator<T> end 读取类型为T的值的istream_iterator迭代器

迭代器基本

断了今生、忘了曾经 提交于 2020-03-04 05:25:51
begin()首迭代器,end()尾迭代器。对begin()解引用指向首元素的引用,end()解引用指向尾元素的下一个位置(不存在的地方)。 如果首位迭代器相等,则代表容器为空。 对于迭代器,都有==的!=但是不一定有<,>,所有要避免使用大小于。 下面将首单次大写 #include <iostream> #include <string> #include <vector> int main() { std::string str = "Lolita is a beautiful girl"; if(str.begin() != str.end()) //确保string非空 { for(auto it = str.begin();it!=str.end()&&!isspace(*it);++it) { if(islower(*it)) *it = toupper(*it); } } std::cout<<str<<std::endl; } 迭代器类型 #include <iostream> #include <string> #include <vector> int main() { std::vector<std::string> strVec ; strVec.push_back("C++"); strVec.push_back("是中国的"); strVec.push