迭代器

迭代器,生成器,枚举

删除回忆录丶 提交于 2019-12-27 03:13:30
一、迭代器 1、通过迭代器取值的优缺点 优点:不依赖索引取值,完成取值 缺点:不能计算长度,不能指定位取值(只能从前往后逐一取值) 2、可迭代对象 可迭代对象是有—iter—()方法的对象,调用该方法返回迭代器对象 可迭代对象有:str | list | tuple | dict | set | range()| file | 迭代器对象 | enumrate()| 生成器 3、迭代器对象: 迭代器对象:有—next—()方法的对象,也就是用该方法一次从迭代器对象中获取一个值,取出一个少一个 迭代器对象有:file | enumerate()| 生成器 重点: 1、从迭代器对象中取元素,取一个少一个,如果啊哟从头开始取,需要重新获得拥有所有元素的迭代器对象 2、迭代器对象也有—iter—()方法,调用后得到的是自己本身(当前含义几个元素,得到的就只有几个元素的迭代器对象) 4、for循环迭代优点 自动获取被迭代对象的迭代器对象 在内部一次一次调用—next—()方法取值 自动完成异常处理 二、生成器 1、生成器:包含yied关键字的函数就是生成器 def my_generator(): yield 1 yield 2 yield 3 g_obj = my_generator() my_generator()并不会执行函数体,得到的返回值就是生成器对象 生成器对象就是迭代器对象 r1

迭代器

