【python】lambda表达式与排序

【python】lambda表达式与排序lambda表达式简单易用的匿名函数文章目录lambda表达式1.什么是lambda表达式2.lambda表达式语法3.lambda表达式的主要用途3.1list.sort()函数3.2自定义属性排序3.3常见的小问题3.4二维列表的排序1.什么是lambda表达式在学习lambda表达式之前,我们先写一个求圆的面积的函数defget_area(radius):return3.14*radius**2radius=float(input())pri

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

lambda表达式

❤️简单易用的匿名函数❤️

在这里插入图片描述

1. 什么是lambda表达式

在学习lambda表达式之前,我们先写一个求圆的面积的函数

def get_area(radius):
    return 3.14 * radius ** 2

radius = float(input())
print(f'圆的面积为:{get_area(radius):.2f}')

输入:

10

输出:

圆的面积为:314.00

那么lambda表达式和上面的一句话的函数有什么关系呢?

其实lambda表达式本质上就是函数体只有一句话的匿名函数, 我们完全可以使用lambda表达式去代替上面那个计算面积的函数,python中的函数是一种对象,如下:

def get_area(radius):
    return 3.14 * radius ** 2
#函数是对象,通过赋值可以更改函数名
f = get_area
radius = float(input())
print(f'圆的面积为:{f(radius):.2f}')

输入:

10

输出:

圆的面积为:314.00

现在我们使用lambda表达式代替求面积的函数

radius = float(input())
f = lambda radius: 3.14 * radius ** 2
print(f'圆的面积为:{f(radius):.2f}')

这种方式完全等价于第一种方式

2. lambda表达式语法

以我们求面积的函数为例

在这里插入图片描述

lambda表达式和普通函数之间的主要区别之一在于lambda表达式没有函数名,所以lambda表达式被称之为匿名函数

当我们需要传入两个参数的时候,比如计算两个数字的和:

a, b = map(int, input().split())
f = lambda a, b: a + b
print(f(a, b))

输入:

1 2

输出:

3

3. lambda表达式的主要用途

lambda的主要用途在可迭代对象的排序上,比如列表自带的sort()函数,对key值进行指定

首先我们先介绍列表的sort()函数

3.1 list.sort()函数

  • 函数原型:list.sort(key = None, reverse = False)

  • 参数解析:

    key参数(元素的属性)按照属性进行排序:

    一般来说格式为 key = 函数名,这个函数在我们编写的时候只存在一个参数,这个参数取自列表中

key参数默认为元素的默认属性

  • 数字默认属性:数字的默认属性就是数字的大小
  • 字符串或者汉字:默认属性是unicode的编码大小

那么,很明显,字符串的属性肯定不止unicode编码那么一样,比如字符串的长度等等…

reverse参数(正序还是逆序):

reverse = True 降序排序,reverse = False 升序排序,默认升序排序

3.2 自定义属性排序

? 首先我们来看一下字符串使用默认的排序

list = ['Apple', 'Grape', 'Orange', 'Pear', 'Cheery', 'Bluebrrey', 'Dew']
print('排序前:')
list.sort()
print('排序后:')
print(list)

排序前:
[‘Apple’, ‘Grape’, ‘Orange’, ‘Pear’, ‘Cheery’, ‘Bluebrrey’, ‘Dew’]
排序后:
[‘Apple’, ‘Bluebrrey’, ‘Cheery’, ‘Dew’, ‘Grape’, ‘Orange’, ‘Pear’]

看不出来有任何规律,因为是按照字符串的Unicode编码进行排序的,如果你把字符串全部替换成编码,肯定是有大小关系在其中的


? ​下面我们尝试通过把key改成字符串的长度属性对字符串进行排序

  • 主要步骤就是编写一个函数,函数的参数为列表的元素

  • 然后让key = 函数名就可以进行排序

  • python会自动把元素送到我们指定的函数中去

def strlen(s):
    return len(s)
list = ['Apple', 'Grape', 'Orange', 'Pear', 'Cheery', 'Bluebrrey', 'Dew']
print('排序前:')
print(list)
print('按照长度升序排序:')
list.sort(key=strlen)
print(list)
print('按照长度逆序排序:')
list.sort(key=strlen, reverse=True)
print(list)

输出:

