高阶函数

xiaoxiao2021-02-27  162

函数可以赋值给变量,即变量可以指向函数,函数名其实就是指向函数的变量。

高阶函数

函数将另一个函数作为参数,这种函数称之为高阶函数。 思维导图:

内置的高阶函数

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

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

def cheng(x,y): return x*y print 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_sum2 f=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*y print reduce(cheng,range(1,11))

简便很多!

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

匿名函数也可作为返回值。

装饰器

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

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

给函数添加运行时间:

import time def 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 @timer def login(): time.sleep(1) print "login" def register(): time.sleep(2) print "register" register=timer(register) #等价于在函数头添加@timer login() register()

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

转载请注明原文地址: https://www.6miu.com/read-15743.html

最新回复(0)