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()时,每次调用都会返回一个新的函数。
匿名函数实现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()装饰器的实质是返回函数的高阶函数