python3中apply函数和lambda函数的使用详解


Posted in Python onFebruary 28, 2022

lambda函数

lambda是什么

大家好,今天给大家带来的是有关于Python里面的lambda表达式详细解析。lambda在Python里面的用处很广,但说实话,我个人认为有关于lambda的讨论不是如何使用的问题,而是该不该用的问题。接下来还是通过大量实例和大家分享我的学习体验,可能最后你也会得出和我一样的结论。

好啦,首先让我们先搞明白基础定义,lambda到底是什么?

Lambda表达了Python中用于创建匿名函数的特殊语法。我们将lambda语法本身称为lambda表达式,从这里得到的函数称之为lambda函数。

其实总结起来,lambda可以理解为一个小的匿名函数,lambda函数可以使用任意数量的参数,但只能有一个表达式。估计有JavaScript ES6经验的朋友们听上去会很亲切,具体函数表达式如下:

模板: lambda argument: manipulate(argument)
参数:argument就是这个匿名函数传入的参数,冒号后面是我们对这个参数的操作方法
让我们参考上面的定义模板和参数, 直接看一个最简单的例子:

add_one = lambda x:x+1       # 1个参数,执行操作为+1
add_nums = lambda x,y:x+y    # 2个参数,执行操作为相加

print(add_one(2))            # 调用add_one
print(add_nums(3,7))         # 调用add_nums

>>>   3 
      10

相比大家已经发现lambda匿名函数的特点了,就是对于较为简单的功能,无需自己def一个了,单行就可以写下,传参和执行方法一气呵成

lambda用法详解

接下来让我们看看lambda的实际应用,就我自己使用lambda的体验来说,从来没有单独用过,lambda一般情况下是和map,filter,reduce这些超棒的内置函数以及dict,list,tuple,set 等数据结构混用,这样才能发挥它的最大效果.

好了,闲话少说,下面让我们一个个来看

lambda + map

首先出场的是lambda+map的组合,先看下面这个例子:

numbers = [1,2,3,4,5]
add_one = list(map(lambda n:n+1,numbers))  #map(fun,sequence)

print(list(add_one))
print(tuple(add_one))

Out: [2, 3, 4, 5, 6]
     (2, 3, 4, 5, 6)

这个是我们上一期的例子,实现一个数组(元组)每个元素+1,让我们回忆一下map的用法map(fun,sequence),fun是传递的方法,sequence是一个可迭代的序列,这里我们的fun就是匿名函数
lambda n:n+1,这里非常完美的解释了lambda的设计初衷,因为如果没有lambda,我们的解决方案是这样:

def add(num):
    return num+1

numbers = [1,2,3,4,5]
add_one = list(map(add,numbers))
print(add_one)
print(tuple(add_one))

显然易见,这里的add方法有点多余,所以用lambda代替是个好的选择。让我们再看下一个例子,这是我自己备份日志时写的一小段代码,命名不是很规范:

from datetime import datetime as dt
logs = ['serverLog','appLog','paymentLog']
format ='_{}.py'.format(dt.now().strftime('%d-%m-%y'))
result =list(map(lambda x:x+format,logs))   # 利用map+lambda 实现字符串拼接
print(result)

Out:['serverLog_11-02-19.py', 'appLog_11-02-19.py', 'paymentLog_11-02-19.py']

这里和刚才的加1例子差不多,但是换成了字符串的拼接,然而我这里用lambda并不是很好的解决方案,最后我们会说,现在大家应该对map + lambda 有一些感觉了,让我们再来个和dict字典互动的例子:

person =[{'name':'Lilei',
          'city':'beijing'},
         {'name':'HanMeiMei',
          'city':'shanghai'}]

names=list(map(lambda x:x['name'],person))
print(names)

Out:['Lilei', 'HanMeiMei']

好了,看到这里对于map+lambda的用法大家已经很清楚了应该~

lambda + filter

lambda和filter的组合也很常见,用于特定筛选条件下,现在让我们来看上篇文章filter的例子,就应该很好理解了:

