1.什么是高阶函数
-
在讲高阶函数之前,还是要说一下什么是一等对象。编程语言理论 把一等对象定义为满足以下条件的程序实体:
-
在运行时创建 -
能赋值给变量或数据结构中的元素 -
能作为参数传给函数 -
能作为函数的返回结果 -
在python中,函数是一等对象,与其他数据类型处于平等的地位,我们可以将函数赋给变量,也可以将其作为参数传入其他函数,还可以将它存储在其他数据结构中,当然也可以将它们作为其他函数的返回值。
-
「在python中函数可以作为其他函数的参数和返回值,接受函数作为输入或者返回函数的函数称作高阶函数。」
-
Python有四个经典的高阶函数:map、filter、reduce、sorted。如果你能熟练使用它们,我相信Python能在你的手上发挥更大的威力!
2. map函数
map(function,iterable…)会根据提供的函数对指定序列做映射。map函数接收两个参数,第一个参数是函数名,第二个参数是iterable。需要注意的是,我们可以传入一个或多个序列进去,但是在Python3中map函数会「返回一个迭代器」。
这么说可能很难把map函数给讲清楚,下面我会给出一些例子来帮助你了解这个函数:
-
将列表中的数据转为string类型
def mapTest():
nums = [1,2,3,4,5,6]
string = map(str,nums) # return an iterator
print(list(string))
mapTest() # 打印['1', '2', '3', '4', '5', '6']
-
对列表中的数据开方
import math
def mapTest():
nums = [1,2,3,4,5,6]
results = map(math.sqrt,nums) # return an iterator
print(list(results))
mapTest() # 打印[1.0, 1.4142135623730951, 1.7320508075688772, 2.0, 2.23606797749979, 2.449489742783178]
-
map函数与lambda函数结合 对list中的数做平方运算
def mapTest():
nums = [1,2,3,4,5,6]
results = map(lambda x : x**2, nums) # return an iterator
print(list(results))
mapTest() # 打印[1, 4, 9, 16, 25, 36]
-
map函数传入两个序列
def mapTest():
nums1 = [1,2,3,4,5,6]
nums2 = [2,4,6,8,10,12]
results = map(lambda x,y : x+y, nums1, nums2) # return an iterator
print(list(results))
mapTest() # 打印[3, 6, 9, 12, 15, 18]
一般情况下,我们很喜欢将lambda函数与map函数混合使用,如果序列不等长时,那就会返回序列的长度将会是最短序列的长度。
3. reduce函数
reduce函数和map函数类似,函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
不过在Python3中,reduce 函数已经被从全局名字空间里移除了,现在被放置在 functools 模块里,如果想要使用它,则需要通过引入 functools 模块来调用 。
该函数的语法如下:
reduce(function, iterable[, initializer])
-
function — 函数,有两个参数 -
iterable — 可迭代对象 -
initializer — 可选,初始参数
返回值:一个数值
光说不举例其实很难理解reduce函数有啥用,所以我来举几个例子吧:
from functools import reduce
def reduceTest():
nums = [1,2,3,4]
results = reduce(lambda x,y:x+y, nums)
print(results) # 打印10
reduceTest()
reduce的运算原理如下图所示。首先,reduce会计算列表中第一个和第二个元素的和,然后把这个结果和第三个元素相加,然后再把新的这个计算结果和第四个元素相加,每一次都是上一次计算的结果和下一个元素相加,所以这样就实现了求和运算。
如果你想继续深究reduce函数的内部原理,还需要再看一个例子:
def func(x,y):
print(x,y)
def reduceTest():
nums = [1,2,3,4]
results = reduce(func, nums)
print(results)
reduceTest()
执行该代码你会得到以下结果:
1 2
None 3
None 4
None
原理剖析: 在第一次计算中,x和y被赋予了列表中的第一个和第二个元素;第二次计算值x=func(1,2),y=3,由于func(1,2)没有返回值,所以只能输出一个None。
同理可得如果我们设置初始值为10,那么第一次计算的x=10,y=1!
def func(x,y):
print(x,y)
def reduceTest():
nums = [1,2,3,4]
results = reduce(func, nums,1)
print(results)
reduceTest()
它的运行结果如下所示:
1 1
None 2
None 3
None 4
None
reduce的应用远远不止这一些,看看下面的例子你将会理解它的真正实力:
# 计算列表中所有元素的乘积
functools.reduce(lambda x, y: x*y, [1,2,3,4])
# 计算列表中所有元素的最大值
functools.reduce(lambda x,y: x if x>y else y, [1,2,3,4])
# 我们有一个列表,里面存了一个数的各位数字,比如[3, 5, 8, 1]对应的是3581的每一个数字,我们要从这个列表计算出原来的数,我们可以这样做
functools.reduce(lambda x,y: x * 10 + y, [3, 5, 8, 1])
4. filter函数
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。它接收两个参数,第一个为函数,第二个为序列,「序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False」,最后将返回 True 的元素放到新列表中。
它的语法如下:
filter(function, iterable)
-
function — 判断函数。 -
iterable — 可迭代对象。
返回值:一个迭代器
这里值得注意的是第一个参数是一个返回布尔值的函数,它用来过滤不符合条件的元素。我们还是举个例子吧!
-
筛选出是序列中是偶数的数值
def filterTest():
nums = [1,3,5,7,10]
results = filter(lambda x : x % 2 == 0, nums)
print(list(results)) # 打印[10]
filterTest()
当然细心的同学会发现,我们也可以用列表表达式来实现这个功能!
print([i for i in [1,3,5,7,10] if i % 2 == 0])
5. sorted函数
sorted()函数对所有可迭代的对象进行排序操作。值得注意的是:这里的sorted函数和我们的sort函数是不一样的!
-
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。 -
list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
sorted函数的语法如下:
sorted(iterable, key=None, reverse=False)
-
iterable — 可迭代对象。 -
key — 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。 -
reverse — 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
返回值:一个列表 (这里不同于map和filter函数)
下面我们还是举个例子吧!
-
根据年龄顺序排列
def sortedTest():
data = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
print(sorted(data,key=lambda x : x[2]))
sortedTest() #打印[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
-
如果要先按照年龄降序排序,相同年龄的按照名字升序排序:
def sortedTest():
data = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10), ('make', 'B', 15)]
print(sorted(data,key=lambda x : (-x[2],x[0])))
sortedTest() #打印[('john', 'A', 15), ('make', 'B', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
6. 结语
最后,我们还是总结一下吧!函数在Python中的地位确实很特殊,我们以后会用一篇文章单独聊一聊函数。今天的主要内容还是python的四大高阶函数,我相信在面试中这也是高频考点,其实熟练使用他们能让你的代码变得更加漂亮!
原文始发于微信公众号(Java之禅):Python的高阶函数
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/161389.html