【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)
blank

相关推荐

  • MacBook navicat15 激活码【2022.01最新】2022.02.25

    (MacBook navicat15 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • 手把手教你用idea搭建ssm项目并实现简单demo(超详细)

    手把手教你用idea搭建ssm项目并实现简单demo(超详细)闲暇之余,想搭建一个ssm项目玩玩,结果发现,不百度根本打不出来,搭建出来也有一堆问题,所以在此一步一步记录一下。使用idea搭建ssm项目,首先就是将整个框架整起来如果已经在项目中了,点击左上角file->new->project(刚打开idea是新建->project)[image1]左侧栏目选择maven并勾选createfromarchetype,然后在下面找到org.apache.maven.archetype:maven-archetype-weba

  • pycharm conda 虚拟环境_yum源配置本地镜像

    pycharm conda 虚拟环境_yum源配置本地镜像开始使用Pycharm,搭配Conda做包管理,按照网上教程使用过程中发现镜像源不管是阿里的还是清华的都会有404异常,花了点时间找到正确的配置方式。记录一下备忘。参考链接:https://blog.csdn.net/weixin_42425256/article/details/105099769https://blog.csdn.net/weixin_39918690/article/details/110606097https://www.cnblogs.com/tianlang25/.

  • Centos 7安装nginx并配置https[通俗易懂]

    Centos 7安装nginx并配置https[通俗易懂]1.更新yum源yumupdate2.安装nginx的依赖环境yuminstall-ygcc-c++pcrepcre-develzlibzlib-developensslopenssl-develgcc-c++:安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境。pcrepcre-devel:PCRE(PerlCompatible…

  • webstorm激活码最新2021(JetBrains全家桶)

    (webstorm激活码最新2021)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~7…

  • jsonignore注解(jsonignore根据条件生效)

    当要将list作为一个json传到前端时有可能会出现死循环。处理方法:在实体类中对不需要的属性加上@JsonIgnore

发表回复

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

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