高阶函数
函数本身也可以赋值给变量,即:变量可以指向函数
abs为函数名,给abs=1重新赋值后,abs已不是函数,而是一个整数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数
In[92]: map(abs, [-1,2,-3,4])
Out[92]: [1, 2, 3, 4]
map() 函数接收两个参数,一个是函数,一个是序列, map 将传入的函数依次作用到序列的每个元素,并把结果作为新的 list 返回
In[92]: map(abs, [-1,2,-3,4])
Out[92]: [1, 2, 3, 4]
reduce 把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接
收两个参数,reduce 把结果继续和序列的下一个元素做累积计算
In[98]: reduce(add,[1,2,3,4,5])
Out[98]: 15
filter() 也接收一个函数和一个序列。和 map() 不同的时,
filter() 把传入的函数依次作用于每个元素,然后根据返回值是 True
还是 False 决定保留还是丢弃该元素
In[99]: def isnotk(x):
...: return x and x.strip()
...:
In[100]: print filter(isnotk, ["", "one", None, [], {}, (), 0])
['one']
排序也是在程序中经常用到的算法。 无论使用冒泡排序还是快速
排序,排序的核心是比较两个元素的大小。通常规定如下:
x < y, return -1
x == y, return 0
x > y, return 1
In[105]: shangp = [["kale", 3.00, 10],["maidong", 4.00, 20],["binglu",1.00, 15]]
In[106]: def mymin(x):
...: return x[1]
...:
In[107]: sorted(shangp, key= mymin)
Out[107]: [['binglu', 1.0, 15], ['kale', 3.0, 10], ['maidong', 4.0, 20]]
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回
当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数
匿名函数有只能有一个表达式,不用写 return ,返回值就是该表达式的结果。因为匿名函数没有名字,不必担心函数名冲突。 此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数
In[109]: def add(x,y):
...: return x+y
...:
In[110]: add = lambda x,y:x+y
In[111]: add(1,2)
Out[111]: 3