迭代器

生成器

只愿长相守 提交于 2019-11-28 15:31:26
一、yield关键字 yield的英文单词意思是生产,在函数中但凡出现yield关键字,再调用函数,就不会继续执行函数体代码,而是会返回一个值。 def func(): print(1) yield print(2) yield g = func() print(g) <generator object func at 0x10ddb6b48> 生成器的本质就是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径。并且从Python 2.5+开始,[PEP 342:通过增强生成器实现协同程序]的实现为生成器加入了更多的特性,这意味着生成器还可以完成更多的工作。这部分我们会在稍后的部分介绍。 def func(): print('from func 1') yield 'a' print('from func 2') yield 'b' g = func() print(F"g.__iter__ == g: {g.__iter__() == g}") res1 = g.__next__() print(f"res1: {res1}") res2 = next(g) print(f"res2: {res2}") # next(g) # StopIteration g.__iter__ == g: True

C++ algorithm算法库

佐手、 提交于 2019-11-28 15:20:04
C++ algorithm算法库 Xun 标准模板库(STL)中定义了很多的常用算法,这些算法主要定义在 <algorithm> 中。编程时,只需要在文件中加入 #include<algorithm> 即可方便地使用这些算法。若要用好这些函数,你必须了解以下几个概念: 容器 容器是用来存放各种数据的一个东西, <algorithm> 中的算法是针对容器设计的。因此,不论数据是一些 int , char 还是自定义的 class , <algorithm> 中的函数都可以正确应对。 vector 是最常用的容器。 迭代器 迭代器是与容器进行配套使用的。它的作用是对容器中的元素进行遍历,比如数组的指针就可以看作一种迭代器。迭代器一般支持解引用( operator*() )、自加( operator++() )、相等( operator==() )等操作。 谓词 谓词是用来对 <algorithm> 中的函数进行定制操作的。谓词可以是lambda表达式或是函数/函数指针,并且 <algorithm> 中只有一元谓词和二元谓词,即函数只能接收一个或两个参数。对于需要额外参数的谓词可以使用lambda表达式的捕获功能。 pair 部分算法会有两个返回值, pair 有两个成员 first 和 second ,用来将两个值进行打包返回。 下面的内容主要来源于《C++ Primer

装饰器、生成器、迭代器

旧城冷巷雨未停 提交于 2019-11-28 15:06:24
装饰器 装饰器 装饰器是一个 闭包 ,把一个函数作为一个参数然后返回一个替代的函数,本质上就是一个 返回函数 的高阶函数。 闭包:如果在一个内部函数中对外部作用域(但不是全局作用域)的变量进行引用,那么该内部函数称为闭包 什么时候用装饰器? 在不修改原函数的前提下增加函数的功能 ,最好的方法是使用装饰器。(在代码运行期间动态增加功能) 为func函数添加多个装饰器: 1 def dec1(func): 2 def wrapper(*args, **kwargs): 3 print('添加功能1') 4 func() 5 print('添加功能1') 6 return wrapper 7 def dec2(func): 8 def wrapper(*args, **kwargs): 9 print('添加功能2') 10 func() 11 print('添加功能2') 12 return wrapper 13 14 @dec1 15 @dec2 16 def func(): 17 print('原本功能0') 18 19 func() 20 21 # 添加功能1 22 # 添加功能2 23 # 原本功能0 24 # 添加功能2 25 # 添加功能1 装饰器使用场景 1.参数、结果的检查。 2.缓存 3.计数 4.日志 5.统计 6.权限管理 7.重试 生成器 列表生成式

手写一个python迭代器

纵然是瞬间 提交于 2019-11-28 14:54:31
分析 我们都知道一个可迭代对象可以通过iter()可以返回一个迭代器。 如果想要一个对象称为可迭代对象,即可以使用for,那么必须实现__iter __()方法。 在一个类的实例对象想要变成迭代器,就必须实现__iter__()和__next__()方法。 调用iter()时,在对象内部默认调用__iter__(),即__iter__()的返回值应该是一个迭代器。 for的每次循环中或者next()时,都是自动调用迭代器的__next__()方法,并有一个返回值。 实现 class Classmate: def __init__(self): self.names = [] self.num = 0 def add(self, name): self.names.append(name) def __iter__(self): return self def __next__(self): if self.num < len(self.names): ret = self.names[self.num] self.num += 1 return ret else: raise StopIteration c = Classmate() c.add("张三") c.add("李四") c.add("王五") for i in c: print(i) """ 张三 李四 王五 """

python随笔(1)

丶灬走出姿态 提交于 2019-11-28 14:08:43
Python中iterable(迭代器)、generator(生成器)、yield 迭代器:   我们平时使用的列表,就是一个迭代器。可以通过for循环的方式去读取列表中的每一个元素。    所有可以通过for .. in 进行遍历的都是迭代器 。比如列表、字符串、files 生成器:   当迭代器声明一个列表或者字符串,当他们存储的内容过多时,会占用较多的内存。这时候生成器的作用就显现出来了。 来源: https://www.cnblogs.com/jjb1997/p/11410167.html

