本文共 3788 字,大约阅读时间需要 12 分钟。
高阶函数
高阶函数就是把函数当做参数传入的一种函数,如下,把 abs() 这个内置函数传入到自定义的函数中,先求绝对值再相加:
In [2]: def fun(x, y, f):
...: return f(x) + f(y)
...:
In [3]: fun(-2,12,abs) #abs是内置函数,传递一个内置函数-绝对值
Out[3]: 14
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]
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 -- 可迭代对象。
返回值
返回列表。
实例:
过滤出列表中的所有奇数:
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 tmpwhile 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,其他就是falsewhile 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)