1.递归函数
看到递归函数想起了原来上学的时候的数列计算,一般是当前值与前边值有一定的规则,可以有一个表达式来表示该规则,递归函数指一个函数在其内部调用自身本身,这个就是递归函数,而且注意“归”,是指不会一直调用会最终停在一个地方。
比如阶乘运算,f(n)=1*2*3*4*.......*(n-1)*n=f(n-1)*n,所以阶乘运算就可以写成一个递归函数,不过用递归能实现的一般用循环也能完成,很明显递归函数会更简洁,逻辑清晰,但是递归函数会出现栈溢出的情况,因为计算机中,函数调用是通过栈这种数据结构实现的,每当进入一个函数调用,栈就会加一层,每当函数返回就会减一层栈,由于栈的大小不是无线的,所以递归次数调用多,会导致栈溢出
汉诺塔游戏可以通过递归函数给予解决方案,将盘子从a轴借助b轴,移动到c轴
2.高级操作
对python的数据类型、语句和函数有了基本的了解之后,就可以写出来很多的程序了,但是要切记:代码越少越好,程序越简单越好。所以为了用更少的代码,更简单的程序实现同样的功能,我们需要学习一些高级的操作。
2.1切片
切片就是指,当我们规定了索引范围后,可以用python提供的Slice操作符简便的实现范围的分割,经常用到的是list,tuple,字符串的切片操作[:]形式
(1)取前几位,或后几位 :从左到右的位置索引为0,1,2...,倒数第一位是-1,倒数第二位是-2...
[:3]指前3位(如果第一个索引是0,此处0可以省略)
[-4:]指后4位(如果第二个索引是-1,此处可以省略)
[:]指有复制了一个list/tuple/字符串
(2)去中间一段,或者设置步长
[10:20]指取前11-20位
[:10:2]指前10个数,每两个取一个
2.2迭代
迭代Iteration,可以通过for循环完成list或tuple的遍历,可迭代的类型不仅仅有list和tuple
判断是否可迭代,可以from collections import Iterable 模块,用isinstance('',Iterable),返回true即可迭代
2.3列表的生成
我们可以想到生成list会用循环的方法,但是比较繁琐,现在我们可以用一行代码代替循环
[x*x for x in range(10) if x%2==0]即为一个list, for后边可以添加if条件
2.4生成器
刚刚学习到的list的生成,是一下子将list所有元素生成,若列表元素多,会占用很多内存,同时我们也不一定能用着所有元素,所以我们是否可以边计算边用呢?Python中的一边循环一边计算的机制称为生成器generator生成器是协同程序,就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候在程序离开的地方继续或重新开始。
generator的特点:(1)generator保存的算法,每次调用next()时才计算下一个元素(2)函数时遇到yield中断,在下一次迭代的时候从yield的下一个语句执行
生成器有两种方式:(1)将刚才学到的list生成方式的[]改成(),则成为generator;(2)当函数中包含yield关键字,返回值是一个生成器, 如果要执行函数内容.需要调用next方法,或者for循环。运行过程: 当执行next方法时, 遇到yield程序停止, 直到执行下一次next方法时,从上一次停止的yield处继续执行,遇到yield停止运行.return: 遇到return函数执行结束;
2.5迭代器
凡是可作用于 for 循环的对象都是 Iterable 类型:list、tuple、dict、string、generator等
凡是可作用于 next() 函数的对象都是 Iterator 类型,它们表示一个惰性计算的序列;
集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。