迭代器

四:迭代器生成器

大城市里の小女人 提交于 2019-11-30 04:23:06
一:迭代器 暂时不涉及到自定义迭代器,涉及到了再补,暂时知道for循环的原理就可以了. 1有__iter__就是可迭代的,也叫可迭代协议 2双下方法:c语言写好了的内置方法,可以用不止一种的方式调用 3迭代取值的工具 4可迭代对象执行__iter__得到的返回值就是迭代器. 5可以把它看作数据流,只能前进不能后退,迭代到头了就会从内存消失 6如果还有__next__方法,那么就是迭代器了,光有__next__就什么都不是 7 迭代器的另一个好处是节省内存,不会一次全在内存中生成,而是随着循环每次生成一个 8只关心当前数据,和下一个数据的位置,其他数据没有在内存当中 9迭代器一定是可迭代的 10很少自己写迭代器,都是用for去循环可迭代对象,当到头没有数据报StopIteration异常,for循环完美的处理了这个异常. 11.for循环的本质就是通过__iter__拿到迭代器,然后不断调用__next__获取数值,直到报异常并处理掉 迭代器更多的是从已经存在的数据结构中获取值,就算没有索引也可以不断获取后面的数据,迭代器知道这些就可以了. 迭代器几乎不会自己定义 class Test: pass test = Test() for i in test: print(i) #TypeError: 'Test' object is not iterable for遍历不可迭代对象报错

C++ - STL - map的基础操作

别来无恙 提交于 2019-11-30 03:25:17
STL - map常用方法 map简述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,其作用类似于python之中的字典,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。 map的基本操作函数: | 方法 | 作用 | | | | ---------------- | ------------------------------- | | | | begin() | 返回指向map头部的迭代器 | | | | clear() | 删除所有元素 | | | | count() | 返回指定元素出现的次数 | | | | empty() | 如果map为空则返回true | | | | end() | 返回指向map末尾的迭代器 | | | | equal_range() | 返回特殊条目的迭代器对 | | | | erase() | 删除一个元素 | | | | find() | 查找一个元素 | | | | get_allocator() | 返回map的配置器 | |

浅谈iterator迭代器模式

十年热恋 提交于 2019-11-30 02:39:51
一、前言 设计模式有很多,最典型的是GoF的23种设计模式,听起来很多,其实大部分我们都是见过的,按照常见度来分,最常用的差不多是六七个吧,因此,我们在学习的时候应该有轻重缓急之分,不能一视同仁,而应该抓住重点,将一些最常用的设计模式吃透了,那么我们在遇到一个实际问题的时候就能根据问题的需要来进行相应的取舍。学习是一个循环往复的过程,没有学过一次不再接触就能掌握的,一定要反复的记忆,反复的练习,不断地提炼,不断地提高,没有复习的学习就是参观,没有预习的学习就是做梦,没有提升的学习就是浪费时间。 二、迭代器模式 什么叫做迭代器,我们可能在C++的STL标准模板库或者在Java中见过iterator这个东西,所谓“迭代”就是按照一定的次序或顺序进行重复操作,这个操作可以是遍历也可以是反复的计算,而迭代器就是按照一定的顺序对元素进行遍历的过程。理解到这个程度,我们可能非常的奇怪,因为我们完全可以使用一个for循环来完成这样的操作,又何必大费周章的来一个迭代器来遍历呢?!这就涉及到软件设计中最重要的一个原则了,那就是高内聚,低耦合。当我们使用for循环来完成遍历操作的时候代码中有着大量的耦合,当我们需要修改代码的时候,不能做到少改甚至不改遍历的代码,而迭代器可以做到,这为代码的可移植性、可扩展性等特性奠定了基础。我们可以看到设计模式大多数是把简单的问题给搞复杂了

day 13总结(闭包函数、装饰器、迭代器)

