首页 > 代码库 > 函数(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)