高阶函数

来源:互联网 发布:整理桌面的软件 编辑:程序博客网 时间:2024/05/22 03:18
  • 函数可以赋值给变量,即变量可以指向函数,函数名其实就是指向函数的变量。

高阶函数

  • 函数将另一个函数作为参数,这种函数称之为高阶函数。
    思维导图:
    这里写图片描述

内置的高阶函数

  • map()#接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并将结果以列表形式返回。
    这里写图片描述

  • reduce #把一个函数作用在序列上,函数必须接收两个参数,reduce把结果继续和下一个元素做累积计算。
    实现10!

def cheng(x,y):    return x*yprint reduce(cheng,range(1,11))

这里写图片描述

这里写图片描述
reduce(add,[1,2,3,4])===>
add(add(add(1,2),3),4)
reduce(cheng,range(1,11))

** 求10的阶乘:

  • filter #接收一个函数和序列,和map()不同的是,filter()将传入的函数依次作用于每个元素,然后根据返回值是True或者False决定是否保留该元素。
In [15]: def is_oushu(n):   ....:     if n%2 == 0:   ....:         return True   ....:     else:   ....:         return False   ....:     In [16]: filter(is_oushu,range(1,11))Out[16]: [2, 4, 6, 8, 10]

这里写图片描述

  • sorted()
n [20]: l = ["a","Ab","cd","C"]In [21]: sorted(l)Out[21]: ['Ab', 'C', 'a', 'cd']In [22]: def cmp_ignore_case(s1,s2):   ....:     s1 = s1.lower()   ....:     s2 = s2.lower()   ....:     if s1 < s2:   ....:         return -1   ....:     elif s1 > s2:   ....:         return 1   ....:     else:   ....:         return 0   ....:     In [23]: sorted(l,cmp_ignore_case)Out[23]: ['a', 'Ab', 'C', 'cd']

这里写图片描述

函数作为返回值

高阶函数除了可以接受函数作为参数外,还可以把函数作为返回值。

def lazy_sum(*args):    def cacl_sum2():        return sum(args)    return cacl_sum2f=lazy_sum(1,2,3,4,5)  print f()

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
调用lazy_sum()时,每次调用都会返回一个新的函数。

匿名函数

  • 在不需要显示地定义函数时,直接传入匿名函数更方便。
  • 关键字lambda表示匿名函数,格式:lambda 参数 : 运算。
  • 匿名函数只能有一个表达式,不用写return,返回值就是表达式的结果。

匿名函数实现10!:

print reduce(lambda x,y:x*y,range(1,11))

这里写图片描述
比之前的

def cheng(x,y):    return x*yprint reduce(cheng,range(1,11))

简便很多!

  • 匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用改函数。
f=lambda x,y:x+yprint f(1,2)f=lambda x=2,y=3:x+yprint f()

这里写图片描述

  • 匿名函数也可作为返回值。
    这里写图片描述

装饰器

  • 装饰器是用来装饰函数的。

    • 增强函数功能;
    • 不希望修改原函数的定义;
    • 在代码运行期间动态增加功能的方式。

    给函数添加运行时间:

import timedef timer(func):    def wait(*args,**kw):        start_time=time.time()        func()        stop_time=time.time()        print "%s running time:%s"%(fun.__name__,stop_time-start_time)    return wait@timerdef login():    time.sleep(1)    print "login"def register():    time.sleep(2)    print "register"register=timer(register)  #等价于在函数头添加@timerlogin()register()

这里写图片描述

装饰器的实质是返回函数的高阶函数

原创粉丝点击