排序前:
[‘Apple’, ‘Grape’, ‘Orange’, ‘Pear’, ‘Cheery’, ‘Bluebrrey’, ‘Dew’]
按照长度升序排序:
[‘Dew’, ‘Pear’, ‘Apple’, ‘Grape’, ‘Orange’, ‘Cheery’, ‘Bluebrrey’]
按照长度逆序排序:
[‘Bluebrrey’, ‘Orange’, ‘Cheery’, ‘Apple’, ‘Grape’, ‘Pear’, ‘Dew’]


? 现在我们发现​其实编写的strlen函数就是一个一条语句的函数,我们可以使用lambda表达式代替这个函数

  • 用lambda函数代替strlen函数
list = ['Apple', 'Grape', 'Orange', 'Pear', 'Cheery', 'Bluebrrey', 'Dew']
print('排序前:')
print(list)
print('按照长度升序排序:')
list.sort(key=lambda ele: len(ele))
print('按照长度逆序排序:')
list.sort(key=lambda ele: len(ele), reverse=True)

输出:

排序前:
[‘Apple’, ‘Grape’, ‘Orange’, ‘Pear’, ‘Cheery’, ‘Bluebrrey’, ‘Dew’]
按照长度升序排序:
[‘Dew’, ‘Pear’, ‘Apple’, ‘Grape’, ‘Orange’, ‘Cheery’, ‘Bluebrrey’]
按照长度逆序排序:
[‘Bluebrrey’, ‘Orange’, ‘Cheery’, ‘Apple’, ‘Grape’, ‘Pear’, ‘Dew’]


3.3 常见的小问题

这里我们完成了使用lambda表达式进行自定义属性的排序,可能会有一些小问题(不会告诉你是我踩过的)

  • 当我们编写一个函数的时候,排序是key应该改成 key = 函数名 而不是 key = 函数名(参数)

  • 在写lambda表达式的时候纠结,key = lambda ele: len(ele),使用函数的时候我们格式为key = 函数名,而不是key = 函数名(参数),那写lambda表达式的时候应该为lambda: len(ele)才对啊。

    其实这里的ele只是一个形参而已,这个形参取自列表中的元素,而函数我们在编写单个函数的时候就在函数定义部分就有参数,所以lambda表达式在编写的时候我们也需要一个形参


3.4 二维列表的排序

比如我们有规则的二维列表如下:

​ 姓名,年龄,工资

list = [['zhangsan', 30, 32000], 
       	['lisi', 25, 15000],
       	['wangwu', 28, 20000],
       	['zhaoliu', 21, 7000]]

我们需要按照姓名长度,年龄大小,或者工资多少进行排序

需要那个属性,我们就直接选择那个属性就行好了,例如:

  • 需要姓名长度,就选len(ele[0])
  • 需要年龄大小,就选ele[1]
  • 需要工资多少,就选ele[2]

因为ele是这个二维列表中的元素一维列表,按照一维列表的属性将一维列表之间进行排序,那么选择那个属性进行排序我们很自然的就会使用中括号访问列表中的属性了

? 我们还是从编写一个函数开始

def strlen(ele):
    return len(ele[0])
list = [['zhangsan', 30, 32000], 
       	['lisi', 25, 15000],
       	['wangwu', 28, 20000],
       	['zhaoliu', 21, 7000]]
print('排序前:')
print(list)
print('按照姓名长度排序后:')
list.sort(key=strlen)
print(list)

输出:

排序前:
[[‘zhangsan’, 30, 32000], [‘lisi’, 25, 15000], [‘wangwu’, 28, 20000], [‘zhaoliu’, 21, 7000]]
按照姓名长度排序后:
[[‘lisi’, 25, 15000], [‘wangwu’, 28, 20000], [‘zhaoliu’, 21, 7000], [‘zhangsan’, 30, 32000]]

? 现在把函数替换成lambda表达式

list = [['zhangsan', 30, 32000], 
       	['lisi', 25, 15000],
       	['wangwu', 28, 20000],
       	['zhaoliu', 21, 7000]]
print('排序前:')
print(list)
print('按照姓名长度排序后:')
list.sort(key=lambda ele: len(ele[0]))
print(list)

输出:

