迭代计算

迭代器生成器

风流意气都作罢 提交于 2020-01-21 16:13:08
迭代器 迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代 while True: msg = input('>>: ').strip() print(msg) # 仅仅是单纯的循环,没有迭代,不是迭代器 下述while循环才是一个迭代过程,不仅满足重复,而且以每次重新赋值后的index值作为下一次循环中新的索引进行取值,反复迭代,最终可以取尽列表中的值 goods=['mac','lenovo','acer','dell','sony'] index=0 while index < len(goods): print(goods[index]) index+=1 为什么要有迭代器 对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 可迭代对象 要想了解迭代器为何物,必须事先搞清楚一个很重要的概念:可迭代对象(Iterable)。 从语法形式上讲,内置有__iter__方法的对象都是可迭代对象,字符串、列表、元组、字典、集合、打开的文件都是可迭代对象: 'hello'.__iter__ (1

Python标准模块--itertools

那年仲夏 提交于 2020-01-21 15:03:17
1 模块简介 Python提供了itertools模块,可以创建属于自己的迭代器。itertools提供的工具快速并且节约内存。开发者可以使用这些工具创建属于自己特定的迭代器,这些特定的迭代器可以用于有效的遍历。 2 模块使用 2.1 无限迭代器 itertools中有个三个迭代器是无限迭代的,这就意味着当你在使用它们时,你需要了解你要么从这些迭代器中终止,要么就是无限循环。 count count(start = 0, step = 1),count迭代器返回一系列值,以传入的start参数开始,Count也可以接受step参数。 from itertools import count for i in count(10): if i > 20: break else: print i, 通过条件判断,如果超出20,就从for循环中break出来,否则,就打印迭代器中的值,控制台输出, 10 11 12 13 14 15 16 17 18 19 20 另一种限制无限迭代器的输出是通过itertools中的islice方法,如下所示, from itertools import count,islice for i in islice(count(10),10): print i, count从10开始,在10个元素之后结束。islice的第二个变量是指定何时停止迭代,但是

MATLAB强化学习入门——二、网格迷宫、Q-learning算法、Sarsa算法

浪尽此生 提交于 2020-01-19 20:51:33
一、多步决策问题和网格迷宫 上一篇文章里讨论多臂赌机问题是单步最优决策问题的对应模型。而在这之后,则可以考虑离散的多步决策问题。离散的多步决策问题,对应的典型问题模型则是网格迷宫(Grid World)。 前文中,ε-greedy策略,softmax策略的原理及其特点得到了讨论。而这些策略,可以看作智能体应对某一状态时选择动作的方式。策略应用的前提,则是智能体对于动作的优劣有着某种估计(无论正确与否)。 当策略应用到多步决策问题上时,如果想要令同样的策略产生作用并选择动作,就需要对系统所处的每一个状态以及对应动作的优劣进行估计。状态价值函数 V(x) (state value function)以及状态-动作价值函数Q(x,a) (state-action value function)也就应运而生了。 图1 Windy Grid World 网格迷宫问题可以描述为智能主体在一个类似棋盘的离散网格空间中学习到达目标点的最优策略的问题。在普通的网格中增加一些变化,添加影响小球运动的风速,即得到Windy Grid World,如图一。智能体在该情况下的移动,受到时不变的风速影响。 状态价值函数与动作-状态价值函数之间的关系可以用Bellman方程得到,具体可参看[1]或者浙江大学的机器学习MOOC。而在算法的具体实现上,往往仅仅需要动作-状态价值函数,即Q函数。 总的思路是

Python函数进阶:闭包、装饰器、生成器、协程

南楼画角 提交于 2020-01-19 13:21:34
/*--> */ /*--> */ 返回目录 本篇索引 (1) 闭包 (2) 装饰器 (3) 生成器 (4) 协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++、Java、JavaScript等都实现或部分实现了闭包功能,很多高级应用都会依靠闭包实现。 一般专业文献上对闭包的定义都比较拗口,比如:“将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象称为闭包。” 其实,简单来说,你可以将闭包看成是一个轻载的类,这个类只有一个函数方法,并且只有为数不多的几个成员变量。 闭包的优点是:实现起来比类稍微轻巧一点(意思就是可以少敲一些代码),并且运行速度比类要快得多(据说约快50%)。下面是一个定义闭包的简单例子: def foo(x, y): def hellofun(): print('hellofun x is %d, y is %d.' %(x,y)) return hellofun a = foo(1,2) b = foo(30,40) a() b() # 运行结果为: hellofun x is 1, y is 2. hellofun x is 30, y is 40. 上例中,foo就定义了一个闭包,它将内部定义的函数hellofun返回(但并不运行这个函数), 同时将入参x,y作为以后hellofun要运行时的环境

迭代 装饰器 闭包

给你一囗甜甜゛ 提交于 2020-01-18 11:16:28
迭代器: 包含yield表达式的函数是特殊的函数,叫做生成器函数(generator function),被调用时将返回一个迭代器(iterator),调用时可以使用next或send(msg)。它的用法与return相似,区别在于它会记住上次迭代的状态,继续执行。 send(msg)与next()的区别在于send可以传递参数给yield表达式,这时传递的参数会作为yield表达式的值,而yield的参数是返回给调用者的值。初始调用时必须先next()或send(None),否则会报错。 举个例子: 首先生成一个迭代器f,f.next()会使生成器函数执行到yield,生成一个值然后挂起。 然后f.next()或f.send(msg)会在生成器函数内部返回值,执行到下一个yield,生成值后挂起 然后f.next()或f.send(msg)会在生成器函数内部返回值,意图执行到下一个yield,但是后面没有yield了,所以抛出异常。 使用yield可以有效简化代码,并减少空间浪费。 举个简单例子:列表中的每个元素+1 传统写法: Python代码 def addlist(alist): r = [] for i in alist: r.append(i+1) return r 复制代码 yield写法: Python代码 def addlist(alist): for i in

