迭代器

Python入门:迭代器

十年热恋 提交于 2019-11-28 02:59:54
迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 1.一类是集合数据类型,如:list 、tuple(元组)、dict(字典)、set、str等 2.一类是generator,包括生成器和带yield的generator function. 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable   可以使用isinstance()判断一个对象是否是Iterable对象; >>>from collections import Iterable >>>isinstance([],Iterable) True 而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator. 可以使用Isinstance()判断一个对象是否是Iterator对象 >>>from collections import Iterator >>>isinstance((x for x in range(10)),Iterator) True 生成器都是Iterator对象,但list 、dict、str虽然是Iterable,却不是Iterator 把list 、dict

python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

∥☆過路亽.° 提交于 2019-11-28 02:59:42
生成器 在Python中,一边循环一边计算的机制,称为生成器:generator。 如: 1 >>> g = (x * x for xin range(10)) 2 >>> g3 <generator object <genexpr> at 0x1022ef630> 此处g就是一个生成器. 迭代器 我们已经知道,可以直接作用于 for 循环的数据类型有以下几种: 一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等; 一类是 generator ,包括生成器和带 yield 的generator function。 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。 可以使用 isinstance() 判断一个对象是否是 Iterable 对象: 1 >>> from collections import Iterable 2 >>> isinstance([], Iterable) 3 True 4 >>> isinstance({}, Iterable) 5 True 6 >>> isinstance('abc', Iterable) 7 True 8 >>> isinstance((x for x in range(10)), Iterable) 9 True 10 >>> isinstance(100,

[Python] 迭代器是什么?你每天在用的for循环都依赖它!

若如初见. 提交于 2019-11-27 22:32:33
从循环说起 顺序 , 分支 , 循环 是编程语言的三大逻辑结构,在Python中都得到了支持,而Python更是为循环结构提供了非常便利的语法: for ... in ... 刚从C语言转入Python的同学可能倾向于写索引下标式的循环,例如下面的代码像遍历C中的数组一样遍历了一个Python中的列表: >>> colors = ['black', 'white', 'red', 'blue'] >>> for i in range(len(colors)): ... print(colors[i]) ... black white red blue 但如果将列表(list)替换为集合(set),这个方法就不奏效了: >>> colors = set(['black', 'white', 'red', 'blue']) >>> for i in range(len(colors)): ... print(colors[i]) ... Traceback (most recent call last): File "<stdin>", line 2, in <module> TypeError: 'set' object does not support indexing 这是因为set不像list,string,tuple这些结构,其中的元素从逻辑上讲本身是没有序的

Python中的迭代器

删除回忆录丶 提交于 2019-11-27 21:28:53
迭代器 迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件 特点: 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容 不能随机访问集合中的某个值 ,只能从头到尾依次访问 访问到一半时不能往回退 便于循环比较大的数据集合,节省内存 生成一个迭代器: >>> a = iter([1,2,3,4,5]) >>> a <list_iterator object at 0x101402630> >>> a.__next__() 1 >>> a.__next__() 2 >>> a.__next__() 3 >>> a.__next__() 4 >>> a.__next__() 5 >>> a.__next__() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration 来源: https://www.cnblogs

python可迭代对象与迭代器

陌路散爱 提交于 2019-11-27 21:12:46
单词 global nonlocal dir iter next iter try except global ,nonlocal # global # 1, 在局部作用域声明一个全局变量 声明后就可以修改全局变量 # nonlocal 存在于双层嵌套中 # 1. 不能够操作全局变量。 # 2. 局部作用域:内层函数对外层函数的局部变量进行修改。 函数名的应用 # 函数名是一个特殊的变量。 # 函数名指向的是函数的内存地址,加上()就执行这个函数。 # 3. 函数名可以作为容器类类型的元素。 # 4. 函数名可以作为函数的实参。 # 5. 函数名可以作为函数的返回值。 默认参数的坑 # 陷阱只针对于默认参数是可变的数据类型: # 如果你的默认参数指向的是可变的数据类型,那么你无论调用多少次这个默认参数,都是同一个。 # 本质是闭包 # def func(name,alist=[]): # alist.append(name) # return alist # ret1 = func('alex') # print(ret1,id(ret1)) # ['alex'] # ret2 = func('太白金星') # print(ret2,id(ret2)) # ['太白金星'] # 局部作用域的坑 # 在函数中,如果你定义了一个变量,但是在定义这个变量之前对其引用了,那么解释器认为

java迭代器 常用

岁酱吖の 提交于 2019-11-27 20:20:45
19 //使用迭代器遍历ArrayList集合 20 Iterator<String> listIt = list.iterator(); 21 while(listIt.hasNext()){ 22 System.out.println(listIt.next()); 23 } 24 //使用迭代器遍历Set集合 25 Iterator<String> setIt = set.iterator(); 26 while(setIt.hasNext()){ 27 System.out.println(listIt.next()); 28 } 29 //使用迭代器遍历LinkedList集合 30 Iterator<String> linkIt = linkList.iterator(); 31 while(linkIt.hasNext()){ 32 System.out.println(listIt.next()); 33 } 因为在你迭代之前,迭代器已经被通过list.itertor()创建出来了,如果在迭代的过程中,又对list进行了改变其容器大小的操作,那么Java就会给出异常。因为此时Iterator对象已经无法主动同步list做出的改变,Java会认为你做出这样的操作是线程不安全的,就会给出善意的提醒(抛出ConcurrentModificationException异常

函数进阶-迭代器

孤人 提交于 2019-11-27 19:45:43
迭代器 迭代: 迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的。如计算机中的迭代开发,就是基于软件的上一个版本更新。以下代码就不是迭代,它只是单纯的重复 迭代器:迭代的工具。 其他解释--> 迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 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 =

L2-005. 集合相似度 STL set用法

不羁的心 提交于 2019-11-27 18:57:39
题解:又学到了c++,STL的用法了,在实验室用了两个多小时学习set,stl真的很强大,从用过的map等等体会到了,又get到了set。尽管自己很菜,还是分享一下咯,马上要参加天梯赛了,还是多想学一些东西,感谢网上博主写的博客,受益匪浅。 set概述 和vector、list不同,set、map都是关联式容器。set内部是基于红黑树实现的。插入和删除操作效率较高,因为只需要修改相关指针而不用进行数据的移动。 在进行数据删除操作后,迭代器会不会失效呢?删除set的数据时,实际的操作是删除红黑树中的一个节点,然后相关指针做相关调整。指向其他元素的迭代器还是指向原位置,并没有改变,所以删除一个节点后其他迭代器不会失效。list和map也是同样的道理。然而删除vector中的某个元素,vector中其他迭代器会失效,因为vector是基于数组的,删除一个元素后,后面的元素会往前移动,所以指向后面元素的迭代器会失效。 再稍微说一下迭代器的实现。迭代器是一个对象,vector的迭代器是封装了数组下标;list、map、set的迭代器是封装了元素节点的指针。 还有一点,从数学层面,set的一个集合,好比一个袋子里面装了好多个小球。但是红黑树是一种特殊的二叉搜索树,set中的元素根据其值的大小在红黑树中有特定的位置,是不可移动的。所以,1是search操作效率会很高O(log n)

STL容器Set的使用

放肆的年华 提交于 2019-11-27 18:57:14
首先了解一下set,我们所知道的set是STL中的一个容器,但是set实质上也是有不同的版本,我们最根本的划分就是根据其底层实现分别是红黑树和hash表分为两种,首先这两种结构最本质的区别就是有序和无序,红黑树的存储是有序的而hash表是无序存储,但它并不影响set的最主要的用法就是查找,而从查找角度来说hash表是更优于红黑树,从时间复杂度进行分析,红黑树的时间复杂度为O(logN),而hash表的时间复杂度为O(1)。所以说hash表构建的set更高效。所以在对时间要求比较严格的情况下,可以优先采用hash表构建的set,即unordered_set。 首先学习set的所有接口和使用方法,接口分为默认的成员函数,迭代器,大小和容量,增删查改和一些其他函数。 默认的成员函数 即构造,析构,拷贝构造,赋值运算符等函数,使用方法没有特殊的要求。 迭代器 正向迭代器的使用还是常规意义上的使用方法,但是方向迭代器存在一些问题,按照我们规定反向迭代器从最后一个元素开始,结束应该是第一个元素的前一个,但是 从图上可以看出在调用了反向迭代器之后并没有从最后一个元素开始,而是从正向迭代器的end()的位置开始的,打开头文件可以发现反向迭代器直接调用了正向迭代器,所以在使用时注意。这可能是编译器的差异,但是正确来说反向迭代器应该从最后一个元素开始。 大小和容量 有三个函数,分别是empty()

STL set 用法

柔情痞子 提交于 2019-11-27 18:55:52
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器。set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。1) 不能直接改变元素值,因为那样会打乱原... c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器。set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。 1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素 2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数 3) 元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同) set模板原型://Key为元素(键值)类型 1 template < class Key, class Compare=less<Key>, class Alloc=STL_DEFAULT_ALLOCATOR(Key) > 从原型可以看出,可以看出比较函数对象及内存分配器采用的是默认参数,因此如果未指定,它们将采用系统默认方式。 set的各成员函数列表如下: c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器 c++ stl容器set成员函数