≡放荡痞女 提交于 2019-11-30 02:00:29
一、闭包函数 1、什么是闭包? 闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)。 闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。 def outter(): x = 1 def inner(): print(x) return inner f = outter() def f2(): x = 2 f() f2() 1.1 两种函数传参的方式 方式一:参数的形式 def func(x): print(x) func(1) func(1) func(1) 1 1 1 方式二:包给函数 def outter(x): x = 1 def inner(): print(x) return inner f = outter(1) f() f() f() # 查看闭包的元素 print(F"f.__closure__[0].cell_contents: {f.__closure__[0].cell_contents}") 1 1 1 f.__closure__[0].cell_contents: 1 2、闭包函数的应用 闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域。 应用领域:延迟计算(原来我们是传参,现在我们是包起来)、爬虫领域。 import

【第十四篇】Python 迭代器

 ̄綄美尐妖づ 提交于 2019-11-30 00:31:28
一、迭代器 迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 1.1 判断一个对象是否可迭代 可以使用 isinstance() 判断一个对象是否是 Iterable 对象: In [50]: from collections import Iterable In [51]: isinstance([], Iterable) Out[51]: True In [52]: isinstance({}, Iterable) Out[52]: True In [53]: isinstance('abc', Iterable) Out[53]: True In [54]: isinstance(mylist, Iterable) Out[54]: False In [55]: isinstance(100, Iterable) Out[55]: False 1.2 可迭代对象的本质 我们分析对可迭代对象进行迭代使用的过程,发现每迭代一次(即在for...in...中每循环一次)都会返回对象中的下一条数据,一直向后读取数据直到迭代了所有数据后结束。那么,在这个过程中就应该有一个“人”去记录每次访问到了第几条数据,以便每次迭代都可以返回下一条数据。我们把这个能帮助我们进行数据迭代的“人

Python:range 对象并不是迭代器

牧云@^-^@ 提交于 2019-11-29 23:41:35
简评: 迭代器(iterator)是惰性可迭代对象(lazy iterable),range 函数在 Python 3 中是一个惰性的可迭代对象,那么 range 是不是迭代器呢?为什么。 TLNR:Python 3 中的 range 对象(Python 2 中的 xrange 对象)是 lazy 的,但 range 对象却不是迭代器。 是的,这让人很困惑 当谈论 Python 中的迭代器(iterator)和可迭代对象(iterable)时,你很可能会听到有人重复 range 是迭代器的误解。我认为这是非常严重误解, 如果你认为 range 对象是迭代器,那么你关于「迭代器是如何运行」的心智模型还不够清楚。从某种意义上来说,range 和迭代器都是「惰性」的,但它们是以相当不同的方式实现「惰性」的 什么是迭代器(iterator) 在 Python 中,可迭代对象就是你可以迭代的任何东西,而迭代器就是实际迭代的东西。 Iter-ables are able to be iterated over. Iter-ators are the agents that perform the iteration. 可以使用 iter 函数从任何可迭代对象中获取迭代器: 一旦有了迭代器,可以用它做的唯一的事情就是获得它的下一个元素: 如果没有更多的元素了, 则会抛出一个 stop

Lua之迭代器和范性for

 ̄綄美尐妖づ 提交于 2019-11-29 23:31:18
基本环境: Microsoft Windows XP/Service Pack 2 Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio 迭代器: 百度百科的解释:迭代器( iterator )是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。 而在Lua 中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素。 先看一个例子: function list_iter(t) local i = 0 local n = table.getn(t) return function () i = i + 1 if i <= n then return t[i] end end end 按照上面的文字定义,我们可以很清楚的知道list_iter返回的匿名函数就是Lua中的迭代器。 t = {10, 20, 30} iter = list_iter(t) while true do local element = iter() if element == nil then break end print (element) end 上面的iter就是我们所需要的迭代器。在while循环中,调用iter(),我们就可以依次取得t中的元素。 这里正是利用了闭包的特点,,每次调用list

