博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高阶函数
阅读量:5740 次
发布时间:2019-06-18

本文共 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

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 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)
本文转自 iekegz 51CTO博客,原文链接:http://blog.51cto.com/jacksoner/2058552,如需转载请自行联系原作者
你可能感兴趣的文章
cvs文件提交冲突解决方案
查看>>
十步优化SQL Server中的数据访问
查看>>
java 执行jar包中主程序
查看>>
golang中省略返回值造成内存泄漏
查看>>
PostgreSQL数据库集群初始化
查看>>
++重载
查看>>
Rainbond 5.0.4版本发布-做最好用的云应用操作系统
查看>>
nodejs 完成mqtt服务端
查看>>
在ASP.NET MVC 中获取当前URL、controller、action
查看>>
Spring IoC容器初的初始化过程
查看>>
(23/24) webpack实战技巧:如何在webpack环境中使用Json
查看>>
sql server 触发器
查看>>
[工具]前端自动化工具grunt+bower+yoman
查看>>
2-14
查看>>
swift-UITableView的基本使用(例子)
查看>>
自动化测试之WatiN(2)
查看>>
无状态、REST、RESTful 和 Web Services【整理】
查看>>
用户登录框(含验证码)
查看>>
linux创建用户
查看>>
Pig Hive对比(zz)
查看>>