高阶函数(higher order function)
函数式编程的特点之一是使用高阶函数.
接受函数为参数,或者把函数作为结果返回的函数是高阶函数.
高阶函数主要有map(),filter(),reduce()以及内置函数sorted().
在讲解高阶函数之前,我们需要先对匿名函数lambda()有所了解.
匿名函数 lambda
lambda argument1,argument2,...argumentN:expression using arguments
lambda 是一个表达式而不是语句.lambda 函数的定义中不能使用赋值.
常见的lambda表达式主要有下面三种
lambda x:x+5
lambda x,y:x**y
lambda x,y:func(x,y)
sorted()
sorted()提供可选的key参数用于提供一个函数
>>>fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']
>>> sorted(fruits, key=len) #len()是函数而不是方法
['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry']
>>>students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>>sorted(students,key=lambda s:s[2])
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
map()
map()函数接收两个参数,一个是函数,一个是可迭代对象(iterable),map将传入的函数依次作用到可迭代对象中的每个元素,并把结果作为新的Iterator返回。
例一
>>>mylist = [1,2,3,4,5] #要求输出[1,4,9,16,25]
#接收内置函数
>>>list(map(pow,mylist,[2,2,2,2,2])) #在这里使用pow不是一个很好的选择
#接收匿名函数
>>>list(map(lambda x:x**2,mylist))
#接收自定义函数
>>>def squ(x):
>>> return x**2
>>>list(map(squ,mylist))
例二
>>>list1 = [4,6,3,2,5]
>>>list2 = [2,3,5,1,4]
>>>func = lambda x,y:x+y
>>>list(map(func,list1,list2))
[6,9,8,3,9]
filter()
#例三 筛选奇数项
>>>mylist = [0,1,2,-3,4,5,6,-7,8,9]
>>>list(filter(lambda x:x%2,mylist))
[1, -3, 5, -7, 9]
map+filter
#例四 筛选出奇数项以绝对值形式输出
>>>mylist = [-1,-2,3,4,-5,6,7,-8,-9]
>>>list(map(abs,filter(lambda x:x%2,mylist)))
[1, 3, 5, 7, 9]
map,filter的现代替代品
在 Python 3 中,引入了列表推导和生成器表达式。两者都具有 map 和 filter 两个函数的功能,而且更易于阅读.
例一
>>>mylist = [1,2,3,4,5]
>>>[i**2 for i in mylist]
[1,4,9,16,25]
例二
>>>list1 = [4,6,3,2,5]
>>>list2 = [2,3,5,1,4]
>>>[i+j for i,j in zip(list1,list2)]
[6, 9, 8, 3, 9]
例四
>>>mylist = [-1,-2,3,4,-5,6,7,-8,-9]
>>>[abs(i) for i in mylist if i%2==1]
[1, 3, 5, 7, 9]
总结
在一些适当的情景下加入函数式编程会起到不错的效果,但如果只是为了追求减少代码量而盲目使用,则会适得其反,会大大降低代码的可读性.
网友评论