匿名函数(lambda)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

匿名函数是指没有名字的函数,应用在需要一个函数,但是又不想费神去命名这个函数的场合。通常情况下,这样的函数只使用一次。在Python中,使用lambda表达式创建匿名函数,其语法格式如下:

result = lambda [arg1 [,arg2,......,argn]]:expression

参数说明:

l result:用于调用lambda表达式。

l [arg1 [,arg2,......,argn]]:可选参数,用于指定要传递的参数列表,多个参数间使用逗号","分隔。

l expression:必选参数,用于指定一个实现具体功能的表达式。如果有参数,那么在该表达式中将应用这些参数。

注意:使用lambda表达式时,参数可以有多个,用逗号","分隔,但是表达式只能有一个,即只能返回一个值。而且也不能出现其他非表达式语句(如for或while)。

例如,要定义一个计算圆面积的函数,常规的代码如下:

import math # 导入math模块

def circlearea(r): # 计算圆面积的函数

result = math.pi*r*r # 计算圆面积

return result # 返回圆的面积

r = 10 # 半径

print('半径为',r,'的圆面积为:',circlearea(r))

执行上面的代码后,将显示以下内容:

半径为 10 的圆面积为: 314.1592653589793

使用lambda表达式的代码如下:

import math # 导入math模块

r = 10 # 半径

result = lambda r:math.pi*r*r # 计算圆的面积的lambda表达式

print('半径为',r,'的圆面积为:',result(r))

执行上面的代码后,将显示以下内容:

半径为 10 的圆面积为: 314.1592653589793

从上面的示例中可以看出,虽然使用lambda表达式比使用自定义函数的代码减少了一些,但是在使用lambda表达式时,需要定义一个变量,用于调用该lambda表达式,否则将输出类似的结果:

<function <lambda> at 0x0000000002FDD510>

这看似有点画蛇添足。那么lambda表达式具体应该怎么应用?实际上,lambda的首要用途是指定短小的回调函数。下面通过一个具体的实例进行演示。

场景模拟:假设采用爬虫技术获取某商城的秒杀商品信息,并保存在列表中,现需要对这些信息进行排序,排序规则是优先按秒杀金额升序排列,有重复的,再按折扣比例降序排列。

实例06 应用lambda实现对爬取到的秒杀商品信息进行排序

在IDLE中创建一个名称为seckillsort.py的文件,然后在该文件中定义一个保存商品信息的列表,并输出,接下来再使用列表对象的sort()方法对列表进行排序,并且在调用sort()方法时,通过lambda表达式指定排序规则,最后输出排序后的列表,代码如下:

bookinfo = [('不一样的卡梅拉(全套)',22.50,120),('零基础学Android',65.10,89.80),

('摆渡人',23.40,36.00),('福尔摩斯探案全集8册',22.50,128)]

print('爬取到的商品信息:\n',bookinfo,'\n')

bookinfo.sort(key=lambda x:(x[1],x[1]/x[2])) # 按指定规则进行排序

print('排序后的商品信息:\n',bookinfo)

在上面的代码中,元组的第一个元素代表商品名称,第二个元素代表秒杀价格,第三个元素代表原价。例如,"( '不一样的卡梅拉(全套) ',22.50,120)"表示商品名称为"不一样的卡梅拉(全套)",秒杀价格为"22.50"元,原价为"120"元。

运行结果如图16所示。

图16 对爬取到的秒杀商品信息进行排序

相关推荐
天天要nx2 分钟前
D64【python 接口自动化学习】- python基础之数据库
数据库·python
何曾参静谧6 分钟前
「QT」文件类 之 QTextStream 文本流类
开发语言·qt
monkey_meng10 分钟前
【Rust类型驱动开发 Type Driven Development】
开发语言·后端·rust
落落落sss18 分钟前
MQ集群
java·服务器·开发语言·后端·elasticsearch·adb·ruby
精进攻城狮@36 分钟前
Redis(value的数据类型)
数据库·redis
2401_8532757338 分钟前
ArrayList 源码分析
java·开发语言
zyx没烦恼38 分钟前
【STL】set,multiset,map,multimap的介绍以及使用
开发语言·c++
lb363636363638 分钟前
整数储存形式(c基础)
c语言·开发语言
feifeikon41 分钟前
Python Day5 进阶语法(列表表达式/三元/断言/with-as/异常捕获/字符串方法/lambda函数
开发语言·python
爪哇学长42 分钟前
SQL 注入详解:原理、危害与防范措施
xml·java·数据库·sql·oracle