集成算法之GBDT和xgboost

大兔子大兔子 提交于 2020-01-18 01:47:57
大家知道,我们在进行建模时,会求解一个目标函数;目标函数又称代价函数,在机器学习中普遍存在,一般形式为: o b j ( θ ) = L ( θ ) + Ω ( θ ) obj(\theta)=L(\theta)+\Omega(\theta) o b j ( θ ) = L ( θ ) + Ω ( θ ) ; 其中: L ( θ ) L(\theta) L ( θ ) 为训练误差,衡量模型在训练集上的表现; Ω ( θ ) \Omega(\theta) Ω ( θ ) 是正则化惩罚,衡量模型的复杂度。 训练集误差: L = ∑ i = 1 n l ( y i , y i ^ ) L=\sum_{i=1}^{n}l(y_i,\hat{y_i}) L = ∑ i = 1 n ​ l ( y i ​ , y i ​ ^ ​ ) square loss: l ( y i , y i ^ ) = ( y i − y i ^ ) 2 l(y_i,\hat{y_i})=(y_i-\hat{y_i})^2 l ( y i ​ , y i ​ ^ ​ ) = ( y i ​ − y i ​ ^ ​ ) 2 logistic loss: l ( y i , y i ^ ) = y i l n ( 1 + e − y i ^ ) + ( 1 − y i ) l n ( 1 + e y i ^ ) l(y

python模块之itertools

可紊 提交于 2020-01-17 08:48:22
Python:itertools模块简介 itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代联合使用。 先来看下该模块包含的方法或函数,然后我们在对其中的部分进行说明 import itertools print(dir(itertools)) #['__doc__', '__loader__', '__name__', '__package__', '__spec__', '_grouper', '_tee', '_tee_dataobject', 'accumulate', 'chain', 'combinations', 'combinations_with_replacement', 'compress', 'count', 'cycle', 'dropwhile', 'filterfalse', 'groupby', 'islice', 'permutations', 'product', 'repeat', 'starmap', 'takewhile', 'tee', 'zip_longest'] accumulate(iterable[, func]) 返回累计和的序列(或其他二元函数结果)。 import itertools it = itertools

八大算法思想

拈花ヽ惹草 提交于 2020-01-15 09:28:39
八大算法思想分别是:枚举、递推、递归、分治、贪心、试探法、动态迭代和模拟算法思想。 1、比较“笨”的枚举算法思想 枚举最大的缺点是运算量比较大,解题效率不高。 如果题目的规模不是很大,在规定的时间与空间限制内能够求出解,那么最好是采用枚举法,而无须太在意是够还有更快的算法,这样可以使你有更多的时间去解答其他难题。 //枚举法解决“填写运算符”的问题 import java.util.Scanner; public class meijujisuan5ge5 { public static void main(String[] args) { // TODO Auto-generated method stub int j; int[] i=new int[5]; //用数组i来表示4个运算符 (5个数之间有四个符号,分别遍历出所有的情况) int sign;//累加运算时的符号 int count=0;//计数器,统计符合条件的方案 int num[]=new int[6];//保存操作数(输入值) float left,right; char[] oper={' ','+','-','*','/'}; System.out.println("请输入5个数,之间用空格隔开:"); Scanner in=new Scanner(System.in); for(j=1;j<=5;j++

八大算法思想

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-15 09:28:26
八大算法:枚举、递推、递归、分治、贪心、试探法、动态迭代和模拟算法思想。 一、枚举算法思想(暴力算法)   将问题的所有可能答案一一列举,根据判断条件判断此答案是否合适,一般用循环实现。   经典运用: 百钱买百鸡、填写运算符 二、递推算法思想   1.顺推法:从已知条件出发,逐步推算出要解决问题的方法。   2.逆推法:从已知结果出发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程。   经典运用: 斐波那契数列(顺推法)、银行存款(逆推法) 三、递归算法思想   1.递归过程一般通过函数或子过程实现;   2.递归算法在函数或子过程的内部,直接或间接调用自己的算法   3.递归算法实际上是把问题转化为规模缩小了的同类问题的子问题,然后再递归调用函数或过程来表示问题的解   注意:必须有一个明确的递归结束条件;如果递归次数过多,容易造成栈溢出。    经典运用: 汉诺塔问题、阶乘问题 四、分治算法思想   将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。只要求出子问题的解,就可得到原问题的解。   一般步骤:     1.分解,将要解决的问题划分成若干个规模较小的同类问题     2.求解,当子问题划分得足够小时,用较简单的方法解决     3.合并,按原问题的要求,将子问题的解逐层合并构成原问题的解   经典运用: 大数相乘问题

递归和迭代的不同

倾然丶 夕夏残阳落幕 提交于 2020-01-15 08:12:31
递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合. 使用递归要注意的有两点: 1)递归就是在过程或函数里面调用自身; 2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口. 递归分为两个阶段: 1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解; 2)回归:当获得最简单的情况后,逐步返回,依次得到复杂的解. 利用递归可以解决很多问题:如背包问题,汉诺塔问题,...等. 斐波那契数列为:0,1,1,2,3,5... fib(0)=0; fib(1)=1; fib(n)=fib(n-1)+fib(n-2); [cpp] view plain copy int fib( int n) { if (0 == n) return 0; if (1 == n) return 1; if (n > 1) return fib(n-1)+fib(n-2); } 上面就是一个简单的递归调用了.由于递归引起一系列的函数调用,并且有可能会有一系列的重复计算,递归算法的执行效率相对较低. 迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B