迭代器

07-06 迭代器

依然范特西╮ 提交于 2019-12-26 15:09:23
[TOC] 一 迭代器介绍 迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代 while True: msg = input('>>: ').strip() print(msg) 下述while循环才是一个迭代过程,不仅满足重复,而且以每次重新赋值后的index值作为下一次循环中新的索引进行取值,反复迭代,最终可以取尽列表中的值 goods=['mac','lenovo','acer','dell','sony'] index=0 while index < len(goods): print(goods[index]) index+=1 插图:恶搞图43 1.1 可迭代对象 通过索引的方式进行迭代取值,实现简单,但仅适用于序列类型:字符串,列表,元组。对于没有索引的字典、集合等非序列类型,必须找到一种不依赖索引来进行迭代取值的方式,这就用到了迭代器。 要想了解迭代器为何物,必须事先搞清楚一个很重要的概念:可迭代对象(Iterable)。从语法形式上讲,内置有__iter__方法的对象都是可迭代对象,字符串、列表、元组、字典、集合、打开的文件都是可迭代对象: {'name':'egon'}.__iter__ {7,8,9}._

python 迭代器 Iterator

送分小仙女□ 提交于 2019-12-26 02:57:07
一、可迭代对象定义 可以直接作用于 for 循环的数据类型有以下几种: 一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str、bytes、bytearray 等; 一类是 generator ,包括表达式生成器和带 yield 的函数生成器。 这些 可以直接作用于 for 循环的对象统称为 可迭代对象 : Iterable 。 二、判断一个对象是否是可迭代对象 1 >>> from collections import Iterable 2 >>> isinstance([], Iterable) 3 True 4 >>> isinstance({}, Iterable) 5 True 6 >>> isinstance(b'abc', Iterable) 7 True 8 >>> isinstance((x for x in range(10)), Iterable) 9 True 10 >>> isinstance(100, Iterable) 11 False 三、迭代器定义 生成器不但可以作用于 for 循环,还可以被 next() 函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续返回下一个值了。 可以被 next() 函数调用并不断返回下一个值的对象称为 迭代器 : Iterator 。 四

ES6+ 迭代器的实现原理

