python之lambda表达式与sort函数中的key用法

这篇文章的重点内容是向大家讲解表达式以及sort函数里面key这个参数的使用方法。它所提供的信息对于大家来说, 具备相当可观的参考程度。

我们真心希望这篇内容能够对各位读者产生实际意义上的帮助作用。要是大家在阅读过程中发现文中存在任何不对之处, 或者考虑到的场景还不够全面, 那么非常恳请这些读者们能够毫不吝啬地给予指导与指正。

表达式, 以及那个在sort函数里面去用的表达式。

表达式, 通常被用来声明匿名函数,也就是那些没有函数名字的、临时使用的小函数,在很多场合下, 当人们临时需要一个类似于函数的功能,但是又不想去定义一个新的函数的时候, 就会经常用到这种写法。

比如在说内置函数的那个圆括号代表的位置的时候, 还有在讨论列表里面那个叫sort的方法时, 会提到一个参数, 这个参数叫key, 再比如讲到内置函数map的那个位置时, 第一个参数是一个什么东西, 以及还有一个内置函数的圆括号代表的地方,第一个参数等等。

另外呢, 也是可以这样做的, 就是通过写一个表达式的方式来定义一个有名字的函数, 这样的情况当然是完全可以使用的。

表达式里面, 只可以包含一个表达式的组成部分, 是不允许去包含那些复杂的语句和结构的。但是在表达式这个范围里, 是可以去调用其他的函数出来的。那么, 这个表达式在完成计算之后的那个结果, 它相当于就是这个函数的返回值。

下面的这段代码用来演示在不同情况下面, 关于表达式的这种应用方式。

简言之:

所谓的表达式, 其实就是函数的一种简化形态, 如果用户所定义的函数本身的逻辑比较简单, 那么直接选择使用这种方式来进行代替便是合理的做法。

brush:py; 复制代码
>>> def func(a,b,c):

return a+b+c

>>> f = lambda a,b,c:a+b+c # 与func函数等价

>>> f(1,2,3) # 输出6

>>> s = lambda a,b=5,c=1:a+b+c # 支持默认参数

>>> s(8) # 输出14

>>> s = "abcde"

>>> tuple(map(lambda x:x.upper(),s)) # lambda 也可以作为函数参数

('A', 'B', 'C', 'D', 'E')

咳咳, 我来把那个叫map的这个东西稍微说一下, 真的就是太给力了。

它有两个参数, 第二个参数是一个可迭代对象, 列表, 元组, 字符串, 集合, 字典啊都是这类的东西, 第一个参数呢一般就是一个功能函数来的, map函数的意思大概就是这样子的了, 是把那个迭代对象里面的每一个元素都传过来给那个功能函数去处理一下的, 以上面那个例子来讲的话呢就是要把整个字符串s里面的每一个小写字母通过那个表达式函数的作用全都转换为大写字母的, 转换好了之后是存放到map这个对象里面的, 如果要去看那个出来的结果的话那得要用list啊或者tuple这些数据类型把它给它强制转化出来看看才行的, 不然的话你是啥都看不到的。

sort函数

最后, 就是经典的, 那个与sort函数进行搭配的。

假设现在存在一个用于存放多层级元素的二维列表, 在这种情况下我们对这个列表进行排序操作, 而排序的具体标准则是以第二维度的各个元素数值的大小为依据来进行。

所以, 他的那种记录或者表达的方式, 应该就是像下面这样的。

brush:py; 复制代码
>>> a = [[1,4],[2,3],[5,1]]

>>> a

\[1, 4\], \[2, 3\], \[5, 1\]

>>> sorted(a,key=lambda x:x1) # 用sorted是不想修改a

\[5, 1, 2, 3, 1, 4] # 可以看到生成了按嵌套列表中第二个元素排序的列表

有的读者和我不很久之前一样, 只是晓得应该这样去写代码, 可是并不清楚它的底层逻辑究竟是怎么回事。所以我专门查阅了一些相关的资料内容。

经过了解发现, 它的常规用法是这样的: 要是你在调用的时候明确了key这个参数, 系统就会先对那个可迭代对象进行一次遍历操作, 从而获取到里面每一个单独元素的key值数据。最后呢, 它是依靠这些具体的key值来执行排序动作的。

这在某种程度上的意思, 就是相当于使用 i 去遍历 a 这个序列中的所有元素, 然后针对每一个拿到的 i 执行相应的操作, 只不过有一点必须注意, 那就是整个处理过程需要被封装到一个函数内部才能运行得当。

