天道酬勤,学无止境

迭代器

Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)

1. Iterator迭代器 所有Collection的实现类都实现了iterator方法,该方法返回一个Iterator接口类型的对象,用于实现对集合元素迭代的便利。在java.util包下。 1)Iterator定义有三个方法: ①boolean hasNext()方法:判断指针后面是否有元素。 ②E next()方法:指针后移,并返回当前元素。E代表泛型,默认为Object类型。 ③void remove()方法:在原集合中删除刚刚返回的元素。 2)对于List集合而言,可以通过基于下标的get方法进行遍历;而iterator方法是针对Collection接口设计的,所以,所有实现了Collection接口的类,都可以使用Iterator实现迭代遍历。 3)迭代器的使用方式:先问后拿。问:boolean hasNext()该方法询问迭代器当前集合是否还有元素;拿:E next()该方法会获取当前元素。迭代器的迭代方法是while循环量身定制的。 4)迭代器中的删除问题:在迭代器迭代的过程中,我们不能通过“集合”的增删等操作,来改变该集合的元素数量!否则会引发迭代异常!若想删除迭代出来的元素,只能通过Iterator。迭代器在使用自己的remove()方法时,可以将刚刚获取的元素从集合中删除,但是不能重复调用两次!即在不迭代的情况下,不能在一个位置删两次。 案例9: 2

2021-06-01 21:30:01    分类:博客    iterator   迭代器   比较器   基础学习

理解迭代器,生成器,yield,可迭代对象

在了解Python的数据结构时,容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让初学者一头雾水,我将用一篇文章试图将这些概念以及它们之间的关系捋清楚。容器(container)容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)在Python中,常见的容器对象有:list, deque, ....set, frozensets, ....dict, defaultdict, OrderedDict, Counter, ....tuple, namedtuple, …str容器比较容易理解,因为你就可以把它看作是一个盒子、一栋房子、一个柜子,里面可以塞任何东西。从技术角度来说,当它可以用来询问某个元素是否包含在其中时,那么这个对象就可以认为是一个容器,比如 list,set,tuples都是容器对象:>>> assert 1 in [1, 2, 3] # lists >>> assert 4 not in [1, 2, 3]

2021-05-19 03:03:13    分类:博客    可迭代对象   生成器   迭代器

python进阶(10)迭代器

迭代器迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 可迭代对象我们已经知道可以对list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。 但是,是否所有的数据类型都可以放到for...in...的语句中,然后让for...in...每次从中取出一条数据供我们使用,即供我们迭代吗?for i in 100: print(i) >>> TypeError: 'int' object is not iterable以上我们可以看出,int整型不是iterable,即int整型是不可以迭代的 接下来,我们自定义一个容器MyList用来存放数据,可以通过add方法向其中添加数据>>> class Mylist(object): def __init__(self): self.container = list() def add(self, item): self.container.append(item) >>> mylist = Mylist() >>> mylist.add(1) >>> mylist.add(2) >>> mylist.add(3) >>> for num in

2021-05-18 18:25:11    分类:博客    python   迭代器

【博客大赛】论python中器的组合

python中有几种特殊的对象,如可迭代对象、生成器、迭代器、装饰器等等,特别是生成器这些可以说是python中的门面担当,应用好这些特性的话,可以给我们的项目带来本质上的提升,装逼不说,这构筑的是代码护城河,祖传代码别人再也不敢动。熟悉特性的概念在和面试官交流的过程中也是挺吃香的不是吗?现在这么卷了,面试官也很少会问到迭代啊、递归啊什么的,反过来说,在社招面试被问到了这种看起来挺浅薄的问题,可能就是挂的节奏了:)嘿嘿,真的,毕竟面试是要有相对应的面试时间的,总要有水题来刷时间啊┑( ̄Д  ̄)┍ 三者关系 可迭代对象、迭代器和生成器这三个概念很容易混淆,前两者通常不会区分的很明显,只是用法上有区别。生成器在某种概念下可以看做是特殊的迭代器,它比迭代实现上更加简洁。三者关系如图: 可迭代对象 可迭代对象Iterable Object,简单的来理解就是可以使用for或者while来循环遍历的对象。比如常见的 list、set、dict等,可以用以下方法来测试对象是否是可迭代 >>> from collections import Iterable >>> isinstance('yerik', Iterable) # str是否可迭代 True >>> isinstance([5, 2, 0], Iterable) # list是否可迭代 True >>> isinstance(520

