递归
指在函数的定义中使用函数自身的方法
非波那契数列递归函数:
def fib(n) if n ==0: return 0 elif n ==1: return 1 else: return fib(n-2)+fib(n-1) if __name__ == "__main__": f = fib(10) print f
从上面的过程中可以看出,每个递归的过程,都是向着最初的已知条件a0=0,a1=1
方向挺近一步,直到通过这个最底层的条件得到结果,然后再一层一层向上回馈计算机结果。
因为a0=0,a1=1
是已知的了,不需要每次都判断一边。所以,还可以优化一下。优化的基本方案就是初始化最初的两个值。
meno = {0:0,1:1} def fib(n): if not n in meno: meno[n] = fib(n-1) + fib(n-2) return meno[n] if __name__ == "__main__": print fib(10)
几个特殊函数
python是支持多种范型的语言,可以进行所谓函数式编程,其突出体现在有这么几个函数:
filter、map、reduce、lambda、yield
l
lambda
lambda函数,是一个只用一行就能解决问题的函数
lambda arg1, arg2, ...argN : expression using arguments
- 在lambda后面直接跟变量
- 变量后面是冒号
- 冒号后面是表达式,表达式计算结果就是本函数的返回值
虽然lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值,但是lambda 函数不能包含命令,包含的表达式不能超过一个。不要试图向 lambda 函数中塞入太多的东西;如果你需要更复杂的东西,应该定义一个普通函数,然后想让它多长就多长。
>>> lamb = [ lambda x:x,lambda x:x**2,lambda x:x**3,lambda x:x**4 ] >>> for i in lamb: ... print i(3), ... 3 9 27 81
map
map(func,seq),func是一个函数,seq是一个序列对象。在执行的时候,序列对象中的每个元素,按照从左到右的顺序,依次被取出来,并塞入到func那个函数里面,并将func的返回值依次存到一个list中。
>>> items = [1,2,3,4,5] >>> squared = [] >>> for i in items: ... squared.append(i**2) ... >>> squared [1, 4, 9, 16, 25] >>> def sqr(x): return x**2 ... >>> map(sqr,items) [1, 4, 9, 16, 25] >>> map(lambda x: x**2, items) [1, 4, 9, 16, 25] >>> [ x**2 for x in items ] #这个我最喜欢了,一般情况下速度足够快,而且可读性强 [1, 4, 9, 16, 25]
>>> lst1 = [1,2,3,4,5] >>> lst2 = [6,7,8,9,0] >>> map(lambda x,y: x+y, lst1,lst2) #将两个列表中的对应项加起来,并返回一个结果列表 [7, 9, 11, 13, 5]
>>> lst1 = [1,2,3,4,5] >>> lst2 = [6,7,8,9,0] >>> lst3 = [7,8,9,2,1] >>> map(lambda x,y,z: x+y+z, lst1,lst2,lst3) [14, 17, 20, 15, 6]
reduce
>>> reduce(lambda x,y: x+y,[1,2,3,4,5]) 15
>>> a [3, 9, 8, 5, 2] >>> b [1, 4, 9, 2, 6] >>> zip(a,b) #复习一下zip,下面的方法中要用到 [(3, 1), (9, 4), (8, 9), (5, 2), (2, 6)] >>> sum(x*y for x,y in zip(a,b)) #解析后直接求和 133 >>> new_list = [x*y for x,y in zip(a,b)] #可以看做是上面方法的分布实施 >>> #这样解析也可以:new_tuple = (x*y for x,y in zip(a,b)) >>> new_list [3, 36, 72, 10, 12] >>> sum(new_list) #或者:sum(new_tuple) 133 >>> reduce(lambda sum,(x,y): sum+x*y,zip(a,b),0) #这个方法是在耍酷呢吗? 133 >>> from operator import add,mul #耍酷的方法也不止一个 >>> reduce(add,map(mul,a,b)) 133 >>> reduce(lambda x,y: x+y, map(lambda x,y: x*y, a,b)) #map,reduce,lambda都齐全了,更酷吗? 133
特别提醒:如果读者使用的是python3,跟上面有点不一样,因为在python3中,reduce()已经从全局命名空间中移除,放到了functools模块中,如果要是用,需要用from functools import reduce
引入之。
filter
>>> numbers = range(-5,5) >>> numbers [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4] >>> filter(lambda x: x>0, numbers) [1, 2, 3, 4] >>> [x for x in numbers if x>0] #与上面那句等效 [1, 2, 3, 4] >>> filter(lambda c: c!=‘i‘, ‘qiwsir‘) #能不能对应上面文档说明那句话呢? ‘qwsr‘
时间: 2024-12-30 04:00:42