“人造太阳”计划

迭代器

半世苍凉 提交于 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. 迭代器 : 优点: --

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("王五

PAT 1080. Graduate Admission (30)

倾然丶 夕夏残阳落幕 提交于 2019-12-26 23:09:28
It is said that in 2013, there were about 100 graduate schools ready to proceed over 40,000 applications in Zhejiang Province. It would help a lot if you could write a program to automate the admission procedure. Each applicant will have to provide two grades: the national entrance exam grade G E , and the interview grade G I . The final grade of an applicant is (G E + G I ) / 2. The admission rules are: The applicants are ranked according to their final grades, and will be admitted one by one from the top of the rank list. If there is a tied final grade, the applicants will be ranked

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就会自动替你调用这些方法。当然你或许还是想调用它们

typename的含义

家住魔仙堡 提交于 2019-12-24 21:40:01
下面的 template declarations(模板声明)中 class 和 typename 有什么不同? template<class T> class Widget; // uses "class" template<typename T> class Widget; // uses "typename"   答案:没什么不同。在声明一个 template type parameter(模板类型参数)的时候,class 和 typename 意味着完全相同的东西。一些程序员更喜欢在所有的时间都用 class,因为它更容易输入。其他人(包括我本人)更喜欢 typename,因为它暗示着这个参数不必要是一个 class type(类类型)。少数开发者在任何类型都被允许的时候使用 typename,而把 class 保留给仅接受 user-defined types(用户定义类型)的场合。但是从 C++ 的观点看,class 和 typename 在声明一个 template parameter(模板参数)时意味着完全相同的东西。   然而,C++ 并不总是把 class 和 typename 视为等同的东西。有时你必须使用 typename。为了理解这一点,我们不得不讨论你会在一个 template(模板)中涉及到的两种名字。   假设我们有一个函数的模板,它能取得一个

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__()方法