2021-05-18 12:23:34    分类:博客    可迭代对象   迭代器   生成器   开发笔记

python迭代器高级例子

def next(self):方法来实现协议 2. 写一个实现迭代器协议的类,让此类可以生成从b 开始的n个素数 class Prime: def init(self, b, n): … def iter(self): ….L = [x for x in Prime(10, 4)] print(L) # L = [11, 13, 17, 19]class Prime: def init(self,b,n): self.start=b self.count=n def iter(self): l=[] x=self.start-1 while len(l)!=self.count: if len(l)==self.count: break else: x+=1 for j in range(2,x): if x%j==0: break else: l.append(x) return Xy(l) class Xy: def init(self,l): self.l=l self.index=0 def next(self): if self.index>=len(self.l): raise StopIteration s=self.l[self.index] self.index+=1 return s L = [x for x in Prime(10, 4)]print(L) #

2021-05-13 21:22:47    分类:博客    python   迭代器

实现迭代器(__next__和__iter__)

目录一、简单示例二、StopIteration异常版三、模拟range四、斐波那契数列一、简单示例死循环class Foo: def __init__(self, x): self.x = x def __iter__(self): return self def __next__(self): self.x += 1 return self.x f = Foo(3) for i in f: print(i)二、StopIteration异常版加上StopIteration异常class Foo: def __init__(self, start, stop): self.num = start self.stop = stop def __iter__(self): return self def __next__(self): if self.num >= self.stop: raise StopIteration n = self.num self.num += 1 return n f = Foo(1, 5)from collections import Iterable, Iterator print(isinstance(f, Iterator))Truefor i in Foo(1, 5): print(i)1 2 3 4三、模拟rangeclass Range

2021-04-19 19:56:03    分类:博客    迭代器

迭代器

目录一、可迭代对象1.1 总结二、迭代器对象2.1 总结三、for循环原理迭代器:迭代的工具。迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的。如计算机中的迭代开发,就是基于软件的上一个版本更新。以下代码就不是迭代,它只是单纯的重复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

2021-04-19 19:44:17    分类:博客    迭代器

Python入门篇(八)之迭代器和生成器

迭代器和生成器 1、列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)): >>> list(range(1, 11)) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环: >>> L = []` >>> for x in range(1, 11): ... L.append(x * x) ... >>> L [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list: >>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。 for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方: >>> [x * x for x in range(1, 11) if

2021-03-27 08:26:05    分类:博客    python   生成器   迭代器   python

python生成器与迭代器

列表生成式:例一:a = [i+1 for i in range(10)] print(a) 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]例二:L = [1, 2, 3, 4, 5] print([i*i for i in L if i>3]) 输出: [16, 25]例三:L = [1, 2, 3, 4, 5] I = [6, 7, 8, 9, 10] print([i*a for i in L for a in I if i > 2 if a < 8]) 输出: [18, 21, 24, 28, 30, 35]生成器:通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:示例:L = [1, 2, 3, 4, 5] I = [6, 7, 8, 9, 10] g = (i*a for i

2021-03-26 23:12:40    分类:博客    python   生成器   迭代器   python

对JAVA集合进行遍历删除时务必要用迭代器

今天同事写了几行类似这样的代码:public static void main(String args[]) { List<String> famous = new ArrayList<String>(); famous.add("liudehua"); famous.add("madehua"); famous.add("liushishi"); famous.add("tangwei"); for (String s : famous) { if (s.equals("madehua")) { famous.remove(s); } } }运行出异常:Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)at java.util.AbstractList$Itr.next(AbstractList.java:343)at com.bes.Test.main(Test.java:15)Java新手最容易犯的错误,对JAVA集合进行遍历删除时务必要用迭代器。切记。其实对于如上for循环,运行过程中还是转换成了如下代码:for(Iterator

2021-03-26 19:43:38    分类:博客    java   迭代器   java