匿名函数
介绍— “快乐很简单,就是春天的鲜花,夏天的绿荫,秋天的野果,冬天的漫天飞雪”
在 Python 中,匿名函数是一种特殊类型的函数,也被称为 lambda 函数 。它没有函数名,在用于编写简单的函数或在需要函数作为参数的情况下创建。
匿名函数的特点是简洁、一次性使用,如果你想在某个地方使用一个函数来完成某个功能,但是这个功能只会使用一次,不会像其他函数一样重复调用,那么这个时候匿名函数就是一个非常好的选择,可以使我们的代码看着更加简洁清爽。
匿名函数不需要使用 def 关键字进行定义,而是使用 lambda 关键字来创建函数对象。语法形式如下所示:
lambda
参数 : 参数表达式其中,冒号前面的部分是我们要传入的参数,可以有零个或多个,冒号后面的部分是要返回的的值对应的表达式,也就是函数的执行逻辑。让我们通过几个简单的示例来帮助理解:
【示例】创建一个函数,计算两个值的和
我们用常规方式是这么解决的:
# 使用 def 关键字定义求和函数
def
add_function
(x,y):return
x + yadd_function
(1
,2
)使用常规方式创建函数需要使用 def 关键词定义一个函数名并传入参数。
再来看一下使用匿名函数的创建方法:
# 使用 匿名函数创建函数,并将函数赋予给一个变量
lambda
x,y : x + y1
,2
)由于匿名函数没有函数名,因此无法直接调用匿名函数。我们通常会将匿名函数赋值给一个变量,以便后续使用。上面的例子中,我创建了一个匿名函数并将其赋值给了 my_function 变量,在后面调用这个变量作为函数来使用。
匿名函数的应用
除了上面提到的快速创建函数的方法外,匿名函数在 Python 中应该非常广泛,比如作为参数传递给其他函数、数据转换等。
其中,匿名函数 作为函数的参数使用 是匿名函数常见的应用场景之一。
一些内置函数需要传入一个函数作为参数来完成某些特定的指令,被传入的函数通常都是匿名函数,下面是一些常见的内置函数:
名称 | 描述 |
---|---|
map 函数 | 用于对数据对象或者数据结构按照指定的规则进行批量操作。 |
filter 函数 | 用于对数据对象或者结构按照指定规则进行筛选。 |
sorted 函数 | 用于对数据对象或者结构按照指定的规则进行排序。 |
下面让我们结合一些实例对上面提到的内置函数进行学习:
-
map 函数
map 函数的作用是 对数据结构中的每一个元素进行批量操作,生成一个可迭代对象。
map 函数的第一个参数需要传入一个函数对象,这个函数对象可以是普通函数,也可以是匿名函数,第二个参数是待处理的对象。
具体结构如下:
map
(函数,待处理对象)一般情况下 map 使用匿名函数更为频繁,因为往往使用 map 函数都是对数据结构进行一次性操作,没有必要单独创建一个函数占用代码行数,来看一个案例:
【示例】对一个列表中所有的元素结尾加上 “正在学习” 这个词
# 先创建一个待处理的列表
my_list = ['牧旗'
,'小明'
,'小红'
,'小亮'
]# 使用 map 函数对列表中的每一个元素做相同的处理
my_iterate =map
(lambda
x : x +'正在学习'
, my_list)# map 函数的处理结果是可迭代对象,使用 list 函数转化为列表
my_result =list
(my_iterate)# 输出结果
print
(my_result)运行上面的代码,结果如下:
['牧旗正在学习', '小明正在学习', '小红正在学习', '小亮正在学习']
当然,map 函数允许在后面同时传入多个待处理的对象,这样就需要在函数中传入数量对应的参数,来看示例方便理解:
【示例】计算三个列表对应位置的元素乘积
# 先创建三个待处理的列表
my_list1 = [1
,2
,3
]my_list2 = [4
,5
,6
]my_list3 = [7
,8
,9
]# 使用 map 函数对三个列表做相乘处理
my_iterate =map
(lambda
x,y,z : x * y * z, my_list1,my_list2,my_list3)# map 函数的处理结果是可迭代对象,使用 list 函数转化为列表
my_result =list
(my_iterate)# 输出结果
print
(my_result)运行上面的代码,结果如下:
[28, 80, 162]
上面的代码中,我对 map 函数一共传入了四个参数,第一个是匿名函数,剩下三个分别是三个列表,也就是待处理的对象一共有三个,在匿名函数中也对应着 x、y、z 三个参数,保持前后一致,这样程序就不会运行报错。
-
filter 函数
filter 函数的作用是 对数据结构中的元素按照条件进行过滤,返回满足条件的元素,生成一个可迭代对象。filter 函数和 map 函数的结构一样,第一个参数需要传入一个函数对象,第二个参数是待处理的对象。
要注意的是,filter 函数里 传入的第一个函数参数结果应该是布尔值。
具体结构如下:
filter
(函数,待处理对象)【示例】筛选出列表中长度是 4 的文本内容。
# 先创建一个待处理的列表
my_list = ['牧旗教程'
,'专业'
,'易理解'
,'面向新手'
,'通俗易懂'
,'详细'
]# 使用 filter 函数判断符合条件的元素
my_iterate =filter
(lambda
x : len(x) ==4
, my_list)# map 函数的处理结果是可迭代对象,使用 list 函数转化为列表
my_result =list
(my_iterate)# 输出结果
print
(my_result)运行上面的代码,结果如下,可见其中长度为 4 的元素都被输出出来:
['牧旗教程', '面向新手', '通俗易懂']
【示例】找出列表中以 “明天” 开头并且总字数大于等于 6 的词汇
# 定义待处理的列表
my_list = ['明天会下雨'
,'今天下雨了'
,'明天是个晴天'
,'昨天也是个晴天'
,'明天天气晴朗'
,'两天后天气很好'
,'后天会阴天'
,'明天将会是阴天'
]# 使用 filter 函数判断符合条件的元素
my_iterate =filter
(lambda
x : x[:2
] =='明天'
and
len
(x) >=6
, my_list)# filter 函数的处理结果是可迭代对象,使用 list 函数转化为列表
my_result =list
(my_iterate)# 输出结果
print
(my_result)运行上面的代码,结果如下:
['明天是个晴天', '明天天气晴朗', '明天将会是阴天']
-
sorted 函数
sorted 函数的作用是 对数据结构中的元素按照条件进行排序,生成一个可迭代对象。具体的排序逻辑可以指定,或者根据自己的需求传入函数参数。
要注意的是,sorted 函数里 传入的第一个参数是待处理对象。
函数的具体结构如下:
sorted
(待处理对象 ,key
= 函数(选填),reverse
=False
)其中,key 参数通过传入一个函数用来指定排序的规则,可以选择不填写; reverse 参数是用来进行顺序选择, False 是升序排序(默认),True 是降序排序。
来看一个案例:
【示例】将一个列表中的字典元素,按照年龄进行从高到低排序
# 定义待处理的字典列表
my_list = [{'name'
:'小明'
,'age'
:20
,'爱好'
:'登山'
},{'name'
:'小亮'
,'age'
:18
,'爱好'
:'游泳'
},{'name'
:'李雷'
,'age'
:24
,'爱好'
:'越野'
},{'name'
:'小红'
,'age'
:19
,'爱好'
:'唱歌'
}]# 使用 sorted 函数结合匿名函数对列表排序
my_result =sorted
(my_list,key
=lambda
x:x['age'
],reverse
=True
)# 输出结果
print
(my_result)运行上面的代码,结果如下:
[{'name': '李雷', 'age': 24, '爱好': '越野'},
{'name': '小明', 'age': 20, '爱好': '登山'},
{'name': '小红', 'age': 19, '爱好': '唱歌'},
{'name': '小亮', 'age': 18, '爱好': '游泳'}]在上面的示例中,我们定义了一个匿名函数,对列表中的每一个元素做相同的处理,都是提取了 age 键的值,函数的返回值就是 age 的值,所以 sorted 函数就会按照这个值进行排序。
【示例】将一个列表中的单词,按照元音(aeiou)出现次数进行从低到高排序
# 定义待处理的字典列表
my_list = ['apple'
,'banana'
,'orange'
,'mango'
,'pear'
,'watermelon'
]# 对字符串里的每个字母循环,只要是出现在aeiou中的就记为1次,然后用sum求和
result =sorted
(my_list,key
=lambda
x:sum
(1
for
iin
xif
iin
'aeiou'
))# 输出结果
print
(result)运行上面的代码,结果如下:
['apple', 'mango', 'pear', 'banana', 'orange', 'watermelon']
关注公众号【牧旗教程】,回复“更多例题”,获取更多题型进行训练~
您的打赏将帮助维护网站服务器的正常运营,并为作者的后续更新提供更多的动力。
Copyright © 2013-2023 Muqi Course. All Rights Reserved. 牧旗教程 版权所有 京ICP备2023029281号