假如我们把相关的表达式写成常见函数的具体形式的话, 最终得到的结果就是像这样的一种模样。

86

我们在对sort如何进行排序这件事有了一个大体的了解之后, 那些比较奇怪的做法也是有可能被写出来的, 那么从现在开始我们就去进行尝试。

brush:py; 复制代码
>>> def func(string):   # 定义一个函数

res = len(set(string)) # 首先计算这个单词有多少个字母 如"aaabb"算两个字母

for i in string:

if i.isupper(): # 如果是大写

res *=1.15 * ord(i) # ord表示 i 在 ASCII 对应的值

else:

res*=1.05 * ord(i)

return res

>>> a = "haHASHSADHn IamaHandsomeBoy SLSKJlkjSLSjGHUh iljEILNGLKD".split()

>>> sorted(a,key=func) # 记住不要括号

'haHASHSADHn', 'iljEILNGLKD', 'IamaHandsomeBoy', 'SLSKJlkjSLSjGHUh'

骚写法是能写得出来的, 简单的写法则会变得轻易解决不用费力。当然, 使用表达式这个前提是你对排序的定义要有足够的简单程度, 意思就是按照哪一个字段进行排序的意思。复杂一点的情况的话就要像前面所说的那样去自定义函数了。

下面来看一看, 如何使用对字典以值的方法进行排序。这里需要注意的是, 我们是对值这一项进行排序操作, 而不是对键这一项进行排序操作哦。

47

关于匿名函数表达式, 它在与像sort()、min()、max()、map()以及另外那些括号方法配合使用的时候, 到底具体是个什么概念, 我们需要先来了解一下什么是匿名函数。

匿名函数, 它其实就是没有名字的那种函数。凡是学过编程的人都清楚, 普通函数的定义写法一般是像这样: 用def这个关键字开头, 接着是函数的名称, 再跟一个冒号, 最后写上函数体代码。

可是因为匿名函数里面根本就没有给它起名字, 所以它的定义格式就只能写成 关键字加上参数和表达式这样的形式。正因为它的特点, 匿名函数又被大家叫做表达式, 而且它通常只包含一行简单的表达式内容。

  1. 表达式

这里的定义格式指的是, 用一个冒号来把两部分内容隔开, 在冒号的前面是必须得写上的关键字, 而在这个关键的参数列表中, 用的是args这样来表示, 至于后面的部分, 则是用特定的符号来对应那个表达式的意义。

为了让意思能够被理解, 所以把这个语法格式给转换成了普通的函数格式, 具体情况就像下面所呈现的这种一样:

brush:py; 复制代码
def fun_name(arg1,[arg2,arg3..]):

return expression

fun_name(arg1,arg2,arg3..)

很明显的话, 如果使用普通方法来对这个函数进行定义的话, 那么是需要用到 3 行代码的, 而如果使用 表达式来进行定义的话, 则是仅仅需要 1 行即可完成的。

举个例子:

brush:py; 复制代码
def square(x):

return x ** 2

print(square(5))

此处只是为了举例,平常不建议这样将lambda表达式赋值给变量

a = lambda x: x ** 2

print(a(5))

运行结果

25

25

  1. 表达式的用途

这个表达式它只是简简单单地只存在着一行代码, 跟那些正式的函数进行比较的话吧, 它会有一些好处优势。

关于表达式这种内容的具体的使用方式, 到底都有哪一些呢:

1.先进行排序, 然后结合用括号包括起来的sort方法, 以及sort方法来进行使用。

brush:py; 复制代码
# 方式1

list1 = 1, 2, 6, 9, 3, 5, 4, 0

list1.sort(key=lambda x: x)

lambda x: x中第一个x为参数,此时是list1中的每个元素,第二个x是表达式,此时也表示list1中的每个元素

通过在第二行打断点,然后调试运行,会发现表达式x,会被依次赋值为列表

list1中的每个值

print(list1)

方式2

list2 中记录名字和他的年龄

list2 = \['小明', 23, '大美', 22, '小帅', 18, '张三', 24]

list3 = sorted(list2, key=lambda x: x1)

lambda x: x1中第一个x为参数,此时是list2中的每个元素,此时是列表,

即''小明', 23';第二个x1是表达式,此时表示列表中第二个值,即23

表示按照每个人的年龄排序

print(list3)

方式3

list4 = '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'

t = '3', '3', '4', '6', '5', '8', '7', '10', '10', 'K', 'A', 'J', 'Q'

