高阶函数

高阶函数就是把函数当做参数传入的一种函数,如下,把 abs() 这个内置函数传入到自定义的函数中,先求绝对值再相加:

In [2]: def fun(x, y, f):

   ...:     return f(x) + f(y)

   ...: 


In [3]: fun(-2,12,abs)             #abs是内置函数,传递一个内置函数-绝对值

Out[3]: 14


image.png


Python 内置的高阶函数有:map() 、reduce() 、filter() 、sorted()

map() 函数:

格式:

map(function, iterable, ...)

  • function -- 函数,有两个参数

  • iterable -- 一个或多个序列


In [7]: def fun(x):

   ...:     return x + x

In [8]: list1=[1,2,3,4]

In [9]: map(fun,list1)

Out[9]: [2, 4, 6, 8]



In [14]: list2=[-11,-2,0,1]

In [15]: map(abs,list2)

Out[15]: [11, 2, 0, 1]


image.png


image.png


reduce() 函数:

reduce() 接收两个参数,第一个是函数(这个函数必须定义两个形参),第二个是序列,第一次执行时,先将序列中的前两个元素交给函数处理;第二次执行时,将前面的处理结果和序列中的第三个元素交给函数处理,以此类推。如下,先定义一个函数 add() ,当我们执行 reduce(add, [1, 2, 3, 4, 5]) 时,执行流程如下:

先将 1 和 2 交给 add() 函数处理,得到结果 3

再将 3 与 3 交给 add() 函数处理,得到结果 6

再将 6 与 4 交给 add() 函数处理,得到结果 10

再将 10 与 5 交给 add() 函数处理,得到结果 15

其实就是相当于 1 + 2 + 3 + 4 + 5

In [22]: def add(x,y):

    ...:     return x + y

    ...: 


In [23]: reduce(add,[1,2,3,4,5])

Out[23]: 15

In [26]: reduce(add,range(0,101))

Out[26]: 5050



filter() 函数:


filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

以下是 filter() 方法的语法:

filter(function, iterable)

参数

function -- 判断函数。

iterable -- 可迭代对象。

返回值

返回列表。


实例:

过滤出列表中的所有奇数:

image.png


image.png


math方法:

In [36]: math.pow(2,3)             #返回x 的 y次方

Out[36]: 8.0


In [38]: math.sqrt(100)             #返回100的平方根,即10的平方就是100,那10就是100的平方根

Out[38]: 10.0

In [39]: math.sqrt(10)

Out[39]: 3.1622776601683795


In [40]: math.floor(5.9)            #返回不大于x(小于等于x)的一个整数

Out[40]: 5.0


In [46]: math.fabs(-123)           #返回x的绝对值

Out[46]: 123.0


In [47]: math.fmod(10,3)          #x%y 取余数

Out[47]: 1.0


sorted() 

sorted() 函数对所有可迭代的对象进行排序操作。

sort 与 sorted 区别:

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

语法

sorted 语法:

sorted(iterable[, cmp[, key[, reverse]]])

参数说明:

iterable -- 可迭代对象。

cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。

key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

实例:

In [59]: L=[('b',2),('a',1),('c',3),('d',4)]

In [60]: sorted(L,key=lambda x:x[1])                       #lambda 为匿名函数,x为参数,将L传递给x,然后取出x[1] 作为排序处理

Out[60]: [('a', 1), ('b', 2), ('c', 3), ('d', 4)]


In [62]: students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

In [63]: sorted(students,key=lambda x:x[2],reverse=False)                    #reverse=False 这个是升序

Out[63]: [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]


练习:

1、从终端接收若干个数字,要求使用filter()函数,将输入的不是数字的值剔除掉(用户输入的内容有随机性,当我们要接收一个数字的时候,他可能会输入一个字符串过来,要求当用户输入的不是数字,就剔除掉)
# filter(lambda x:x%2==0,[int(i) for i in range(10)]) #表示除以2等于0就返回
def funa(list1):
    tmp=filter(lambda x:x.isdigit(),list1) #列表中的元素一个个传入到函数中,判断为整数的话就打印
    return tmp
while True:
    num=raw_input('Please input something: ')
    print ('{0}'.format(funa(num.split())))#将字符串转化为列表传入到函数中
    
2、从终端接收若干个以空格隔开的字符串,然后去除所有的26个字符之外的字符后,打印到屏幕上
要求:使用map()函数,map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
def funa(list1):
    return filter(lambda x:x.isalpha(),list1)
#isalpha()若是输出的字母就是Ture,其他就是false
while True:
    tmp=raw_input('please input something: ')
    tmp=tmp.split()
    print ('{0}'.format(map(funa,tmp)))#map函数是将字符串一个一个的由funa函数判断,比如输入12bb,就会对1,2,b,b分别判断,而不是12bb这个整体做判断

3. 从终端接收若干个以空格隔开的字符串
(1).以空格隔开的字符串为用户想要输入的一个值
(2).用户在输入时不小心按出来了字母键
示例如下
"afda111 dafd222 3dfad33 4ss4dd4"
这个字符串,其实是用户想要求 111 222 333 444 的和
要求:把每个值中的字母去掉,并计算出所有值的和
提示:使用reduce函数,结合前两题使用过的方法,可以很简单的算出

def funa(list1):              #将列表中的数字返回
    return filter(lambda x:x.isdigit(),list1)

while True:
    tmp=raw_input('Please input string:')
    tmp=tmp.split()
    tmp=map(funa,tmp)          #map对列表的元素一个个处理,返回整数
    tmp=map(int,tmp)           #变为整数类型,才能相加
    sum=reduce(lambda x,y:x+y,tmp) #reduce 一个个相加
    print (sum)