零基础学Python之匿名函数

点击上方"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 多篇了,其中实战项目的文章居多,分析基础知识文章较少。接下来投票大家选出你感兴趣的版块,我会根据投票结果进行微调,感谢大家的参与。

请大家帮忙投下票,投出你感兴趣的文章类型,谢谢!

推荐阅读

Python优雅写法,让你工作效率翻2倍

利用亚运会,读懂 Python装饰器

以梦为马,不负韶华

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值