迭代计算

python--迭代器和生成器详解

痞子三分冷 提交于 2020-03-06 14:13:22
迭代器和生成器 在Python这门语言中,生成器毫无疑问是最有用的特性之一。生成器同时也满足iterator与iterable。 迭代器 这里有两个概念:Iterable(可迭代)与Iterator。 实现了__next__方法,就叫做Iterator,注意__next__要有退出条件。 实现了__iter__方法就是Iterable,且这个方法返回的是一个Iterator。 所以一个类中我可以不用全部实现__iter__和__next__,只用实现一个,于是我试了一下像这样: class Iterable(object): def __init__(self,MaxIter): self.MaxIter = MaxIter self.Iterator = Iterator(self.MaxIter) def __iter__(self): return self.Iterator class Iterator(object): def __init__(self,MaxIter): self.a, self.b = 0,1 self.iterNum = 0 self.MaxIter = MaxIter def __next__(self): self.iterNum += 1 self.a, self.b = self.b, self.a + self.b if self

Python面试题之生成器/迭代器

孤街醉人 提交于 2020-03-06 02:54:57
1.为什么要有生成器? 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以。。。 在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。 第一种方法很简单,只要把一个列表生成式的 [] 改成 () ,就创建了一个generator,其实就是一个tuple。 L = [x * x for x in range(10)] print(L) print(type(L)) L2 = (x * x for x in range(10)) print(L2) print(type(L2)) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # <class 'list'> # <generator object <genexpr> at 0x00FE4FC0> # <class 'generator'> 创建 L 和L2的区别仅在于最外层的 [] 和 () , L 是一个list,而L2是一个generator。

Python高级特性

你离开我真会死。 提交于 2020-03-06 02:53:51
减少代码,提高效率 1.切片 取一个序列的部分元素 L [ start : end : step ] 含头不含尾 1 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 4 L = [ 1, 3, 6, 9, 45, 66] 5 6 print ( L[:4] ) #等同于L[0:4] 切片下标为 0 ~ 3 7 print ( L[-2:] ) #倒数切片 从倒数第2开始往后切 倒数第二、倒数第一 8 print ( L[:5:2] ) #前5个数,每2个取一个 9 print ( L[::5] ) #所有数,每5个取一个 L[ : : -1] 倒切 2.迭代 在Python中,迭代是通过 for...in 来完成的,而很多语言迭代 list 是通过下标完成的。 无论有无下标都可以迭代,如dict dict不是按顺序排列存储,迭代出的结果顺序很可能不一样 dict默认迭代 key 如要要迭代 value: 同时迭代 key 和 value : 判断是否可以迭代 3.迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。 凡是可作用于for循环的对象都是Iterable类型,即迭代对象 凡是可作用于next()函数的对象都是Iterator类型,即迭代器,表示一个惰性计算的序列(只有在需要返回下一个数据时它才会计算)

python 内置函数 和 匿名函数

我们两清 提交于 2020-03-04 04:01:57
作用域相关 locals :函数会以字典的类型返回当前位置的全部局部变量。 globals:函数以字典的类型返回全部全局变量。 a = 1 b = 2 print(locals()) print(globals()) # 这两个一样,因为是在全局执行的。 ########################## def func(argv): c = 2 print(locals()) print(globals()) func(3) eval:执行字符串类型的代码,并返回最终结果。会执行其中的内容 exec:执行字符串类型的代码。会执行其中的内容 循环 compile:将字符串类型的代码编译。代码对象能够通过exec语句来执行或者eval()进行求值。 >>> #流程语句使用exec >>> code1 = 'for i in range(0,10): print (i)' >>> compile1 = compile(code1,'','exec') >>> exec (compile1) >>> #简单求值表达式用eval >>> code2 = '1 + 2 + 3 + 4' >>> compile2 = compile(code2,'','eval') >>> eval(compile2) >>> #交互语句用single >>> code3 = 'name = input(

迭代器,生成器,装饰器

断了今生、忘了曾经 提交于 2020-03-03 02:02:25
1.1迭代器 1.2生成器 1.3装饰器 迭代器 1. 迭代器定义 迭代是Python最强大的功能之一,是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法:iter() 和 next()。 字符串,列表或元组对象都可用于创建迭代器: 2.可迭代对象 : 在Python世界里,一切皆对象。对象根据定义的维度,又可以分为各种不同的类型,比如:文件对象,字符串对象,列表对象。。。等等。 一句话:“实现了__iter__方法的对象就叫做可迭代对象”,__iter__方法的作用就是返回一个迭代器对象。 直观理解就是能用for循环进行迭代的对象就是可迭代对象。比如:字符串,列表,元祖,字典,集合等等,都是可迭代对象。 3.next()与iter(): next()返回迭代器的下一个项目 next语法: next(iterator[,dafault]) iterator – 可迭代对象 default – 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。 4.iter()函数用来生成迭代器 # 迭代器实现斐波那契数列 class Fib ( ) : def __init__ ( self , n )

python之内置函数,匿名函数

