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后面

发布了150 篇原创文章 · 获赞 371 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/PY0312/article/details/103185642
今日推荐