今天主要学习了Python函数式编程,在此总结一下
1.Python中函数也是一种对象,我们可以用变量来指向函数,并且实现调用。
f=abs
l=f(-10)print(l)#Output:10
2.函数中可以传入函数,这样的函数叫做高阶函数。
f=absdefadd(a,b,f):
c=a+b+abs(-1)print('sum is %d'%c)
add(1,2,f)#Output:sum is 4
上述add方法中, f作为参数传给了add。add方法是一个高阶函数。
3.Python提供了许多强大的内建函数供调用。比如reduce、map、fliter、sorted。接下来简要介绍一下这几个函数。
在介绍上述几个高阶函数之前,我们需要先了解一些有关Iterator(迭代器)和Iterable(可迭代)的基础知识。
给定一个list或者tuple,我们可以用for循环来遍历至二个list或者tuple。这种遍历称为迭代(Iteration)。
凡是可以直接作用于for循环的对象统统称为可迭代对象:Iterable。可用isinstance()来判断一个对象是否是Iterable。
凡是可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。可用isinstanceoc判断一个对象是否是Iterator对象。
Iterator是惰性的,他不会直接包含计算结果,可以使用list()把Iterator转为一个list。
了解完Iterable和Iterator之后,我们回过来看map。
map(func,seq)
map函数是一个内置的高阶函数。该方法把func 函数作用在参数seq的每一个元素上(这里的seq可以为list,可以为tuple),返回一个Iterator。
Iterator是一个惰性对象,他并不会直接包含你所想要的值,当你直接打印返回的Iterator时,你得到的并不会是你所期望的值,而是该对象的一些属性(内存地址)。若要得到该对象的值,我们可以使用list强制Iterator把结果计算出来,最后得到的是一个list。
deff(x):return x*x
m=map(f,[1,2,3,4,5,6])print(m) #Output:
l=list(m)print(l) #Output:[1, 4, 9, 16, 25, 36]
reduce(func,seq)
reduce把func作用在seq的元素上,并把作用后的结果继续与seq的下一个元素做累积。
比如实现一个累积求和:
from functools importreducedeff(x,y):return x+y
s=reduce(f,[1,2,3,4,5,6])print(s) #Output:21
fliter(func,seq)
fliter把func作用在seq上,并根据返回值是True还是False来决定保留还是丢弃该元素。简单来说,fliter实现了一个筛选的功能。
defget_odd(x):return x % 2 == 1s=filter(get_odd,[1,2,3,4,5,6])print(list(s)) #Output:[1, 3, 5]
sorted(seq,key,reverse)
如其名,sorted常用于排序,默认的sorted排序是根据ASCII码按照升序的方式来排列的。我们可以向sorted中传入一个函数实现特定需求的排序。如果我们需要得到他的反向排序时,我们可以把reverse指定为True。sorted排序并不会影响到原来的序列。
num=[4,2,6,-5,-9,3,8]#默认排序
print(sorted(num))#传入函数abs(绝对值)
print(sorted(num,key=abs))#反向排序
print(sorted(num,key=abs,reverse=True))
Output:
[-9, -5, 2, 3, 4, 6, 8]
[2, 3, 4, -5, 6, 8, -9]
[-9, 8, 6, -5, 4, 3, 2]
可以看出,Python的函数式编程强大而灵活。