迭代器整理版

你。 提交于 2019-11-28 13:18:49
3. 迭代器 3.1 可迭代对象    1) 可迭代对象定义 对于迭代器来说,我们更熟悉的应该是可迭代对象,之前无论是源码还是讲课中或多或少我们提到过可迭代对象这个词。之前为了便于大家理解可迭代对象,可能解释的不是很正确,所以今天我们正式的聊一聊什么是可迭代对象。从字面意思来说,我们先对其进行拆解:什么是对象?Python中一切皆对象,之前我们讲过的一个变量,一个列表,一个字符串,文件句柄,函数名等等都可称作一个对象,其实一个对象就是一个实例,就是一个实实在在的东西。那么什么叫迭代?其实我们在日常生活中经常遇到迭代这个词儿,更新迭代等等,迭代就是一个重复的过程,但是不能是单纯的重复(如果只是单纯的重复那么他与循环没有什么区别)每次重复都是基于上一次的结果而来。比如你爹生你,你生你爹,哦不对,你生你儿子,你儿子生你孙子等等,每一代都是不一样的;还有你使用过得app,微信,抖音等,隔一段时间就会基于上一次做一些更新,那么这就是迭代。可迭代对象从字面意思来说就是一个可以重复取值的实实在在的东西。 那么刚才我们是从字面意思分析的什么是可迭代对象,到目前为止我们接触到的可迭代对象有哪些呢? str list tuple dic set range 文件句柄等,那么int,bool这些为什么不能称为可迭代对象呢?虽然在字面意思这些看着不符合

迭代器与生成器

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

<<C++ Primer>> 第三章 字符串, 向量和数组 术语表

醉酒当歌 提交于 2019-11-28 12:53:27
术语表 第 3 章 字符串, 向量和数组 begin: 是 string 和 vector 的成员,返回指向第一个元素的迭代器。也是一个标准库函数,输入一个数字,返回指向该数字首元素的指针。 缓冲区溢出(buffer overflow): 一种严重的程序故障,主要的原因是试图通过一个越界的索引访问容器内容,容器类型包括 string,vector 和 数组等。 C 风格字符串(C-style string): 以空字符结束的字符数组。字符串字面值是 C 风格字符串,C风格字符串容易出错。 类模板(class template): 用于创建具体类型的模板。要想使用类模板,必须提供关于类型的辅助信息。例如,要定义一个 vector 对象需要指定元素的类型:vector 包含 int 类型的元素。 编译器扩展(compiler extension): 某个特定的编译器为 C++ 语言额外增加的特性。基于编译器扩展编写的程序不易移植到其他的编译器上。 容器(container): 是一种类型,其对象容纳了一组给定类型的对象。 vector 是一种容器类型。 拷贝初始化(copy initialization): 使用赋值号( = )的初始化形式。新创建的对象是初始值的一个副本。 difference_type: 由 stirng 和 vector 定义的一种带符号整数类型

可迭代对象,迭代器对象,for循环

时光毁灭记忆、已成空白 提交于 2019-11-28 12:48:56
迭代器:迭代的工具。迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的。如计算机中的迭代开发,就是基于软件的上一个版本更新。以下代码就不是迭代,它只是单纯的重复 while True: print(' ' 10) 一、可迭代对象 python中一切皆对象,如 x = 1 name = 'nick' lis = [1, 2] tup = (1, 2) dic = {'name': 'nick'} s1 = {'a', 'b'} def func(): pass f = open('49w.txt', 'w', encoding='utf-8) 对于这一切的对象中,但凡有__iter__方法的对象,都是可迭代对象。 x = 1.__iter__ # SyntaxError: invalid syntax 以下都是可迭代的对象 name = 'nick'.__iter__ lis = [1, 2].__iter__ tup = (1, 2).__iter__ dic = {'name': 'nick'}.__iter__ s1 = {'a', 'b'}.__iter__ f = open('49w.txt', 'w', encoding='utf-8') f.__iter__ f.close() 1.1 总结 可迭代的对象

列表迭代器 ListIterator

社会主义新天地 提交于 2019-11-28 12:48:00
package com.Test01; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.ListIterator; /* ConcurrentModificationException 当不允许这样的修改时,可以通过检测到对象的并发修改的方法来抛出此异常。 */ public class ListDemo { public static void main(String[] args) { //创建集合对象 List<String> list = new ArrayList<String>(); //添加元素 list.add("hello"); list.add("world"); list.add("java"); // 遍历集合 /* Iterator<String> it = list.iterator(); while (it.hasNext()) { String s = it.next(); if(s.equals("world")) { list.add("javase"); } } */ /* for(int i = 0;i<list.size();i++) { String s = list.get(i); if(s