Java集合框架

亡梦爱人 提交于 2019-11-29 21:59:09
集合框架体系图 Java集合框架位于java.util包下 短虚线框表示接口,长虚线框表示抽象类,实线框表示类 带三角箭头的实线表示继承关系,由子类指向父类 带三角箭头的虚线表示实现,由类指向接口 带实箭头的虚线表示依赖关系 右下角的Collections和Arrays是工具类 Iterable Iterable是一个接口,实现该接口表明自身可迭代,核心在于实现接口方法iterator()返回一个迭代器 接口方法 default void forEach(Consumer<? super T> action) //对 Iterable的每个元素执行给定的操作,直到所有元素都被处理或动作引发异常。 Iterator<T> iterator() //返回类型为 T元素的迭代器。 default Spliterator<T> spliterator() //在Iterable描述的元素上创建一个Iterable 。 Iterator Iterator是一个接口,定义了遍历集合类的基本方法(由方法可以看出只能支持简单的单向遍历) 由图中可以看出Collection依赖于Iterator,也就是说实现了接口Collection的类都是可迭代对象 接口方法 default void forEachRemaining(Consumer<? super E> action) /

python之路——迭代器和生成器

牧云@^-^@ 提交于 2019-11-29 21:31:19
阅读目录   楔子   python中的for循环   可迭代协议   迭代器协议   为什么要有for循环   初识生成器   生成器函数   列表推导式和生成器表达式   本章小结   生成器相关的面试题 返回顶部 楔子 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,有几种方式? 首先,我可以通过索引取值l[0],其次我们是不是还可以用for循环来取值呀? 你有没有仔细思考过,用索引取值和for循环取值是有着微妙区别的。 如果用索引取值,你可以取到任意位置的值,前提是你要知道这个值在什么位置。 如果用for循环来取值,我们把每一个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个直接去取其他位置的值。 但你有没有想过,我们为什么可以使用for循环来取值? for循环内部是怎么工作的呢? 迭代器 返回顶部 python中的for循环 要了解for循环是怎么回事儿,咱们还是要从代码的角度出发。 首先,我们对一个列表进行for循环。 for i in [1,2,3,4]: print(i) 上面这段代码肯定是没有问题的,但是我们换一种情况,来循环一个数字1234试试 for i in 1234 print(i) 结果: Traceback (most recent call last): File "test.py",

迭代器的使用及问题

冷暖自知 提交于 2019-11-29 21:06:47
迭代器虽然拥有指针的功能,但不是 指针!其最重要的便是内容提纲和成员访问。 迭代器 是一种类似指针的对象,其重载了指针->,*,++ --等操作符,其实质是封装了原生指针,为了为容器提供统一的接口, 一、声明 容器类型<typpe,.>::iterator 迭代器名称 例如:vector<int>::iterator iter; 二、迭代器失效 向容器中添加或者删除数据都有可能导致迭代器失效 (1)顺序容器(vector,deque) 顺序容器即使用了连续分配的内存,在向容器中添加或者删除数据时,都将使当前插入或者删除后面的元素向前或者向后移动一个位置,存在指向 已经发生移动的 数据 的迭代器将失效,使用以及失效的迭代器 自增 或者是 操作 直接使程序崩溃!使不得使不得啊! 在使用Vector和deque的erase()时,返回的是当前删除节点的下一个迭代器,故使用for循环删除时,应该明确指出迭代器ite接收下一个iterator。 (2)关联容器 关联容器在删除或者添加元素时,将使指向当前元素迭代器失效。对于map的erase()函数,其删除后返回下一个元素的迭代器,且被删除元素的后面的迭代器依然有效。 注意:end()函数指向的是容器最后一个元素的后一个位置,如果直接取值将会报错,使程序崩溃! 解决方案: 在循环迭代删除的时候可以使用如下方法,先将参数ite传给erase