半世苍凉 提交于 2019-12-27 03:13:01
迭代器的概念:从装多个值的容器中一次取出一个值给外界 器:包含了多个值得容器 迭代:循环反馈(一次从容器中取出一个值) 通过迭代器取值的优缺点: 优点:不依赖索引取值 缺点:不能计算长度,不能指定取值(只能从前往后逐一取值) 遍历:被遍历的对象必须是有序容器 案例; ls='asasd' for i in ls: print(i) ls1=[1,2,12] for i in ls1: print(i) ls = [1, 2, 3, 4, 5, 6] i=0 while i <len(ls): print(i) i+=1 st = {1, 2, 3, 4, 5} while i <len(st): print(i) i+=1 dic = {'a': 1, 'b': 2, 'c': 3} for k,v in dic.items(): print(k,v) 可迭代对象 对象:python中的一个对象(装有地址的变量) 可迭代对象:该对象有__iter__()方法,调用该方法返回迭代器对像 可迭代对象有哪些: str | list | tuple | dict | set | range() | file(文件) | 迭代器对象 | enumerate()(枚举对象) 案例 for v in 'asdfghjkl'.__iter__(): print(v) for v in [1,23,

day_14带参装饰器、可迭代对象、迭代器对象、FOR 迭代器工作原理、枚举对象、生成器及生成表达式

元气小坏坏 提交于 2019-12-27 03:12:23
复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 装饰器:装饰器名就是外层函数 @outer @outer # fn = outer(fn) def fn(): pass 今日内容 1.带参装饰器 | 2.wrapper | 3. 可迭代对象 | 4.迭代器对象 | 5.for 迭代器工作原理 | 6.枚举对象 | 7.生成器 1. 带参装饰器 : 通常,装饰器为被装饰的函数添加新功能,需要外界的参数:可以在 outer外再套一层函数,通过形参给内部传参 。 -- outer参数固定一个,就是func -- inner参数固定同被装饰的函数,也不能添加新参数 -- 可以借助函数的嵌套定义,外层给内层传参, 2. 系统 functools 的wraps带参装饰器:i nner本来是装饰原函数func的,但func还有部分功能inner没有,那就给inner加一个装饰器,把这此功能装到inner函数上,将原函数的部分功能装饰给inner,从面达到对原函数func更好的装饰。(通过改变inner的假指向,本质外界使用的还是inner,但是打印显示的是wraps中原函数的id) 3. 迭代器 : 优点: --

深入剖析java迭代器以及C#迭代器!

倖福魔咒の 提交于 2019-12-27 03:11:29
目录: 知道迭代器接口Iterable 为什么java的for增强可以自动迭代 那些类可以被迭代 通过什么方法迭代 1. 知道迭代器接口 Iterable 解析: 迭代器( iterator )是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规 指针 的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。 2. 为什么 java 的 for 增强可以自动迭代 解析:for增强只能迭代实现了Iterable接口的类,并且自动调用该类中的iterator()方法; 3. 那些类可以被迭代 ? 解析:只要该类实现了Iterator接口或者继承的父类实现了Iterator接口,就可以被迭代. 4. 通过什么方法迭代 解析:因为Iterable接口中只有一个方法:iterator(),这个方法的返回值就是Iterator<T>;而Iterator接口中又定义了三个方法,分别是:hasNext,next,remove 这三个方法分别代表为 hasNext();方法 public boolean hasNext() { return cursor != size(); } 对比帧数,当调用hasNext方法的时候,跟元素个数size()进行对比,如不等于size()的时候,return true; 2.

深入探索迭代器(续)

a 夏天 提交于 2019-12-27 03:11:17
【 3. 反向迭代器】 反向迭代器是一种反向遍历容器的迭代器。其将自增(和自减)的含义反过来了: 对于反向迭代器,++ 运算将访问前一个元素,而 -- 运算则访问下一个元素。 所有容器还定义了 rbegin 和 rend 成员,分别返回指向容器尾元素和首元素前一位置的反向迭代器。 与普通迭代器一样,反向迭代器也有常量(const)和非常量(nonconst)类型。 图 11.1 使用一个假设名为 vec 的 vector 类型对象阐明了这四种迭代器之间的关系。 假设有一个 vector 容器对象,存储 0-9 这 10 个以升序排列的数字: vector<int> vec; for (vector<int>::size_type i = 0; i != 10; ++i) vec.push_back(i); // elements are 0,1,2,...9 下面的 for 循环将以逆序输出这些元素: // reverse iterator of vector from back to front vector<int>::reverse_iterator r_iter; for (r_iter = vec.rbegin(); // binds r_iter to last element r_iter != vec.rend(); // rend refers 1 before

C++——迭代器

▼魔方 西西 提交于 2019-12-27 03:11:06
除了每个容器定义的迭代器外,iterator库内还定义了其他的迭代器。 1.插入迭代器:向容器中插入元素 1.1 back_inserter 1.2 front_inserter 1.3 inserter *it =val; //上下等价 it=c.insert(it, val);//val插入it之前,并指向它 ++it;//指向原来的元素 list<int> lst={1,2,3,4}; list<int> lst2,lst3; copy(list.cbegin(),last.cend(),front_inserter(lst2));//lst2=4,3,2,1 copy(list.cbegin(),last.cend(),inserter(lst3));//lst3=1,2,3,4 2.流迭代器:绑定到输入输出流,用于遍历 stream_iterator<int> in_iter(cin),eof; vector<int> vec(in_iter,eof); 3.反向迭代器:向后移动(forward_list没有,流迭代器也没有) sort(vec.begin(),vec.end());//正常顺序排列 sort(vec.end(),vec.begin());//逆序排列 4.移动迭代器 来源: https://www.cnblogs.com/yrm1160029237/p

C++基础之迭代器

给你一囗甜甜゛ 提交于 2019-12-27 03:10:54
迭代器的分类 插入迭代器(insert iterator):绑定一个容器上后可以向容器中插入元素; 流迭代器(stream iterator):绑定在输入输出流中,可以遍历关联的流; 反向迭代器(reverse iterator):迭代器向后移动,标准库容器中除了forward_list外都有反向迭代器; 移动迭代器(move iterator):使用该迭代器移动其中元素; 插入迭代器(insert iterator) back_inserter:创建一个使用push_back的迭代器; front_inserter:创建一个使用push_front的迭代器; inserter:创建一个使用insert的迭代器; 注意:只有容器支持push_front的情况下,才能使用front_inserter;只有容器支持push_back的情况下,才能使用back_inserter; 若it是inserter生成的插入迭代器,则*it = val;等价于it = c.insert(it,val);++it; 顾名思义back_inserter始终将元素插入到末尾,front_inserter始终将元素插入到头部。 list<int> lst1 = {1,2,3,4}; list<int> lst2,lst3; //复制lst1到lst2,每次将lst1中的元素复制插入到lst2的前面

C++ Primer 笔记——迭代器

痴心易碎 提交于 2019-12-27 03:10:32
iostream迭代器 1.虽然iostream类不是容器,但是标准库定义了可以用于IO的迭代器。创建一个流迭代器的时候必须指定要读写的类型。我们可以对任何具有输入运算符(>>)的类型定义ostream_iterator。 std::istream_iterator<int> iter_eof; // 尾后迭代器 std::istream_iterator<int> iter_in(std::cin); // 从cin读取int std::vector<int> vec; while (iter_in != iter_eof) // 当有数据可以读取时 vec.push_back(*iter_in++); 2.当我们将一个istream_iterator绑定到一个流时,标准库并不保证迭代器立即从流读取数据,标准库保证的是在我们第一次解引用迭代器之前,从流中读取数据的操作已经完成。 3.我们可以对任何具有输出运算符(<<)的类型定义ostream_iterator。必须将ostream_iterator绑定到一个指定的流,不允许空的或表示尾后位置的ostream_iterator。 std::ostream_iterator<int> iter_out(std::cout," "); // 每个数据输出后都输出一个空格 std::vector<int> vec = {1, 3, 5}

手写一个python迭代器过程详解 - python

梦想与她 提交于 2019-12-27 00:37:37
文章来源: 敏而好学论坛 嗨学网www.piaodoo.com 欢迎大家相互学习 分析 我们都知道一个可迭代对象可以通过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("王五

Python标准模块--Iterators和Generators

可紊 提交于 2019-12-26 18:59:21
1 模块简介 当你开始使用Python编程时,你或许已经使用了iterators(迭代器)和generators(生成器),你当时可能并没有意识到。在本篇博文中,我们将会学习迭代器和生成器是什么。当然,我们也会了解如何创建它们,在我们需要的时候,就可以创建属于我们自己的迭代器和生成器。 2 模块使用 2.1 迭代器 迭代器是一个允许你在一个容器上进行迭代的对象。Python的迭代器主要通过两个方法实现:__iter__和__next__。__iter__要求你的容器支持迭代。它会返回迭代器对象本身。如果你想创建一个迭代器对象,你还需要定义__next__方法,它将会返回容器的下一个元素。 注意: 在Python 2中,命名习惯有所不同,__iter__保持不变,__next__ 改为next。 为了对这些概念更加清晰,让我们回顾下面的两个定义: 可迭代对象(iterable),只定义了__iter__方法; 迭代器(iterator),定义了__iter__和__next__两个方法,__iter__返回迭代器本身,__next__方法返回下一个元素; 所有函数名中有双下划线的方法,都很神奇,你不需要直接调用__iter__或者__next__。你可以使用for循环或者转换为列表,Python就会自动替你调用这些方法。当然你或许还是想调用它们