迭代器

迭代器和生成器

雨燕双飞 提交于 2019-12-21 14:23:34
迭代器 查看是否可迭代 from collections import Iterable from collections import Iterator print(isinstance('abc',Iterable)) #True print(isinstance('abc'.__iter__(),Iterator) ) #True s = "abcdefg" c = s.__iter__() # 获取迭代器 print(c.__next__()) #获取一个元素 a print(c.__next__()) #b 使用while循环和迭代器来模拟for循环 lst = [1,2,3] it = lst.__iter__() while 1: try: i = it.__next__() print(i) except StopIteration: break 迭代器特点: 1.节省内存 2.惰性机制 3.不能反复,只能向下执行 生成器 获取生成器的三种方法: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的转换也可以获取生成器 def func(): print('aaa') yield 'bbb' gener = func() #获取到生成器 print(gener) #===> <generator object func at 0x10567ff68>

二叉树的链式实现

↘锁芯ラ 提交于 2019-12-21 07:21:22
相关术语: 平衡树,非平衡树,完全数,满树。 实现策略: 1)数组实现 这个还是非常重要的,有时间写一下,先用链来写 元素n的(从0开始按层编号)左子树编号为2n+1,右子树编号为2n+2,数学证明就略了,用这个来控制下标 2)模拟链式实现 3)链式实现 树是一种非线性结构,那么跟前不一样,必须根据你的需求 来构造新的节点才能满足树中的节点特征 : package Tree;public class BinaryTreeNode { protected Object element; protected BinaryTreeNode left,right; public BinaryTreeNode(Object element)//用元素来构造一个结点 { this.element = element; left = null; right = null; } public int numChildren(){//返回结点的子树上结点的个数 int count = 0; if(left != null) count = 1 + left.numChildren(); if(right != null) count = count + 1 + right.numChildren(); return count; } } 下面是一个实现了一些基本操作的二叉树的ADT

C# 迭代器中yield关键字的使用

巧了我就是萌 提交于 2019-12-21 03:44:58
上一篇笔记:C# 迭代器 https://blog.csdn.net/dayuhaitang1/article/details/103593599 在上一篇笔记中,演示的是C#1.0中的迭代器的创建方法,而在C#2.0中经过了改进之后又有了新的书写形式,所以写一篇笔记记录一下。 一、yield关键字 C#2.0中的迭代器的实现代码相较于C#1.0有了很大幅度的减少,之所以会这样这主要就是引入了yield关键字。yield关键字其实质就是在编译器对代码进行编译时,遇到yield关键字时就是在提示编译器这是实现一个迭代器块的方法。也就是将本来应该由我们创建嵌套类实现IEnumerator的工作,让编译器帮我们做了而已。但是这样的确使我们为实现迭代器减少了很大的工作量,使我们能更好的运用迭代器这一工具。 二、利用yield实现迭代器 class Program { static void Main ( string [ ] args ) { object [ ] values = { "a" , "b" , "c" , "d" , "e" } ; IterationSample collection = new IterationSample ( values , 3 ) ; foreach ( var item in collection ) { Console . WriteLine

python基础之面试常问

半世苍凉 提交于 2019-12-21 01:50:29
目录 python相对其他语言有什么特点? python内存管理机制,gc机制的了解,gc回收三种算法。 lambda函数 高级函数 map、reduce、filter、sorted等。 简述六种基本数据类型(number、string、list、tuple、dict、set)。 python中深拷贝与浅拷贝。 python中is和==的区别。 python中if __ name ==' main __'有什么含义? python命令和python -m命令在执行脚本时的区别? python中多进程、多线程、协程。 python中迭代器、生成器。 python中装饰器。 python中单引号、双引号、三引号的应用场景与区别。 python如何体现面对对象的三大特性。 python中异常管理的机制。 python函数闭包。 参考: python面试常问 python相对其他语言有什么特点? python内存管理机制,gc机制的了解,gc回收三种算法。 python内存管理( 原博文——python内存管理 ) python是动态语言,对象与引用分类,一个变量使用不需要事先声明,而在赋值时,变量可以重新赋值为任意值。 python中,整数和短小的字符,Python都会缓存这些对象,以便重复使用。当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象。

Python的可迭代对象、迭代器和生成器

痞子三分冷 提交于 2019-12-20 17:32:10
前言   在学习Python语言,不可避免遇到各种绕口的概念,比如可迭代对象、迭代器和生成器,新手看了第一印象就是一脸懵。为此,本文详细介绍和解释这些概念,让新手一看就会。   回顾Python中的数据存储结构,Python是用容器来存储数据,比如:list、dict、tuple、strset…等等,当数据量不大的时候用这些存储没什么问题,当数据量特别大甚至是无限的时候,就不能使用这些容器来存储了,于是Python有一种机制专门解决这种问题。 一、可迭代对象(iterable)和迭代器(iterator) 1.1 概念介绍   通俗点讲,可迭代对象就是可以产生迭代器的对象,所谓迭代器就像一个懒加载的工厂,本身不存储数据,只有你向它索要的时候临时给你生成数据。下面用一个例子来解释: >> > x = [ 1 , 2 , 3 ] >> > y = iter ( x ) >> > z = iter ( x ) >> > next ( y ) 1 >> > next ( y ) 2 >> > next ( z ) 1 >> > type ( x ) < class 'list' > >> > type ( y ) < class 'list_iterator' >   在这个例子中,x是一个list对象,是一个可迭代对象,通过iter()函数生成x的迭代器y,那么只有在调用next(

STL 总结

爱⌒轻易说出口 提交于 2019-12-20 11:52:46
发现stl还是很好用的。。。。学过以后,po一发博客便于以后复习和加深记忆和理解 首先对迭代器加以说明 C++ primer (中文版第四版)第273页 9.3.2 begin和end成员 begin和end操作产生指向容器内第一个元素和最后一个元素的下一个位置的迭代器,如下所示。这两个迭代器通常用于标记包含容器中所有元素的迭代范围。       c.begin() 返回一个迭代器,它指向容器c的第一个元素       c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置       c.rbegin() 返回一个反向迭代器,它指向容器c的最后一个元素       c.rend() 返回一个反向迭代器,它指向容器c的第一个元素前面的位置 上述每个操作都有两个不同的版本:一个是const成员,另一个是非const成员。这些操作返回什么类型取决于容器是否为const。如果容器不是const,则这些操作返回iterator或reverse_iterator类型。如果容器是const,则其返回类型要加上const_前缀,也就是const_iterator和const_reverse_iterator类型。          其次,说明一下,定义在algorithm中的固有stl函数,find 和 count; <1>find 函数,返回值类型为找到元素的迭代器

python生成器和迭代器的简记

蹲街弑〆低调 提交于 2019-12-20 10:33:07
一、迭代器   迭代器:迭代是访问集合元素的一种方式,迭代器是一个可以记住遍历的位置的对象,其中字符串,列表或者元组对象都可用于创建迭代器(所创建的迭代器就是遍历用于生成该迭代器的对象)。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。我个人理解,迭代器是一种遍历访问工具。   迭代器有两个基本的方法:iter()和next()。   如:     >>> list=[1,2,3,4]     >>> it = iter(list) # 创建迭代器对象     >>> print (next(it)) # 输出迭代器的下一个元素:1     >>> print (next(it)) #再往下遍历输出:2     >>> for x in it: #迭代器对象可以用for语句进行遍历     >>> pass   把一个类作为一个迭代器使用需要在类中实现两个方法:__iter__()和__next__()。如:   class MyNumbers:#将类作为迭代器使用要实现以下两个方法。     def __iter__(self):#返回一个特殊的迭代器对象,这个迭代器对象实现了__next__()方法并通过Stoplteration异常标识迭代的完成。       self.a = 1       return self     def

迭代器Iterator

隐身守侯 提交于 2019-12-20 06:07:16
public class Demo1{   public static void main(String[] args){     Collection collection = new ArrayList<>();     collection.add("java");     collection.add("hello");          testIterator(collection);        }   public static void testIterator(Collection collection){   //Iterator<E> iterator() //获取集合中的对象 /* * Iterator:叫迭代器 * hasnext():判断当前位置是否有值,有返回true,没有false * next():取出当前位置的值,并将指针指向下一个位置 */   Iterator iterator = collection.Iterator();     while(iterator.hasNext()){       String value = (String)iterator.next();       System.out.println(value);     } //注意点: //1.直接再次使用第一次的iterator进行遍历,遍历失败

迭代器

ぃ、小莉子 提交于 2019-12-20 02:35:23
我们已经知道,可以直接作用于 for 循环的数据类型有以下几种: 一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等; 一类是 generator ,包括生成器和带 yield 的generator function。 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。 可以使用 isinstance() 判断一个对象是否是 Iterable 对象: >>> from collections import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('abc', Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False 而生成器不但可以作用于 for 循环,还可以被 next() 函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续返回下一个值了。 可以被 next() 函数调用并不断返回下一个值的对象称为迭代器: Iterator 。 可以使用 isinstance() 判断一个对象是否是

关于Python中的yield

老子叫甜甜 提交于 2019-12-19 19:15:54
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor)。 一、迭代器(iterator) 在Python中,for循环可以用于Python中的任何类型,包括列表、元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器 迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration。任何这类的对象在Python中都可以用for循环或其他遍历工具迭代,迭代工具内部会在每次迭代时调用next方法,并且捕捉StopIteration异常来确定何时离开。 使用迭代器一个显而易见的好处就是:每次只从对象中读取一条数据,不会造成内存的过大开销。 比如要逐行读取一个文件的内容,利用readlines()方法,我们可以这么写: 1 2 line .: line 这样虽然可以工作,但不是最好的方法。因为他实际上是把文件一次加载到内存中,然后逐行打印。当文件很大时,这个方法的内存开销就很大了。 利用file的迭代器,我们可以这样写: 1 2 line : line 这是最简单也是运行速度最快的写法,他并没显式的读取文件,而是利用迭代器每次读取下一行。 二、生成器