迭代器

20.python迭代器

时间秒杀一切 提交于 2020-03-10 19:42:29
可迭代对象 Iterable 和迭代器对象 Iterator : 可迭代对象: 满足前提: 可以被循环操作的对象,就是 可迭代对象 举例: str、list、tuple、set、dict、range、generator... 如何高效的检测一个对象是否是可迭代对象? 可以使用 collections模块中的 Iterable 类型配合 isinstance(obj,type)内置函数来判断即可 操作步骤如下: 步骤一:导入 collections模块 步骤二: collections. Iterable (类型)配合内置函数isinstance()来进行判断,代码如下: isinstance(obj,collections. Iterable ) 如果返回值为 True,那么它就是一个可迭代对象 如果返回值为 False,那么它不是一个可迭代对象 演示如何判断是否是可迭代对象 import collections str1 = 'abcdefg' lt = [1,2,3,4,5] tp = (10,20,30) s = {100,200,300,400} dic1 = { 'aa' : 'AA' , 'bb' : 'BB' } r = range(10) gen = (x for x in range(5)) print(isinstance(str1,collections

05-课堂笔记

半世苍凉 提交于 2020-03-10 05:32:32
复习 '''1.函数的参数:实参与形参 形参:定义函数()中出现的参数 实参:调用函数()中出现的参数 形参拿到实参的值,如果整体赋值(自己改变存放值的地址),实参不会改变,(可变类型)如果修改内部内容,实参会跟着变化 位置实参 - 只能对位置形参赋值 关键字实参 - 可以对所有(不包含可变长位置形参)形参赋值 位置形参 - 必须出现在最前,且必须传值 默认形参 - 出现在位置形参后*前,可以不用传参 可变长位置形参 - 接收所有位置形参、默认形参没有接收完的位置实参 有无默认值关键字形参 - 必须出现在所有位置形参之后,有默认值可以不用传参,没有默认值必须通过关键字实参传值 可变长关键字形参 - 接收所有有名字的关键字形参没有接收完的关键字实参 def fn(a, b=10, *args, c, d=20, e, **kwargs): pass​ 2.函数的嵌套调用 在一个函数的内部调用另一个函数:在函数内部遇到调用其他函数,就进入其他函数内部,全部走完 回到调用其他函数 的入口​3.函数对象 - 直接赋值、可以加()调用、作为其他函数的参、作为函数的返回值、作为容器对象的元素(成员)4.名称空间与作用域 - LEGB:查找顺序LEGB | 加载顺序BGEL 5.函数的嵌套定义 - 闭包 - 函数的嵌套定义:在一个函数内部定义另一个函数,内部的函数就是闭包 - 应用场景: -

设计模式之迭代器模式

。_饼干妹妹 提交于 2020-03-09 08:48:21
定义 提供了一种方法,顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示。 类型 行为型 适用场景 ①、访问一个集合对象的内容而无需暴露它的内部表示。 ②、为遍历不同的集合结构提供一个统一的接口。 优缺点 优点: ①、分离了集合对象的遍历行为。 缺点: ①、类的个数成对增加。 代码实现 因为Java中已经有自己的迭代器了,所以,就简单实现一下自己的迭代器。 首先创建一个课程类 public class Course { private String name ; public Course ( String name ) { this . name = name ; } public String getName ( ) { return name ; } } 创建一个迭代器 public interface CourseIterator { /** * 获取去下一个课程 */ Course nextCourse ( ) ; /** * 判断是不是最后一个课程 */ boolean isLastCourse ( ) ; } 提供两个方法,一个是获取下一个课程,还有一个是判断是不是最后一个课程。 创建实现类 public class CourseIteratorImpl implements CourseIterator { private List < Course >

ListIterator源码逐条解析

点点圈 提交于 2020-03-08 18:15:40
一家之言 姑妄言之 絮絮叨叨 不足为训 ListIterator接口注释翻译:    列表的迭代器,它允许程序员以任意方向遍历列表,在迭代期间修改列表,并获取迭代器在列表中的当前位置。ListIterator没有当前元素。它的游标位置总是位于调用previous()返回的元素和调用next()返回的元素之间。长度为n的列表的迭代器有n+1个可能的光标位置,如下面的插入符号(^)所示: Element(0) Element(1) Element(2) Element(3) … Element(n-1) ^ ^ ^ ^ ^    注意,remove和set(object)方法不是根据游标位置定义的。它们被定义为对调用next()或previous()返回的最后一个元素进行操作。    该接口是Java集合框架的成员。 笔者废话:    这个接口的注释说的我也是云里雾里,但是我们大概可以从中略窥一二。首先它说明了我们这个接口是可以从任意方向遍历的。如果你仔细看过这个接口内的方法声明,也就明白了这个“任意方向”的含义。通俗来说,它有了所谓的“ 前驱节点 ”和“ 后继节点 ”。    我相信看到这两个名词你可能就明白了这个接口的本意,它就是一个 双向链表 ,不过我们平常也叫它 双链表 。    其次,它也告诉我们这个接口的游标是不指向元素的,它位于 前驱节点 和 后继节点 之间

java中为什么要使用迭代器

孤者浪人 提交于 2020-03-08 12:23:00
简而言之,集合的遍历如果用for来进行的话,需要知道集合的内部构造,想遍历数组的时候一样,需要索引有序。但是例如set集合是无序的,使用for遍历不了。这时需要迭代器来遍历,把集合中所有的元素都找出来。 迭代器(Iterator)模式,又叫做游标(Cursor)模式。迭代器提供一种对容器对象中的各个元素进行访问的方法,而又不需暴露该对象的内部细节。 从定义可见,迭代器模式是为容器而生。 很明显,对容器对象的访问必然涉及到遍历算法。你可以将遍历方法写到容器对象中去(内部迭代器);或者根本不去提供什么遍历算法,让使用容器的人自己去实现去吧(外部迭代器)。这两种情况好像都能够解决问题。 然而在前一种情况,容器承受了过多的功能,它不仅要负责自己“容器”内的元素维护(添加、删除等等),而且还要提供遍历自身的接口;而且由于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历。第二种方式倒是省事,却又将容器的内部细节暴露无遗。 而迭代器模式的出现,很好的解决了上面两种情况的弊端。 由于迭代器模式本身的规定比较松散,所以具体实现也就五花八门。我们先来列举下迭代器模式的实现方式。 1.迭代器角色定义了遍历的接口,但是没有规定由谁来控制迭代。在Java collection的应用中,是由客户程序来控制遍历的进程,被称为外部迭代器; 还有一种实现方式便是由迭代器自身来控制迭代,被称为内部迭代器。

[集合]ListIterator源码解析(7)

微笑、不失礼 提交于 2020-03-08 06:54:13
迭代器可以让开发者遍历一个容器的元素,并且操作元素。 Java有两种原生的迭代器:Iterator和ListIterator, 其中 ListIterator继承自Iterator。 ListIterator比Iterator多了一些方法。例如逆序遍历,遍历时进行set元素到上次操作的元素的位置,add元素等操作。 ListIterator 在该类的说明中,JDK官方也进行了说明,迭代器的游标或者叫索引总是位于调用previous方法返回的元素和调用next方法返回的元素之间。 也就是说,游标不指向元素,而指向元素之间! public interface ListIterator < E > extends Iterator < E > { // Query Operations / 来源: CSDN 作者: 谙忆 链接: https://blog.csdn.net/qq_26525215/article/details/104621235

二叉搜索树迭代器(栈)

ε祈祈猫儿з 提交于 2020-03-08 06:19:14
题目: https://leetcode-cn.com/problems/binary-search-tree-iterator/ /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class BSTIterator { public : /* *实现一个二叉搜索树迭代器。你将使用二叉搜索树的 *根节点初始化迭代器。调用 next() 将返回二叉搜索 *树中的下一个最小的数。 */ stack < TreeNode * > st ; BSTIterator ( TreeNode * root ) { while ( root ) { st . push ( root ) ; root = root - > left ; } } int next ( ) { TreeNode * p = st . top ( ) ; st . pop ( ) ; int ans = p - > val ; p = p - > right ; while ( p ) { st . push ( p ) ; p =

C++:lower_bound 和 upper_bound

天涯浪子 提交于 2020-03-07 20:56:02
C++:lower_bound 和 upper_bound 1. set , map, multiset, multimap 原型: iterator lower_bound ( const value_type & val ) const ; iterator upper_bound ( const value_type & val ) const ; pair < iterator , iterator > equal_range ( const value_type & val ) const ; lower_bound返回的是第一个 >= val 的迭代器 upper_bound返回的是第一个 > val 的迭代器 equal_range 返回的是lower_bound、upper_bound构成的上下限的迭代器区间 实例: struct Y { int y , id ; bool operator < ( Y tmp ) const // 方式1 { //注意const 第一个小于第二个 return y < tmp . y ; } } ; set < Y > s ; set < Y > :: iterator it ; it = s . upper_bound ( m ) ; //此处的查找是按照Y中的实例比较的 二分查找 2. 二分查找 头文件:algorithm -

STL标准入门详解

本秂侑毒 提交于 2020-03-07 06:49:43
第一部分:(参考百度百科) 一、STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和 David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的 一段时间。 STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类 和模版函数的方式,这相比于传统的由函数和类 组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文 件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、 <memory>、<numeric>、<queue>、<set>、<stack>和<utility>。 二、算法 大家都能取得的一个共识是函数库对数据类型的选择对其可重用性起着至关重要的作用。举例来说,一个求方根的函数,在使用浮 点数作为其参数类型的情况下的可重用性肯定比使用整型作为它的参数类性要高。而C++通过模板的机制允许推迟对某些类型的选 择,直到真正想使用模板或者说对模板进行特化的时候

python算术运算符重载、迭代器、call魔术方法和单例设计模式

风流意气都作罢 提交于 2020-03-07 03:41:42
1.算术运算符重载 我们知道在python中有字符串的相加、数字常量的相加,那么对于我们自定义的类实例化后的对象是否可以进行相加呢?答案是可以的。这里就要我们对于算术运算符进行重载。下面我们以__add__和__iadd__重载为例,讲解算术运算符的重载。 1.1.__add__ __add__是用来定义加法的魔术方法。 我们来看下面的例子, class Dog : def __init__ ( self , amount , name ) : self . amount = amount self . name = name def __add__ ( self , other ) : # 定义两个类相加的结果,other为其他类 return Dog ( self . amount + other . amount , self . name ) # 返回一个新类 d1 = Dog ( 23 , "Tom" ) d2 = Dog ( 21 , "Jerry" ) res = d1 + d2 # 等价于 d1.__add__(d2) 等价于 __add__(d1, d2) print ( res ) print ( res . amount ) print ( res . name ) print ( type ( res ) ) 执行结果如下, < __main__ . Dog