安稳与你 提交于 2019-12-25 22:15:01
迭代器的原理 const arr = [ 1 , 2 ] function makeIterator ( array ) { let nextIndex = 0 ; return { next : function ( ) { return nextIndex < array . length ? { value : array [ nextIndex ++ ] , //取值 done : false //标记是否遍历完成 } : { value : undefined , done : true } } } } let res = makeIterator ( arr ) console . log ( res . next ( ) ) ; console . log ( res . next ( ) ) ; console . log ( res . next ( ) ) ; console . log ( res . next ( ) ) ; 迭代器的使用 let arr1 = [ 1 , 2 , 3 , 4 , 5 ] let iter = arr1 [ Symbol . iterator ] ( ) console . log ( iter . next ( ) ) ; console . log ( iter . next ( ) ) ; console . log (

Java_集合面试题

亡梦爱人 提交于 2019-12-25 06:07:07
Java_集合面试题 0.链表,队列和栈的区别? 链表是一种存储结构,指得是存储时候除了要存储数据元素之外,还要用数据元素一起的另外空间存储数据元素的关系。 队列和栈都是线性表,属于逻辑结构范畴,都是访问点受到限制,并且限制在线性表端点的线性表。 栈被限定为在线性表中的同一个(唯一一个的)端点插入删除 队列被限定为在线性表的一端插入,另外一个端点删除 栈和队列也可以用链表来实现,分别称为链栈和链队列 1. ArrayList ArrayList是基于数组实现的,最大长度不会超过数组的长度2147483647(最大值是int的最大值是,2的31次方减去1 ).如果业务中可能存在超过这个长度的数据,使用LinkedArrayList 3.HashMap Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。 HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。 4.HashMap和HashTable的区别

Java并发编程笔记之CopyOnWriteArrayList源码分析

為{幸葍}努か 提交于 2019-12-25 02:00:11
并发包中并发List只有CopyOnWriteArrayList这一个,CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行修改操作和元素迭代操作都是在底层创建一个拷贝数组(快照)上进行的,也就是写时拷贝策略。 我们首先看一下CopyOnWriteArrayList的类图有哪些属性和方法,如下图所示: 如上,CopyOnWriteArrayList的类图,每个CopyOnWriteArrayList对象里面有一个array数组对象用来存放具体元素,ReentrantLock独占锁对象用来保证同时只有一个线程对array进行修改,这里只要记得ReentrantLock是独占锁,同时只有一个线程可以获取就可以了。 那么问题来了,如果让我们自己去做一个写时拷贝的线程安全的List,我们会怎么做,要考虑哪些要点?    1.list何时初始化,初始化list元素个数为多少,list是有限大小?    2.如何保证线程安全,比如多个线程进行读写时候,如果保证是线程安全的?   3.如何使用迭代器遍历list时候的数据一致性? 那么我们就进入CopyOnWriteArrayList源码去看,看看设计者是如何处理的。 CopyOnWriteArrayList源码分离如下: 1.初始化,首先看一下CopyOnWriteArrayList的无参构造函数

生成器与迭代器

筅森魡賤 提交于 2019-12-24 21:38:57
一、迭代器 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代 器只能往前不会后退。 迭代器有两个基本的方法:iter() 和 next()。 iter(iterable)从可迭代对象中返回一个迭代器,iterable必须是能提供 一个迭代器的对象 next(iterator) 从迭代器iterator中获取下一了记录,如果无法获取下 一条记录,则触发stoptrerator异常 注意: 1.迭代器只能往前取值,不会后退 2.用iter函数可以返回一个可迭代对象的迭代器 a = [ 1 , 2 , 3 , 4 , 5 ] b = iter ( a ) print ( type ( b ) ) print ( next ( b ) ) print ( next ( b ) ) print ( next ( b ) ) for i in a : print ( i ) 二 、生成器 如果一个函数中包含yield关键字,那么这个函数就不再是一个普通函数,而是 一个生成器 生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是 一个迭代器。 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运 行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

python迭代器和生成器

这一生的挚爱 提交于 2019-12-24 12:04:55
迭代器和生成器 迭代器 迭代的概念 迭代就是重复的过程,每重复一次就是一次迭代,并且每次迭代的结果作为下一次迭代的初始值。 #不是迭代,只是重复 while True: p = input('>>:') print p #迭代,每次循环基于上一次的返回值 l = [1,2,3,4] t = 0 while t < len(l): print(l[t]) t += 1 可迭代对象 为了提供一种不依赖于索引的迭代方式,python会为一些对象内置 __iter__方法。python中,字符串、列表、元组、字典、集合、文 件都是可迭代对象。 判断是否为可迭代对象可以导入Iterable模块__iter__ from collections import Iterable f = open('a.txt','w') f.__iter__() # 下列数据类型都是可迭代的对象 print(isinstance('abc',Iterable)) # 字符串 print(isinstance([1,2,3],Iterable)) # 列表 print(isinstance({'a':1,},Iterable)) # 字典 print(isinstance({1,2,3},Iterable)) # 集合 print(isinstance((1,2,),Iterable)) # 元组 print

python基础—迭代器、生成器

淺唱寂寞╮ 提交于 2019-12-23 14:43:13
python基础—迭代器、生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样。 只要该对象可以实现__iter__方法,就可以进行迭代。 迭代对象调用__iter__方法会返回一个迭代器,所谓的迭代器就是具有next方法的对象。(在调用next方法时不需要任何参数)。在调用next方法时,迭代器会返回它的下一个值。如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopITeration异常。 一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象是迭代器。 迭代器也有__iter__方法。 2 迭代器特性 优点: 1 迭代器提供了一种不依赖索引的取值方式,这样就可以遍历那些没有索引的可迭代对象了(字典,集合,文件) 2 迭代器与列表比较,迭代器是惰性计算的,更节省内存 缺点: 1 无法获取迭代器的长度,使用不如列表索引取值灵活 2 一次性的,只能往后取值,不能倒着取值 迭代规则的关键是?为什么不是使用列表? 1 如果有一个函数,可以一个接一个地计算值,那么在使用时可能是计算一个值时获取一个值,而不是像列表一样获取所有的值。如果有很多值,列表会占用太多的内存。 2 使用迭代器更通用,更简单,更优雅 3 迭代器代码 (1)索引方式循环 1 2 3 4 5 6 7 l = [ 'a' , 'b' , 'c' , 'd' ] i

Python迭代器和生成器

六眼飞鱼酱① 提交于 2019-12-23 10:26:04
在Python中,很多对象都是可以通过for语句来直接遍历的,例如list、string、dict等等,这些对象都可以被称为可迭代对象。至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了。 迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。 __iter__()和next()方法 这两个方法是迭代器最基本的方法,一个用来获得迭代器对象,一个用来获取容器中的下一个元素。 对于可迭代对象,可以使用内建函数iter()来获取它的迭代器对象: 例子中,通过iter()方法获得了list的迭代器对象,然后就可以通过next()方法来访问list中的元素了。当容器中没有可访问的元素后,next()方法将会抛出一个StopIteration异常终止迭代器。 其实,当我们使用for语句的时候,for语句就会自动的通过__iter__()方法来获得迭代器对象,并且通过next()方法来获取下一个元素。 自定义迭代器 了解了迭代器协议之后,就可以自定义迭代器了。 下面例子中实现了一个MyRange的类型,这个类型中实现了__iter__()方法

JAVA学习笔记--迭代器

和自甴很熟 提交于 2019-12-23 09:55:18
  迭代器(Iterator)是一种设计模式。 它是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构 。创建迭代器的代价小,因而迭代器通常被称为轻量级对象。 一、Iterable   接口Iterable<T>,是Collection<E>等接口的超级接口。实现这个接口允许对象成为 foreach 语句的目标。 import java.util.iterator; public interface Iterable<T>{ Iterator<T> iterator(); // 返回一个在一组T类型的元素上进行迭代的迭代器 } 二、Iterator   接口Iterator<E>,是对Collection进行迭代的迭代器。   方法:Iterator<E> iterator(); // 返回在此collection元素上进行迭代的迭代器,元素返回的顺序没有保证   JAVA的Iterator只能单向移动。使用方法iterator()要求容器返回一个在该collection上进行迭代的迭代器,Iterator将准备好返回序列中的第一个元素。 package com.tongye.iterator; import java.util.*; public class IteratorExample { public static void main