【python】lambda表达式与排序

2022-11-19 15:50:35 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

lambda表达式

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

文章目录

  • lambda表达式
    • 1. 什么是lambda表达式
    • 2. lambda表达式语法
    • 3. lambda表达式的主要用途
      • 3.1 list.sort()函数
      • 3.2 自定义属性排序
      • 3.3 常见的小问题
      • 3.4 二维列表的排序

1. 什么是lambda表达式

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

代码语言:javascript复制
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中的函数是一种对象,如下:

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

输入: 10 输出: 圆的面积为:314.00

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

代码语言:javascript复制
radius = float(input())
f = lambda radius: 3.14 * radius ** 2
print(f'圆的面积为:{f(radius):.2f}')

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

2. lambda表达式语法

以我们求面积的函数为例

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

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

代码语言:javascript复制
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 自定义属性排序

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

代码语言:javascript复制
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会自动把元素送到我们指定的函数中去
代码语言:javascript复制
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函数
代码语言:javascript复制
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 二维列表的排序

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

​ 姓名,年龄,工资

代码语言:javascript复制
list = [['zhangsan', 30, 32000], 
       	['lisi', 25, 15000],
       	['wangwu', 28, 20000],
       	['zhaoliu', 21, 7000]]

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

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

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

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

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

代码语言:javascript复制
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表达式

代码语言:javascript复制
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]]

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

代码语言:javascript复制
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]]

? 对工资进行排序

代码语言:javascript复制
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

0 人点赞