迭代器

python-迭代器、生成器

牧云@^-^@ 提交于 2019-12-05 03:18:20
生成器属于迭代器 适合迭代器对象:list、dict、tuple、set、str 不适合迭代对象:int、float、bool 迭代器例子 : a = [0,1,2,3] iter (a) # 用 iter ()方法生成迭代对象 print( next (a)) #用 next 来查询,直到超范围 判读对象是否符合迭代例子 : from collections import Iterable a = [0,1,2,3] b = 123 print(isinstance(a, Iterable )) #运用isinstance函数来判断,此结果为True,符合迭代 print(isinstance(a, Iterable )) #同上,此结果为Flase,不符合迭代 生成器例子 : a = (i for i in range(1000000)) #想当与列表生成式的[]改成(),此时a的类型为生成器(generator) print(next(a)) #用next()来查询 函数进化成生成器 :(把return改成yield) 例子: def f(n): for i in range(n): yield i     print('OKOK')a = f(5) #定义一个变量来接受生成器的返回值print(next(a)) #程序运行达到yield后就会停止,不会往下执行

第9章 顺序容器

て烟熏妆下的殇ゞ 提交于 2019-12-05 03:04:28
exercises section 9.2 9.2 list<deque<int> > list_deque_int; section 9.2.1 迭代器 1、迭代器与容器一样有公共的接口(forward_list的迭代器不支持递减运算符(--) exercise section 9.2.1 9.3、 1.迭代器必须指向同一个容器中的元素,或者容器最后一个元素之后的位置。 2.end不在begin之前。 9.4、 //p9_4.cpp #include <vector> #include <iostream> using namespace std; bool find(vector<int>::iterator first, vector<int>::iterator last, int val) { bool exist = false; //用来指示是否找到指定值,初始为false for(auto ix = first; ix != last; ++ix)//遍历迭代范围 { if(*ix == val) //若值相等 { exist = true; //说明找到了指定的值 break; //停止迭代 } } return exist; //返回exist,若存在则exist为true,否则为false } 9.5、 vector<int>::iterator find

迭代器和生成器3

扶醉桌前 提交于 2019-12-05 02:04:51
总结:生成器并行,实际上是串行的,但是时间上给人的感觉是并行的 import timedef product(name): print("%s 准备" %name) while True: try: name1 = yield #yield生产器中实现并行效果 # print("here") print("[%s]开始了,[%s]准备" %(name1,name)) except StopIteration as e: print(e.value) print("here")c = product("ripple")c.__next__()b1 = "wangzi"c.send(b1) #发送一个值作为yield的返回值c.__next__()def produces(name): c =product('A') c2 =product('B') c.__next__() c2.__next__() print("比赛开始了") for i in range(10): time.sleep(0.5) print("一共十场比赛") c.send(i) c2.send(i)produces("ripple")运行结果: 来源: https://www.cnblogs.com/mygodswangzi/p/11896796.html

垃圾回收机制

a 夏天 提交于 2019-12-05 00:08:20
[ ] ```python https://www.cnblogs.com/zhangchaocoming/p/11192436.html https://www.cnblogs.com/liangmingshen/p/10970534.html 可迭代对象 内置有__iter__方法的对象,例如字符串,列表,字典,元组等等都是可迭代对象 迭代器对象 既内置有__next__方法的对象,执行迭代器__next__方法可以不依赖索引取值 又内置有__iter__方法的对象,执行迭代器__iter__方法得到的仍然是迭代器本身   所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在Python中,这种一边循环一边计算的机制,称为生成器:generator   生成器是一个特殊的程序,可以被用作控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器。   生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用,但是,不同于一般的函数会一次性返回包括了所有数值的数组,生成器一次只能产生一个值,这样消耗的内存数量将大大减小,而且允许调用函数可以很快的处理前几个返回值

Python-基础-常用术语对照表

南笙酒味 提交于 2019-12-04 23:53:33
下面内容主要摘抄自 python 官网, https://docs.python.org/3.7/glossary.html#glossary ,部分内容有删减。 2to3 一个将 Python 2.x 代码转换为 Python 3.x 代码的工具,能够处理大部分通过解析源码并遍历解析树可检测到的不兼容问题。 2to3 包含在标准库中,模块名为 lib2to3;并提供一个独立入口点 Tools/scripts/2to3。参见 2to3 - 自动将 Python 2 代码转为 Python 3 代码。 因为官方将在2020年不再支持 Python 2.x, 在遇到没有 Python 2.X 版本 的code 的时候,可以尝试使用这个工具将代码转化成Python 的版本。 abstract base class -- 抽象基类 抽象基类简称 ABC,是对 duck-typing 的补充,它提供了一种定义接口的新方式,相比之下其他技巧例如 hasattr() 显得过于笨拙或有微妙错误(例如使用 魔术方法)。ABC 引入了虚拟子类,这种类并非继承自其他类,但却仍能被 isinstance() 和 issubclass() 所认可;详见 abc 模块文档。 Python 自带许多内置的 ABC 用于实现数据结构(在 collections.abc 模块中)、数字(在 numbers 模块中)

设计模式——行为型模式之迭代器模式(八)

我是研究僧i 提交于 2019-12-04 22:02:05
迭代器模式 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 介绍 意图: 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 主要解决: 不同的方式来遍历整个整合对象。 何时使用: 遍历一个聚合对象。 如何解决: 把在元素之间游走的责任交给迭代器,而不是聚合对象。 关键代码: 定义接口:hasNext, next。 应用实例: JAVA 中的 iterator。 优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。 缺点: 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。 使用场景: 1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。 注意事项: 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。 实现

python内置函数的使用(一)

╄→尐↘猪︶ㄣ 提交于 2019-12-04 20:51:24
迭代器(iterator)和可迭代对象(iterable)   在python中,要实现要个对象可以进行遍历,也就是实现for循环,那么他必须是一个可迭代对象,例如string,tuple,list,dict,set都是可迭代对象(iterable),实现的方法是写入了__iter__()函数,前面我们说过鸭子模型,只要实现了这个方法,那么自定义类就可以看成是 一个可迭代对象。如果我们想要实现一个迭代器,那么我们就要实现写入__next__()方法,举个例子要把list迭代对象转变成迭代器,我们有两种方法让他转变为迭代器,一种就是直接用内置函数iter(),或者自定义类,重写__next__()方法。   自定义实现类实现for循环功能:   class A:     pass   a = A()   for i in a:     print(i) #打印结果:'A' object is not iterable 报错,说明他不是可迭代对象   首先我们要让他是一个可迭代对象:   class A:     def __iter__(self):       pass   a = A()   for i in a:     print(i) #打印结果:还是报错   我们为什么实现了__iter__()把对象变成可迭代对象,怎么还不能使用for循环,我们需要知道

Python基础

家住魔仙堡 提交于 2019-12-04 20:36:21
python简介 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。 Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。 Python 是交互式语言: 这意味着,您可以在一个 Python 提示符 >>> 后直接执行代码。 Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。 Python 是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到 WWW 浏览器再到游戏。 Python 特点 易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。 易于阅读:Python代码定义的更清晰。 易于维护:Python的成功在于它的源代码是相当容易维护的。 一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好。 互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断。 可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作

设计模式--迭代器模式

a 夏天 提交于 2019-12-04 20:23:07
设计模式--迭代器模式 1、迭代器模式    迭代器模式: 又称为游标(cursor)模式,也就是抽象一个迭代器类来分离聚集的遍历行为,这样既可以做到不暴露聚集的内部结构,又可让外部代码透明地访问聚集内部的数据。 2、迭代器模式的结构 角色 抽象聚合角色 :定义存储、添加、删除聚合对象以及创建迭代器对象的接口; 具体聚合角色: 实现抽象聚合类,返回一个具体迭代器的实例; 抽象迭代器角色: 定义访问和遍历聚合元素的接口,通常包含first()、next() 等方法; 具体迭代器角色: 实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。 类图 3、迭代器模式举例 抽象聚合接口:Aggregate.java 1 package iterator; 2 /** 3 * 抽象聚合接口 4 * @author nick 5 * 6 */ 7 public interface Aggregate { 8 public abstract Iterator createIterator(); //定义抽象方法,返回迭代器类对象 9 } 具体聚合类:ConcreteAggregate.java 1 package iterator1; 2 /** 3 * 具体聚合角色 4 * @author nick 5 */ 6 public class ConcreteAggregate

迭代器与生成器

末鹿安然 提交于 2019-12-04 20:21:54
[ ] ```python https://www.cnblogs.com/zhangchaocoming/p/11192436.html https://www.cnblogs.com/liangmingshen/p/10970534.html 可迭代对象 内置有__iter__方法的对象,例如字符串,列表,字典,元组等等都是可迭代对象 迭代器对象 既内置有__next__方法的对象,执行迭代器__next__方法可以不依赖索引取值 又内置有__iter__方法的对象,执行迭代器__iter__方法得到的仍然是迭代器本身 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。   所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在Python中,这种一边循环一边计算的机制,称为生成器:generator   生成器是一个特殊的程序,可以被用作控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器。