lambda 表达式 之 高级应用案例详解

一、导读

本文着重讲解对 lambda 返回多个表达式的运用,如lambda x: (x < 0, abs(x))

好文章 记得收藏+点赞+关注额 !!!

---- Nick.Peng


二、lambda 应用案例

a_list = [-11, 14, 5, -15, -2, 11, 15, -3, 10, -5]

# 正数负数分开排序
sort_result = sorted(a_list, key=lambda x: (x < 0, abs(x)))

print(sort_result)

# 上面程序运行的结果:
[5, 10, 11, 14, 15, -2, -3, -5, -11, -15]

在案例中这一句lambda x: (x < 0, abs(x)),其实就是 python 里面的 lambda 表达式。

三、lambda 表达式分解

lambda 表达式:
lambda x: (x < 0, abs(x))
相当于函数:
def fun(x):
  return (x < 0, abs(x))
说明:
  这个函数其实返回的是一个元组


四、sorted 高阶函数运用

  • 作用:
    sorted() 函数对所有可迭代的对象进行排序操作。
    sort 与 sorted 区别:

    • sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
    • list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
  • 语法:
    sorted(iterable, cmp=None, key=None, reverse=False)

  • 参数说明:

    • iterable 可迭代对象。
    • cmp 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
    • key 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    • reverse 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
    • 返回值 返回重新排序的列表。

案例解析:

  • 上面案例里,其实就是根据 lambda 表达式的返回值,再决定每个元素的大小,即元组和元组比较大小;

  • 类似于 (True, 1) 和 (True, 2) 元组比较大小,默认小的排前面,大的排后面

    那么问题来了,元组在 sorted 里是怎么比较大小呢?,我们继续往下看。

五、元组如何比较大小?

元组比较大小,其实是比较元组中对应元素的大小,比如:x=(a1, a2, a3)y=(b1, b2, b3),方法如下:

  • 先比较 a1 和 b1 的大小,如果 a1 > b1, 那么 x > y;
  • 如果 a1 < b1,那么 x < y;
  • 如果 a1 == a2, 那么继续比较第二个元素大小,元组的大小由第二个元素大小决定,
  • 如果第二个元素也相等,那么比较第三个元素大小,依次类推。。。

六、本案例排序规则分析

排序规则:lambda x: (x < 0, abs(x))

规则分析:

  • a. 所有的正数排前面,所有的负数排后面
  • b. 如果两个数正负数类型相同,那么按两个数的绝对值大小比较,绝对值小的排前面,绝对值大的排后面

举例说明:

  • 比如 5 和 -5 比较大小
    其实就是比较 (5<0, abs(5))(-5<0, abs(-5)) 这两个元组的大小

  • (5<0, abs(5)) ==> (False, 5)
    (-5<0, abs(-5)) ==> (True, 5)

  • 所以相当于
    (False, 5)(True, 5) 比较大小

结论:
(False, 5) 是小于 (True, 5) 的,所以排序的时候 5前面-5后面

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lambda表达式是一种匿名函数,它可以在代码中直接定义函数而无需为其命名。Lambda表达式的语法简洁,可以用来编写高级的函数式编程代码。以下是Lambda表达式的一些高级用法: 1. 排序:可以使用Lambda表达式作为排序函数的参数。例如,可以使用Lambda表达式对列表中的元素进行按照某个属性进行排序: ``` numbers = [5, 2, 7, 1, 9] sorted_numbers = sorted(numbers, key=lambda x: x) ``` 在这个例子中,Lambda表达式`lambda x: x`指定了按照元素本身的值进行排序。 2. 过滤:可以使用Lambda表达式作为过滤函数的参数。例如,可以使用Lambda表达式筛选出列表中满足某个条件的元素: ``` numbers = [5, 2, 7, 1, 9] filtered_numbers = list(filter(lambda x: x > 5, numbers)) ``` 在这个例子中,Lambda表达式`lambda x: x > 5`指定了筛选出大于5的元素。 3. 映射:可以使用Lambda表达式作为映射函数的参数。例如,可以使用Lambda表达式对列表中的每个元素进行某种操作: ``` numbers = [5, 2, 7, 1, 9] mapped_numbers = list(map(lambda x: x * 2, numbers)) ``` 在这个例子中,Lambda表达式`lambda x: x * 2`指定了将每个元素乘以2。 4. 函数作为参数:Lambda表达式可以作为函数的参数,实现函数的动态调用。例如,可以使用Lambda表达式定义一个函数,然后将其作为参数递给其他函数: ``` def apply_operation(x, operation): return operation(x) result = apply_operation(5, lambda x: x * 2) ``` 在这个例子中,Lambda表达式`lambda x: x * 2`定义了一个将输入值乘以2的函数,并将其作为参数递给`apply_operation`函数。 Lambda表达式高级用法不止于此,可以根据具体的需求使用Lambda表达式编写更加复杂的函数式代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值