【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]]

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

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

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

(0)
上一篇 2022年10月17日 下午5:46
下一篇 2022年10月17日 下午5:46


相关推荐

  • keil5如何生成bin文件_keil4生成bin文件

    keil5如何生成bin文件_keil4生成bin文件 在RealviewMDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件。虽然这两个格式的文件非常有利于ULINK2仿真器的下载和调试,但是ADS的用户更习惯于使用*.bin格式的文件,甚至有些嵌入式软件开发者已经拥有了*.bin格式文件的调试或烧写工具。为了充分地利用现有的工具,同时发挥RealviewMDK集成开发环境的优势,将*.axf格式文件或*.he…

    2022年10月20日
    4
  • vim怎么显示行号_vim型号

    vim怎么显示行号_vim型号1、临时使用  1、进入viorvim编辑环境下,进入命令行模式,然后输入setnumber,就可以显示行号了。如图:      2、输入setnonumber关闭行号      3、通过如上设置只能临时起作用,当你打开另外一个文件时我们的行号又没有了,所以接下来我们去永久配置一下吧。2、永久使用在/etc/vimrc(/etc/virc)文件中修改一下就ok了,在文件末尾加…

    2025年6月13日
    3
  • Linux软件卸载_linux系统怎么卸载一个软件

    Linux软件卸载_linux系统怎么卸载一个软件1.安装说明configure作用:是源码安装软件时配置环境用的他根据你的配置选项和你的系统情况生成makefile文件为make做准备。最常用的参数:./configure–prefix作用:不指定prefix,则可执行文件默认放在/usr/local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc。其它的…

    2025年9月1日
    7
  • seekg()与tellg()用法详解

    seekg()与tellg()用法详解对输入流操作:seekg()与tellg()对输出流操作:seekp()与tellp()下面以输入流函数为例介绍用法:seekg()是对输入文件定位,它有两个参数:第一个参数是偏移量,第二个参数是基地址。对于第一个参数,可以是正负数值,正的表示向后偏移,负的表示向前偏移。而第二个参数可以是:ios::beg:表示输入流的开始位置ios::cur:表示输入流的当前位置ios::end:表示输入流的结束位置tellg()函数不需要带参数,它返回当前定位指针的位置,也代表着输入流的大小。假设

    2022年6月5日
    56
  • uniapp 微信小程序 弹窗 用户授权

    uniapp 微信小程序 弹窗 用户授权效果图 viewclass mask viewclass model box viewclass mb tit 用户协议和隐私政策 viewclass mb content viewclass mb con 尊敬的用户您好 viewclass mb con viewclass mb content viewclass mb tit viewclass model box viewclass mask

    2026年3月18日
    2
  • javascript 带参方法在onclick中如何正确传值

    javascript 带参方法在onclick中如何正确传值1 varoperate function row index varope ahref onclick update row 修改 ahref javascript void 0 删除 returnope 注意点 需要 ahref javascript void 0 ahref onclick update row

    2026年3月16日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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