偶尔善良 提交于 2020-03-02 07:11:40
内置函数 我们一起来看看python里的内置函数。什么是内置函数?就是Python给你提供的,拿来直接用的函数,比如print,input等。截止到Python版本3.6.2,现在Python一共为我们提供了68个内置函数,有些函数我们已经用过了,有些我们还没用到,还有一些被封印了,必须等我们学了新知识才能解开封印。那么现在我们就来学习一些Python的内置函数。 内置函数 abs() dict() help() min() setattr() all() dir() hex() next() slice() any() divmod() id() object() sorted() ascii() enumerate() input() oct() staticmethod() bin() eval() int() open() str() bool() exec() isinstance() ord() sum() bytearray() filter() issubclass() pow() super() bytes() float() iter() print() tuple() callable() format() len() property() type() chr() frozenset() list() range() vars() classmethod()

HanLP 关键词提取算法分析详解

六眼飞鱼酱① 提交于 2020-03-01 01:23:03
HanLP 关键词提取算法分析 详解 l 参考论文:《 TextRank: Bringing Order into Texts》 l TextRank算法提取关键词的Java实现 l TextRank算法自动摘要的Java实现这篇文章中作者大概解释了一下TextRank公式 1. 论文 In this paper, we introduce the TextRank graphbased ranking model for graphs extracted from natural language texts TextRank是一个非监督学习算法,它将文本中构造成一个图,将文本中感兴趣的东西(比如分词)当成一个个顶点,然后应用TextRank算法来抽取文本中的一些信息。 Such keywords may constitute useful entries for building an automatic index for a document collection, can be used to classify a text, or may serve as a concise summary for a given document. 提取出来的关键词,可用来作为文本分类,或者概括文本的中心思想。 TextRank通过不断地迭代来提取关键词,每一轮迭代

HanLP 关键词提取算法分析

久未见 提交于 2020-03-01 01:22:27
HanLP 关键词提取算法分析 参考论文:《TextRank: Bringing Order into Texts》 TextRank算法提取关键词的Java实现 TextRank算法自动摘要的Java实现 这篇文章中作者大概解释了一下TextRank公式 1. 论文 In this paper, we introduce the TextRank graphbased ranking model for graphs extracted from natural language texts TextRank是一个非监督学习算法,它将文本中构造成一个图,将文本中感兴趣的东西(比如分词)当成一个个顶点,然后应用TextRank算法来抽取文本中的一些信息。 Such keywords may constitute useful entries for building an automatic index for a document collection, can be used to classify a text, or may serve as a concise summary for a given document. 提取出来的关键词,可用来作为文本分类,或者概括文本的中心思想。 TextRank通过不断地迭代来提取关键词,每一轮迭代,算法给图中的顶点打分

Python开发【第五篇】:Python基础之迭代器、生成器

橙三吉。 提交于 2020-02-29 22:48:40
迭代器 一、迭代的概念 迭代器即迭代的工具,那什么是迭代呢? 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 优点: 提供一种统一的、不依赖于索引的迭代方式 惰性计算,节省内存 缺点: 无法获取长度(只有在next完毕才知道到底有几个值) 一次性的,只能往后走,不能往前退 1、为何要有迭代器? 对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 2、什么是可迭代对象? 可迭代对象指的是内置有 iter 方法的对象,即obj. iter ,如下 'hello'.__iter__ (1,2,3).__iter__ [1,2,3].__iter__ {'a':1}.__iter__ {'a','b'}.__iter__ open('a.txt').__iter__ 3、什么是迭代器对象? 可迭代对象执行obj. iter ()得到的结果就是迭代器对象 而迭代器对象指的是即内置有 iter 又内置有 next 方法的对象 文件类型是迭代器对象 open('a.txt').__iter__() open('a.txt').__next__() 二、迭代器对象的使用 dic={'a':1,'b':2,'c':3}

C++字符串、向量和数组知识概要总结

China☆狼群 提交于 2020-02-28 22:26:07
字符串 记一下string的几种没用过的初始化操作,赋值不能这么搞 string s1("value"); string s2(s1); string s3(6,'z'); string s4=string(6,'a'); 上面没咋提拷贝初始化,带等号的都是拷贝初始化,这里都是直接初始化 getline(cin, line); 可接受句子,遇到换行符则停止, 并且换行符也会被读入,但是这个换行符又被丢弃了 while(getline(cin, line)){ cout << line << endl; } while(cin>>line){ cout << line << endl; } 从上述两个例子里可以看出getline确实读入了换行符而且确实又把它给丢弃了。 注意注意注意!! string.size()这个函数返回的值的类型并不是int,而是string::size_type类型的,并且非常值得注意的是这个类型他是无符号类型的,用这个直接带入一些式子中可能会有意想不到的结果的; 尤其要注意的是s.size()<n这样的结构。~!! 关于string大小的判断,比较第一对相异的字符大小即可,若没有相异的,谁长谁大,或者就是相等 可以用字符字面值和字符串字面值转换成string 当string对象和字符字面值以及字符串字面值混在一起使用是,必须确保加号两边至少一个是string