迭代器

ES6迭代器和生成器

心不动则不痛 提交于 2019-12-03 20:48:04
一、迭代器 JavaScript 原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和Set。这样就需要一种统一的接口机制,来处理所有不同的数据结构。遍历器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。 任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员) 。 1.Iterator的作用: 为各种数据结构,提供一个统一的、简便的访问接口; 使得数据结构的成员能够按某种次序排列 ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费。 2.原生具备iterator接口的数据(可用for of遍历) Array set容器 map容器 String 函数的 arguments 对象 NodeList 对象 let arr3 = [1, 2, 'kobe', true]; for(let i of arr3){ console.log(i); // 1 2 kobe true } let str = 'abcd'; for(let item of str){ console.log(item); // a b c d } function fun() { for (let i of arguments) {

迭代器与生成器

隐身守侯 提交于 2019-12-03 20:36:08
一、迭代器 迭代器可以理解为一种特殊的游标,是对循环遍历等一系列操作组成的一种抽象描述。而迭代器协议是程序的一种绑定关系,实现了该协议的对象称为可迭代对象。迭代器协议强调对象必须提供一个next或__next__()方法,并且执行该方法只有两种决策,要么返回迭代中的下一项,要么者引起一个StopIteration异常,以终止迭代。for循环的本质是循环所有对象,使用的一定是迭代器协议生成对象。因此for循环可以遍历所有的可迭代对象(字符串、列表、元组、字典、文件对象等)。既然如此,为什么我们定义一个序列的时候没有使用next方法呢?这是为什么呢?从理论上来讲,只有实现迭代器的对象才可称为可迭代对象。而我们在定义字符串、列表、元组、字典、文件对象的时候,本身没有给出next方法。从这种角度上来看,他们并没有遵循迭代器协议。但是平时我们为什么还是认为他们是可迭代对象呢? Python提供了一个可以让某种数据类型变为可迭代数据类型的方法,即让某种数据类型的对象直接调用__iter__()或iter()方法,此时我们再查看该数据类型的对象时就多出了next方法。下面如我们通过一个简单的实例来分析,我们使用字符窜调用__iter__()方法,然后使用可迭代对象调用next方法。 string = "hello world" myiter = string.__iter__() print

迭代器模式

泪湿孤枕 提交于 2019-12-03 20:21:17
20.1 整理项目信息——苦差事周五下午, 我正在看技术网站, 第六感官发觉有人在身后, 扭头一看, 老大站在背后,我赶忙站起来。“王经理, 你找我? ”“哦, 在看技术呀。 有个事情找你谈一下, 你到我办公室来一下。 ”到老大办公室还没坐稳, 老大就开始发话了。“是这样, 刚刚我在看季报, 我们每个项目的支出费用都很高, 项目情况复杂, 人员情况也不简单, 我看着也有点糊涂, 你看, 这是我们现在还在开发或者维护的103个项目, 项目信息很乱, 很多是两年前的信息, 你能不能先把这些项目最新情况重新打印一份给我, 咱们好查查到底有什么问题。 ”老大说。“这个好办, 我马上去办!”我爽快地答复道。很快我设计了一个类图, 准备实施, 如图20-1所示。图20-1 项目信息类图简单得不能再简单的类图, 是个程序员都能实现。 我们来看看这个简单的东西, 先看接口, 如代码清单20-1所示。代码清单20-1 项目信息接口public interface IProject {//从老板这里看到的就是项目信息public String getProjectInfo();}定义了一个接口, 面向接口编程嘛, 当然要定义接口了, 然后看看实现类, 如代码清单20-2所示。代码清单20-2 项目信息的实现public class Project implements IProject {/

六、迭代器、生成器和装饰器

随声附和 提交于 2019-12-03 15:36:33
1.迭代器 定义 能被next()函数进行调用且不断返回下一个值的对象。其内置方法中包含 __iter__ (返回迭代器本身)和 __next__ (返回容器的下一个元素)。 特征 迭代器会生成惰性序列,它通过计算把值依次的返回,一边循环一边计算,而不是一次性得到所有的数据。 优点 需要数据的时候,一次取一个,可以在很大程度上节省内容空间,而不是一次性把所有的数据存入内存中;此外,可以遍历无限量的数据。 创建 使用 iter() 函数来创建。 string = iter('abcd') print(next(string)) print(next(string)) print(next(string)) print(next(string)) # 遍历完成之后继调用 print(next(string)) # 输出结果 StopIteration a b c d # 注意:当遍历完序列时,会引发一个StopIteration异常。使用for循环可以规避整个问题(for循环的底层使用了next方法)。 string = iter('abcd') for item in string: print(item) # 输出结果 a b c d 2. 生成器 定义 包含了yield语句的函数。 特征 执行生成器函数时,其内部代码不执行,而是返回一个生成器对象( 特殊的迭代器 )

python基础篇笔记03 迭代器、生成器、装饰器、内置函数

£可爱£侵袭症+ 提交于 2019-12-03 15:34:21
点—> 太白老师课件 <—我 D13 迭代器、生成器 1. 我们可以对 list,tuple,dict等类型的数据使用for循环从其中依次拿取数据进行使用,我们把这样的过程称为遍历。也叫迭代。 可迭代对象: 把可以通过for循环迭代读取数据的对象称为可迭代对象。(都必须有 ‘__iter__’ 方法,即可迭代协议) 常见可迭代对象: str , list , tuple , set , dict , f1文件句柄 , itertor迭代器(迭代器也是可迭代对象) dir(obj) 对象的所有操作方法 可迭代对象的 dir(obj)里都有'__iter__'这个方法,可以用来判断是否是可迭代的 if ‘__iter__’ in dir(obj) 通常如此判断:from collections import Iterable (Iterator)从模块引包 isinstance(obj , Iterable) 迭代器:   在对数据迭代使用的过程中,都有个带状态的对象来帮助我们记录数据访问的位置。我们把这个帮助我们进行迭代的对象叫做迭代器。   (卡qia子zi) (迭代器必须有'__iter__', '__next__' 方法,即迭代器协议) .__iter__() 返回迭代器自身, .__next__() 返回下一个值 迭代器 \节省内存空间 \\满足惰性机制 \\\不会反复取值

闭包, 迭代器, 生成器

萝らか妹 提交于 2019-12-03 15:07:39
一 闭包 在嵌套函数内,内部函数使用外部非全局变量 作用:保护数据的安全性 装饰器的本质就是闭包 def func(): avg_lst = [] # 自由变量 def foo(pirce): avg_lst.append(pirce) avg = sum(avg_lst) / len(avg_lst) return avg return foo ret = func() print(ret(150000)) print(ret.__closure__) # 查询是不是闭包 print(ret.__code__.co_freevars) # 获取的是自由变量 print(ret.__code__.co_varnames) # 获取的是局部变量 二 迭代器 2.1 可迭代对象 查看 dir() 内部含有__iter__方法的对象,都是可迭代对象。 优点:使用灵活,可以直接查看值 缺点:占内存,不能迭代取值 2.2 迭代器 只要具有__iter__()方法__next__()方法就是迭代器 优点:节省内存,内存机制 缺点:使用不灵活,操作比较繁琐,不能直接查看元素 特点:一次性的(用完就没了),不可逆性(不可后退),惰性机制 2.3 将可迭代对象转换成迭代器 lst = [1,2,3,4,6] new_list = lst.__iter__() #将可迭代对象转换成迭代器 2.4

迭代器模式(迭代器模式2)

孤人 提交于 2019-12-03 14:47:59
和上一篇不同的是 在这个模式里面,直接有个接口,通过接口进行处理 集合菜单: package com.java214.iteratormode.iterator; import java.util.ArrayList; import com.java214.iteratormode.MenuItem; /**   * <p>Title: CakeHouseMenu</p>   * <p>Description: 蛋糕房菜单</p>   * @author 滕一帆   * @date 2019年11月5日 */ public class CakeHouseMenu { private ArrayList<MenuItem> menuItems;//菜单函数 public CakeHouseMenu() { menuItems = new ArrayList<MenuItem>(); addItem("KFC蛋糕早餐","蛋挞+吐司+汉堡包",true,3.99f); addItem("MDL蛋糕早餐","水果鸡蛋+吐司",false,3.59f); addItem("草莓蛋糕","新鲜草莓",true,3.29f); addItem("甜蛋糕","吐司+糖",true,2.59f); //将菜单全部放入菜单参数中 } private void addItem(String name,

java 数组对象的应用

我与影子孤独终老i 提交于 2019-12-03 14:43:01
public class Student 2 { 3 // 成员变量 4 private String name; 5 private int age; 6 7 // 构造方法 8 public Student() 9 { 10 super(); 11 } 12 13 public Student(String name, int age) 14 { 15 super(); 16 this.name = name; 17 this.age = age; 18 } 19 20 // 成员方法 21 // getXxx()/setXxx() 22 public String getName() 23 { 24 return name; 25 } 26 27 public void setName(String name) 28 { 29 this.name = name; 30 } 31 32 public int getAge() 33 { 34 return age; 35 } 36 37 public void setAge(int age) 38 { 39 this.age = age; 40 } 41 42 @Override 43 public String toString() 44 { 45 return "Student [name=" + name + ", age

迭代器模式(迭代器模式1)

▼魔方 西西 提交于 2019-12-03 14:42:44
迭代器模式:两个不同的数据结构,可以组合成可用的数据结构。 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示 场景: 有两家餐厅,共有两个菜单,两家准备合并,每个餐厅都有一个销售系统,但是内部菜单的组成结构稍有不同,一个是用数组存储菜单对象,一个是用集合存储菜单对象 需求: 将两家菜单合并一个菜单 菜单函数代码: package com.java214.iteratormode; public class MenuItem { private String name,description;//名称和描述 private boolean vegetable;//蔬菜 private float price;//价格 public MenuItem(String name,String description,boolean vegetable,float price) { this.name=name; this.description=description; this.vegetable=vegetable; this.price=price; } public String getName() { return name; } public String getDescription() { return description; } public

pythonic-迭代器函数-itertools

倾然丶 夕夏残阳落幕 提交于 2019-12-03 12:22:52
认识 Python 的itertools模块提供了很多 节省内存的高效迭代器 , 尤其解决了一些关于数据量太大而导致 内存溢出(outofmemory) 的场景. 我们平时用的循环绝大多数是这样的. # while 循环: 求1+2+...100 s, i = 0, 1 while i <= 100: s += i i += 1 print('while-loop: the some of 1+2+..100 is:', s) # for 循环 s = 0 for i in range(101): s += i print('for-loop: the some of 1+2+..100 is:', s) while-loop: the some of 1+2+..100 is: 5050 for-loop: the some of 1+2+..100 is: 5050 但如果数据量特别大的话就凉凉了, 所以引入了itertools,迭代器, 类似于 懒加载 的思想 常用API chain() groupby() accumulate() compress() takewhile() islice() repeat() chain 拼接元素 把一组迭代对象串联起来,形成一个更大的迭代器: # join / split s = "If you please draw me a