排序前:
[[‘zhangsan’, 30, 32000], [‘lisi’, 25, 15000], [‘wangwu’, 28, 20000], [‘zhaoliu’, 21, 7000]]
按照姓名长度排序后:
[[‘lisi’, 25, 15000], [‘wangwu’, 28, 20000], [‘zhaoliu’, 21, 7000], [‘zhangsan’, 30, 32000]]


? 现在我们使用年龄进行排序

list = [['zhangsan', 30, 32000], 
       	['lisi', 25, 15000],
       	['wangwu', 28, 20000],
       	['zhaoliu', 21, 7000]]
print('排序前:')
print(list)
print('按照年龄大小排序后:')
# 选择年龄属性
list.sort(key=lambda ele: ele[1])
print(list)

输出:

排序前:
[[‘zhangsan’, 30, 32000], [‘lisi’, 25, 15000], [‘wangwu’, 28, 20000], [‘zhaoliu’, 21, 7000]]
按照年龄大小排序后:
[[‘zhaoliu’, 21, 7000], [‘lisi’, 25, 15000], [‘wangwu’, 28, 20000], [‘zhangsan’, 30, 32000]]


? 对工资进行排序

list = [['zhangsan', 30, 32000], 
       	['lisi', 25, 15000],
       	['wangwu', 28, 20000],
       	['zhaoliu', 21, 7000]]
print('排序前:')
print(list)
print('按照年龄大小排序后:')
# 选择年龄属性
list.sort(key=lambda ele: ele[2])
print(list)

输出:

排序前:
[[‘zhangsan’, 30, 32000], [‘lisi’, 25, 15000], [‘wangwu’, 28, 20000], [‘zhaoliu’, 21, 7000]]
按照年龄大小排序后:
[[‘zhaoliu’, 21, 7000], [‘lisi’, 25, 15000], [‘wangwu’, 28, 20000], [‘zhangsan’, 30, 32000]]

当然也可以通过编写普通函数的方法进行排序,可以自己动手尝试一下。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/180926.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • es6数组方法图解

    es6数组方法图解最近接触了一些web前端开发人员,发现还是很多人不适用es6提供的语义化api。下面分享下看到的图解es6数组方法。很形象的es6数组方法解释:

  • 大数据风控模型是什么?有哪些?

    大数据风控模型是什么?有哪些?摘要:在互联网金融行业,不少人可能这样觉得:认为只要数据够“大”,就能有最牛逼的风控体系和行业最低的坏账率。在互联网金融行业,不少人可能这样觉得:认为只要数据够“大”,就能有最牛逼的风控体系和行业最低的坏账率。这种理解有些过于简单了。其实,做大数据风控是一个挺细致的事儿,大数据风控,重要的不是数据本身,而是对数据的理解。类似的话,哈佛大学的GaryKing教授也说过,…

  • APP 抓包和微信小程序抓包-Charles 的精简使用教程

    APP 抓包和微信小程序抓包-Charles 的精简使用教程APP抓包和微信小程序抓包-Charles的精简使用教程目标教程一、安装Charles二、Charles简介(1)Charles欢迎页面(2)基础功能按钮(3)抓包内容显示方式(4)过滤抓包内容三、手机配置Charles代理四、解决配置Charles代理之后手机无法上网的问题五、手机APP抓包(1)对“花生地铁”APP进行抓包。六、微信小程序抓包(1)安装SSL…

  • winzip15.0许可证

    winzip15.0许可证

    2021年12月30日
  • pages enableEventValidation 事件的机制处理

    pages enableEventValidation 事件的机制处理回发或回调参数无效。在配置中使用或在页面中使用<%@PageEnableEventValidation=”true”%>启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用ClientScriptManager.RegisterForEventValidation方法来注册回发或回调数据以…

  • CSDN社区_毒APP公告

    CSDN社区_毒APP公告用户为本,让用户成为CSDN产品的主人,为此,我们特开设了CSDN产品公告栏,切实听取大家对新功能的反馈,定期抽取部分反馈用户赠送精美礼品一份!在过去一周,CSDN研发团队又上线了哪些功能呢?让我一起看下:CSDNAPP发布最新版,新增大厂在线刷题功能CSDN博主排名更新,原创优质博文更容易得到曝光MD编辑器优化操作更便捷更加极客酷炫的博客皮肤3.0上线绑定脉脉即可获得专属勋…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号