numbers = [0, 1, 2, -3, 5, -8, 13]

# 提取奇数
result = filter(lambda x: x % 2, numbers)
print("Odd Numbers are :",list(result))

# 提取偶数
result = filter(lambda x: x % 2 == 0, numbers)
print("Even Numbers are :",list(result))

#提取正数
result = filter(lambda x: x>0, numbers)
print("Positive Numbers are :",list(result))

Out:Odd Numbers are : [1, -3, 5, 13]
     Even Numbers are : [0, 2, -8]
     Positive Numbers are : [1, 2, 5, 13]

这里无非就是我们把filter(fun,sequence)里面的fun换成了我们的lambda,只是lambda的函数部分(x%2,x%2==0,x>0)都是可以返回True或者False来判断的,符合fiter的要求,用刚才李雷和韩梅梅的例子也是一个道理:

person =[{'name':'Lilei',
          'city':'beijing'},
         {'name':'HanMeiMei',
          'city':'shanghai'}]

names=list(filter(lambda x:x['name']=='Lilei',person)) # 提取李雷的信息
print(names)

Out:[{'name': 'Lilei', 'city': 'beijing'}]

lambda + reduce

还是让我们看一下上篇文章的例子:

from functools import reduce          # Only Python 3
numbers = [1,2,3,4]
result_multiply = reduce((lambda x, y: x * y), numbers)
result_add = reduce((lambda x,y: x+y), numbers)

print(result_multiply)
print(result_add)

Out:24
     10

这个例子用lambda和reduce的配合实现了list求累积和和累积乘法。
有意思的是这个例子具有两面性,一方面展示了lambda和reduce如何一起使用,另一方面也引出了接下来我想说的重点:lambda真的值得用吗?到底应该怎么用?

避免过度使用lambda

通过上面的例子大家已经看到了lambda的实际应用场景,但是这里我想和大家分享一下我的看法:我认为lambda的缺点略多于优点,应该避免过度使用lambda.

首先,这仅仅是我的个人看法哈,希望大家理解,我为什么这么说呢,首先让我们拿lambda方法和常规def做个对比,我发现lambda和def的主要不同点如下:

  • 可以立即传递(无需变量)
  • 只需一行代码,简洁(未必高效)
  • 可以会自动返回,无需return
  • lambda函数没有函数名称

有关优点大家都可以看到,我主要想说一下它的缺点,首先,从真正需求出发,我们在大多数时候是不需要lambda的,因为总可以找到更好的替代方法,现在我们一起看一下刚才lambda+reduce 的例子,我们用lambada实现的结果如下:

from functools import reduce          # Only Python 3
numbers = [1,2,3,4]
result_multiply = reduce((lambda x, y: x * y), numbers)
result_add = reduce((lambda x,y: x+y), numbers)

这里用lambda并没有实现简单高效的目的,因为我们有现成的sum和mul方法可以用:

from functools import reduce
from operator import mul

numbers = [1,2,3,4]
result_add = sum(numbers)
result_multiply =reduce(mul,numbers)

print(result_add)
print(result_multiply)

Out: 10
     24

结果是一样的,但是显然用sum和mul的方案更加高效。再举个常见的例子说明,假如我们有一个list存储了各种颜色,现在要求把每个颜色首字母大写,如果用lambda写出是这样:

colors = ['red','purple','green','blue']
result = map(lambda c:c.capitalize(),colors)
print(list(result))

Out:['Red', 'Purple', 'Green', 'Blue']
看着似乎不错,挺简洁的,但是我们有更好的方法:


colors = ['red','purple','green','blue']
result = [c.capitalize() for c in colors]
print(result)

Out:['Red', 'Purple', 'Green', 'Blue']
用sorted还能处理首字母不规范的情况,连排序都省了:

colors = ['Red','purple','Green','blue']
print(sorted(colors,key=str.capitalize))

Out:['blue', 'Green', 'purple', 'Red']

