点击上方"brucepk",选择"置顶公众号"
第一时间关注 Python 技术干货!
阅读文本大概需要 5 分钟。
大家好,这里是「brucepk」零基础学习 Python 系列教程。此文首发于「brucepk」公众号,欢迎大家关注。学习一门语言最好的办法,就是教懂别人。在这公众号,我会从 Python 最基础的教程写起,慢慢一步步进阶。Python 基础比较好的也可以参考下,欢迎指教。
上篇文章文末忘了备注原程序思路来源,这里做下说明:上篇文章 Python骚操作 | 还原已撤回的微信消息 思路来源于:
简书作者:AlicFeng,我对其进行了功能增强和改进,感谢 AlicFeng。
原地址:https://www.jianshu.com/p/712d19374b2e
今天我们来学习下 Python 中一种特殊的特殊函数:匿名函数。这篇文章比较基础,已经掌握的大侠们可以忽略此文章,请直接滑到文末帮忙投下票,帮我做个调查,谢谢!
首先我们简单了解下函数的知识。
Python 函数
我们都知道 Python 中定义函数用 def 关键字开头,后面接函数名称和括号。一般为了调用函数更方便和灵活,我们都会加上参数。比如我们现在定义一个能打印出一个数的平方的函数。
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
比如说上面的计算平方的函数用匿名函数表达如下:
lambda x: x ** 2
关键字用 lambda,:之前的 x 是参数,:后面的语句就是匿名函数的返回值。
匿名函数用法
如需打印出 6 的平方:
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]。
def square(x):
print(x**2)
print(map(square, [1, 2, 3, 4, 5]))
# 结果
<map object at 0x00000000026D8BE0>
在 Python3 中,map 函数的结果返回是一个迭代器,在 Python2 中返回的是一个列表,有 Python2 环境可以试试,Python3 需要把迭代器打印出来的话就赋予它类型即可。比如让它还是以列表形式显示。
def square(x):
print(x**2)
print(list(map(square, [1, 2, 3, 4, 5])))
# 结果:
1
4
9
16
25
现在我们用匿名函数替换掉 square 函数。
print(list(map(lambda x: x**2, [1, 2, 3, 4, 5])))
# 结果:
[1, 4, 9, 16, 25]
是不是代码更简洁了。
灵活运用
其实有些情况也不是非匿名函数不可,之前讲到的列表生成有时候也可以取代它,同样用上面的例子:
print([x**2 for x in range(1,6)])
# 结果:
[1, 4, 9, 16, 25]
更简洁!所以学知识我们要灵活运用。什么时候使用 lambda,什么时候不用,需要具体情况具体分析,只要表达的意图清晰就好。一般情况下,如果 for..in..if 能做的,我都不会选择 lambda。
sorted 函数语法
sorted(iterable[, cmp[, key[, reverse]]])
iterable -- 可迭代对象。
cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
举例:结合匿名函数对下面数据按照名字降序排序
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}]
好了,今天匿名函数的知识就分享到这里。
接下来希望帮忙参加个投票环节。现在公众号分享的原创文章有 40 多篇了,其中实战项目的文章居多,分析基础知识文章较少。接下来投票大家选出你感兴趣的版块,我会根据投票结果进行微调,感谢大家的参与。
请大家帮忙投下票,投出你感兴趣的文章类型,谢谢!
推荐阅读
以梦为马,不负韶华