学习一门语言最好的办法,就是教懂别人。在这里,我会从 Python 最基础的教程写起,慢慢一步步进阶。Python 基础比较好的也可以参考下,欢迎指教。
今天我们来学习下 Python 中一种特殊的特殊函数:匿名函数。这篇文章比较基础,已经掌握的大侠们可以忽略此文章,请直接滑到文末帮忙投下票,帮我做个调查,谢谢!
首先我们简单了解下函数的知识。
Python 函数
我们都知道 Python 中定义函数用 def 关键字开头,后面接函数名称和括号。一般为了调用函数更方便和灵活,我们都会加上参数。比如我们现在定义一个能打印出一个数的平方的函数。
1 2 3 4 5 6 7 |
def square(x): print(x**2) square(6) # 结果 36 |
像这种简单功能的函数,类似于开方、开根号、简单运算等每次都要新建一个函数来调用,很繁琐,有什么办法简单这个问题,那就要用到 Python 内置的高阶函数中的其中一种:匿名函数。
什么是匿名函数
匿名,顾名思义,不会显示出函数名称而直接调用其功能。匿名函数有哪些特点呢?
1、使用 Python 写一些执行脚本时,使用 lambda 可以省去定义函数的过程,让代码更加精简。
2、对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。
3、lambda主体只是单个表达式,不是一个代码块。lambda 与普通函数 function 定义方法来比较它的功能更小,它只是一个为简单函数所服务的对象,而 def 能处理更大型的数据任务。
匿名函数语法
匿名函数语法如下:
lambda [arg1 [,arg2,…..argn]]:expression
比如说上面的计算平方的函数用匿名函数表达如下:
1 |
lambda x: x ** 2 |
关键字用 lambda,:之前的 x 是参数,:后面的语句就是匿名函数的返回值。
匿名函数用法
如需打印出 6 的平方:
1 2 3 4 5 |
f = lambda x: x ** 2 print(f(6)) # 结果: 36 |
接下来我们就结合 Python 的内置高阶函数 map 和 sorted 函数 一起来看下匿名函数复杂点的功能。Python 中高阶内置函数除了 匿名函数、map 函数、sorted 函数外还有 reduce 函数、filter 函数。
什么是高阶函数啊?高阶函数就是把函数当成参数传递的一种函数。今天主题是匿名函数,其他高阶函数以后在详细讲解,今天结合高阶函数 map 函数和 sorted 函数来看看匿名函数的复杂用法。
匿名函数复杂用法
我们先简单看看高阶函数 map 函数的作用是什么。
map 函数语法
map(function, iterable, …)
第一个参数 function 是函数,第二个 iterable 参数指一个或多个序列。
map() 作用是把 function 函数以此作用于后面序列的每一个元素上,使其生成一个新的序列。
现在我们先不用匿名函数,我们还是以上面定义的平方函数为例,用平方函数以此作用于列表 [1,2,3,4,5] 每个元素,生成新的列表 [1,4,9,16,25]。
1 2 3 4 5 6 7 8 |
def square(x): print(x**2) print(map(square, [1, 2, 3, 4, 5])) # 结果 <map object at 0x00000000026D8BE0> |
在 Python3 中,map 函数的结果返回是一个迭代器,在 Python2 中返回的是一个列表,有 Python2 环境可以试试,Python3 需要把迭代器打印出来的话就赋予它类型即可。比如让它还是以列表形式显示。
1 2 3 4 5 6 7 8 9 10 11 12 |
def square(x): print(x**2) print(list(map(square, [1, 2, 3, 4, 5]))) # 结果: 1 4 9 16 25 |
现在我们用匿名函数替换掉 square 函数。
1 2 3 4 |
print(list(map(lambda x: x**2, [1, 2, 3, 4, 5]))) # 结果: [1, 4, 9, 16, 25] |
是不是代码更简洁了。
灵活运用
其实有些情况也不是非匿名函数不可,之前讲到的列表生成有时候也可以取代它,同样用上面的例子:
1 2 3 4 |
print([x**2 for x in range(1,6)]) # 结果: [1, 4, 9, 16, 25] |
更简洁!所以学知识我们要灵活运用。什么时候使用 lambda,什么时候不用,需要具体情况具体分析,只要表达的意图清晰就好。一般情况下,如果 for..in..if 能做的,我都不会选择 lambda。
sorted 函数语法
1 |
sorted(iterable[, cmp[, key[, reverse]]]) |
iterable — 可迭代对象。
cmp — 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key — 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse — 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
举例:结合匿名函数对下面数据按照名字降序排序
1 2 3 4 5 6 7 8 9 10 |
brucepk = [ {"name": "bruce", "age": 18}, {"name": "p", "age": 19}, {"name": "k", "age": 20}] # 按 name 降序排序: print(sorted(brucepk, key=lambda x: x['name'], reverse=True)) # 结果 [{'name': 'p', 'age': 19}, {'name': 'k', 'age': 20}, {'name': 'bruce', 'age': 18}] |
好了,今天匿名函数的知识就分享到这里。