还有一个主要原因就是: lambda函数没有函数名称。所以在代码交接,项目移植的场景中会给团队带来很多困难,多写个函数add_one()没什么坏处,因为大家都很容易理解,知道它是执行+1的功能,但是如果团队里你在自己负责的模块使用了很多lambda,会给其他人理解带来很多麻烦

适合lambda的场景

话又说回来,存在即合理,那么真正需要我们使用lambda的是哪些场景呢:

  • 你需要的方法是很简单的(+1,字符串拼接等),该函数不值得拥有一个名字
  • 使用lambda表达式,会比我们能想到的函数名称更容易理解
  • 除了lambda,没有任何python提供的函数可以实现目的
  • 团队中所有成员都掌握lambda,大家同意你用

还有一种场景非常适用,就是在给其他人制造自己很专业的错觉时,比如:

哎呀,小老弟,听说你学了Python,知道lambda不? 没听过?不行啊,白学了!
来来来,让我给你讲讲。。。此处省略1万字

总结

今天为大家九浅一深地讲解了lambda的用法和使用场景,所谓九浅一深,就是90%情况下用于创建简单的匿名函数,10%的情况稍微复杂(我这个借口找的太好了)

总而言之就是,任何事情都具有两面性,我们在使用lambda之前应该先停下来,问问自己是不是真的需要它。

当然,如果需要和别人忽悠的时候都是正反一张嘴,lambda是好是坏全看我们自己怎么说,吹牛时请遵守如下原则,屡试不爽:

如果你说一个女大学生晚上卖淫就是可耻,但如果改成一个妓女利用业余时间努力学习就励志多了!

lambda也是如此

apply函数

Python中apply函数的格式为:apply(func,*args,**kwargs)

当然,func可以是匿名函数。

用途:当一个函数的参数存在于一个元组或者一个字典中时,用来间接的调用这个函数,并将元组或者字典中的参数按照顺序传递给参数

解析:args是一个包含按照函数所需参数传递的位置参数的一个元组,简单来说,假如A函数的函数位置为 A(a=1,b=2),那么这个元组中就必须严格按照这个参数的位置顺序进行传递(a=3,b=4),而不能是(b=4,a=3)这样的顺序。kwargs是一个包含关键字参数的字典,而其中args如果不传递,kwargs需要传递,则必须在args的位置留空。

apply的返回值就是函数func函数的返回值。

⭐举例

def function(a,b):  
    print(a,b)  
apply(function,('good','better'))  
apply(function,(2,3+6))  
apply(function,('cai','quan'))  
apply(function,('cai',),{'b':'caiquan'})  
apply(function,(),{'a':'caiquan','b':'Tom'})

输出结果:

('good', 'better')
(2, 9)
('cai', 'quan')
('cai', 'caiquan')
('caiquan', 'Tom')

对数据进行预处理时,大家使用比较多的是apply函数,apply函数是pandas库中的函数,非常好用的一个函数相当于循环遍历,起到对每一条数据进行处理的效果,函数的参数可能是DataFrame中的行或者列。

说到apply又不得不说lambda函数了,这两个结合来用简直爽的不行。

lambda关键字可以用来创建一个小的匿名函数

示例:

DataFrame.apply(func, axis=0, broadcast=False, raw=False,
                 reduce=None, args=(), *kwds)

第一个参数func是一个函数,需要自己实现,可以使用lambda匿名函数,axis默认值为0,axis为0时,会把一列的数据进行遍历。

