首页 > 代码库 > 函数(3)
函数(3)
递归
指在函数的定义中使用函数自身的方法
非波那契数列递归函数:
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‘
函数(3)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。