- 函数可以赋值给变量,即变量可以指向函数,函数名其实就是指向函数的变量。
高阶函数
- 函数将另一个函数作为参数,这种函数称之为高阶函数。
思维导图:
内置的高阶函数
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()
装饰器的实质是返回函数的高阶函数