t.sort(key=lambda x: list4.index(x))

lambda x: list4.index(x)中第一个x为参数,此时是t中的每个元素

list4.index(x)是表达式,表示x在list4中的索引值,表示按照索引值大小排序

print(t)

输出结果:

0, 1, 2, 3, 4, 5, 6, 9

那个名叫'小帅'的人, 他的年龄是18。

'大美', 22

那个人的名字叫做小明, 然后他的年龄是23岁。

这里提到的人叫做张三, 他的年龄是24岁。

将字符串"3"加入, 再将字符串"3"加入, 接着把字符串"4"加进去, 随后让字符串"5"出现, 然后把字符串"6"放进去, 紧接着让数值"7"登场, 接下来再把字符串"8"加上, 之后又往里面放入两个值为"10"的条目, 最后依次呈现字母"J"、字母"Q"、字母"K", 以及"A"。

2.你可以把max函数和min函数放在一起, 结合在一起使用的。

brush:py; 复制代码
list2 = [['小明', 23], ['大美', 22], ['小帅', 18], ['张三', 24]]

list5 = 2, 10, 4, 3, 1, 2, 6, 8, 7

res = max(list5, key=lambda x: x)

print(res)

name_age = min(list2, key=lambda x: x1)

print(name_age)

输出结果:

10

那个名叫'小帅'的人, 他的年龄是18。

3.把map()函数这个东西拿过来, 和它结合在一起用。

brush:py; 复制代码
# ===========一般写法:===========

1、计算平方数

list6 = 2,3,6,1,5

def square(x):

return x ** 2

s = list(map(square, list6)) # 计算列表各个元素的平方

print(s)

===========匿名函数写法:============

2、计算平方数,lambda 写法

s1 = list(map(lambda x: x ** 2, list6))

print(s1)

3、提供两个列表,将其相同索引位置的列表元素进行相加

list7 = 1,2,34,6

s2 = list(map(lambda x, y: x + y, list7, list6))

print(s2)

输出结果:

4, 9, 36, 1, 25

4, 9, 36, 1, 25

3, 5, 40, 7

4.结合()使用

这个函数, 它是被放在那个里面的一个内置的函数, 它的具体作用, 是用来去做那个可迭代对象的累积结果的计算的。

函数的用法和示例:

4b

da

输出结果:

28

140

120

5.结合()使用

这个函数呢, 它是用来干过滤序列这档子事的, 具体操作就是把那些不符合要求的那些元素, 给它筛选掉。

10

2a

输出结果:

2, 4, 6, 8

心得:

1.这个表达的含义是直接给它对应的变量的话, 就能得到赋值的效果。

2.表达式是可以结合着函数来使用的, 如果这个函数里面带有了参数 key 或者类似的参数,比方说 sort() 函数、min() 函数、max() 函数、map() 函数等等这些情况。

总结

以上这些内容纯属个人的经验之谈, 目的就是想给大伙提供一个参考意见, 同时也恳请大家能多多予以支持下脚本之家。

相关推荐
j7~2 个月前
【C++11】C++11 新特性全套详解(列表初始化、右值引用、lambda 表达式、function 与 bind 包装器等)
c++·右值引用·lambda表达式·可变参数模板·移动语义·包装器·c++11发展史
Irissgwe5 个月前
c++11(lambda表达式与包装器、线程库)
c++·c++11·lambda表达式·线程库·包装器·互斥量库·条件变量库
ComputerInBook5 个月前
C++ 中的 lambda 表达式
开发语言·c++·lambda表达式·匿名函数
howard20055 个月前
1.7.2 掌握Scala函数 - Scala函数种类
高阶函数·匿名函数·成员方法·scala函数·局部函数
来自远方的老作者6 个月前
第9章 函数-9.9 函数式编程
python·函数·回调函数·lambda表达式·函数闭包·偏函数·函数装饰器
知无不研9 个月前
lambda表达式的原理和由来
java·开发语言·c++·lambda表达式
SunkingYang9 个月前
QT中使用Lambda表达式作为槽函数用法,以及捕获列表和参数列表用法与区别
c++·qt·用法·lambda表达式·捕获列表·槽函数·参数列表
SunkingYang9 个月前
QT编译报错:使用Lambda表达式作为槽函数,报错‘xxx‘ in capture list does not name a variable
qt·list·报错·lambda表达式·槽函数·in capture list·does not name
kong790692810 个月前
Java基础-Lambda表达式、Java链式编程
java·开发语言·lambda表达式