data[‘cut_review'].apply(lambda x: [i for i in x s if i not in stopwords])

⭐下面的例子是DataFrame中apply的用法

#函数应用和映射
import numpy as np
import pandas as pd
df=pd.DataFrame(np.random.randn(4,3),columns=list('bde'),index=['utah','ohio','texas','oregon'])
print(df)
"""
               b         d         e
utah   -0.667969  1.974801  0.738890
ohio   -0.896774 -0.790914  0.474183
texas   0.043476  0.890176 -0.662676
oregon  0.701109 -2.238288 -0.154442
"""

#将函数应用到由各列或行形成的一维数组上。DataFrame的apply方法可以实现此功能
f=lambda x:x.max()-x.min()
#默认情况下会以列为单位,分别对列应用函数
t1=df.apply(f)
print(t1)
t2=df.apply(f,axis=1)
print(t2)

"""
b    1.597883
d    4.213089
e    1.401566
dtype: float64
utah      2.642770
ohio      1.370957
texas     1.552852
oregon    2.939397
dtype: float64
"""

#除标量外,传递给apply的函数还可以返回由多个值组成的Series
def f(x):
    return pd.Series([x.min(),x.max()],index=['min','max'])
t3=df.apply(f)
#从运行的结果可以看出,按列调用的顺序,调用函数运行的结果在右边依次追加
print(t3)

"""
            b         d         e
min -0.896774 -2.238288 -0.662676
max  0.701109  1.974801  0.738890
"""

#元素级的python函数,将函数应用到每一个元素
#将DataFrame中的各个浮点值保留两位小数
f=lambda x: '%.2f'%x
t3=df.applymap(f)
print(t3)
"""
            b      d      e
utah    -0.67   1.97   0.74
ohio    -0.90  -0.79   0.47
texas    0.04   0.89  -0.66
oregon   0.70  -2.24  -0.15
"""

#注意,之所以这里用map,是因为Series有一个元素级函数的map方法。而dataframe只有applymap。
t4=df['e'].map(f)
print(t4)

"""
utah     0.74
ohio     0.47
texas   -0.66
oregon  -0.15
"""

 到此这篇关于python3中apply函数和lambda函数的使用详解的文章就介绍到这了,更多相关python3 apply函数和lambda函数内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
分析在Python中何种情况下需要使用断言
Apr 01 Python
使用Python编写基于DHT协议的BT资源爬虫
Mar 19 Python
Python 数据处理库 pandas 入门教程基本操作
Apr 19 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
Python编程图形库之Pillow使用方法讲解
Dec 28 Python
解决django中ModelForm多表单组合的问题
Jul 18 Python
Django 全局的static和templates的使用详解
Jul 19 Python
python 自定义装饰器实例详解
Jul 20 Python
python 数据库查询返回list或tuple实例
May 15 Python
使用pytorch实现论文中的unet网络
Jun 24 Python
Python Map 函数的使用
Aug 28 Python
python-for x in range的用法(注意要点、细节)
May 10 Python
你需要掌握的20个Python常用技巧
Feb 28 #Python
python opencv将多个图放在一个窗口的实例详解
pandas中关于apply+lambda的应用
Feb 28 #Python
Python中的datetime包与time包包和模块详情
Feb 28 #Python
Python 数据可视化神器Pyecharts绘制图像练习
Python使用OpenCV实现虚拟缩放效果
python保存图片的四个常用方法
You might like
星际争霸中的对战模式介绍
2020/03/04 星际争霸
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
php字符串按照单词进行反转的方法
2015/03/14 PHP
php实现图片等比例缩放代码
2015/07/23 PHP
js查找父节点的简单方法
2008/06/28 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
从数组中随机取x条不重复数据的JS代码
2013/12/24 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
2015/03/31 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
2015/04/07 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
2016/03/08 Javascript
理解javascript对象继承
2016/04/17 Javascript
详解jQuery简单的表单应用
2016/12/16 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
nodejs取得当前执行路径的方法
2018/05/13 NodeJs
MVVM 双向绑定的实现代码
2018/06/21 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
Postman内建变量常用方法实例解析
2020/07/28 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
[37:47]IG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python批量生成本地ip地址的方法
2015/03/23 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
python 实现的车牌识别项目
2021/01/25 Python
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
机械设计制造专业个人求职信
2013/09/25 职场文书
银行学习十八大感想
2014/01/11 职场文书
养殖项目策划书范文
2014/01/13 职场文书
保护环境的建议书
2014/03/12 职场文书
大班下学期个人总结
2015/02/13 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
详解Python内置模块Collections
2022/03/22 Python