目录

一,总览

二,示例

示例1 lambda x:x[0]:

示例2 lambda x:(abs(x),x):

示例3 filter(lambda x:(x%2 == 1),L)  map(lambda x:x**2,L):

示例4 def与lambda

三,回顾



一,总览

本文通过罗列范例,包括题目要求,输入,代码,解释,输出来解释lambda,代码中也会有具体注释:

首先文字介绍下lambda:

        1,lambda一般用来定义简单的函数,而def可以定义复杂的函数

        2,lambda函数的函数体只是一个表达式

        3,lambda函数是一种匿名函数

        4,lambda函数可以接受任意数量的参数,但只能包含一个表达式

        5,lambda函数用于定义简单的、能够在一行内表示的函数

(熟练的直接看代码和输出,新手多看看注释和分析)

二,示例

示例1 lambda x:x[0]:

要求:

        已知两个二维列表
        第一个列表的元素是元组,按第 2 个元素的值从小到大排序输出,输出前 m 项
        第二个列表的元素是列表,按其每个元素第 1 个元素的值从小到大排序,输出前 n 项
        再按第二个列表每个元素第 3 个元素的值从小到大排序,输出前 n 项

输入:

        2

        3

代码:

#已知两个二维列表
#第一个列表的元素是元组,按第 2 个元素的值从小到大排序输出,输出前 m 项
#第二个列表的元素是列表,按其每个元素第 1 个元素的值从小到大排序,输出前 n 项
#再按第二个列表每个元素第 3 个元素的值从小到大排序,输出前 n 项
list1 = [('dungeon',7),('winterfell',4),('bran',9),('meelo',6)]
list2 = [[ 'Angle', '0121701100106',99], [ 'Jack', '0121701100107',86], [ 'Tom', '0121701100109',65], [ 'Smith', '0121701100111', 100], ['Bob', '0121701100115',77], ['Lily', '0121701100117', 59]]
m = int(input())
n = int(input())
#list1.sort(key = lambda x:x[1],reverse = False) 和下面一行等价
List1 = sorted(list1,key = lambda x:x[1],reverse = False)#按第2个元素的值正序排列
List2 = sorted(list2,key = lambda x:x[0],reverse = False)#按第1个元素的值正序排列
List3 = sorted(list2,key = lambda x:x[2],reverse = False)#按第3个元素的值正序排列
#print(list1[:m]) 和下面一行等价
print(List1[:m])
print(List2[:n])
print(List3[:n])

输出:

[('winterfell', 4), ('meelo', 6)]
[['Angle', '0121701100106', 99], ['Bob', '0121701100115', 77], ['Jack', '0121701100107', 86]]
[['Lily', '0121701100117', 59], ['Tom', '0121701100109', 65], ['Bob', '0121701100115', 77]]

 解释:

sorted(list1, key

        或者list1.sort(key

        其中.sort()对列表排序后返回None,不可直接打印list1.sort(),而sorted()可以直接打印

        本题lambda中参数为x,表达式为x[1], x[0], x[2],表达式起到了函数的作用

再次强调!!!sorted()不改变原列表,所以必须用变量保存排序后的列表;

而.sort()直接改变原列表,且返回None,所以禁止用变量保存!!!

     2022/12/7补充:刚又做了下示例1,又犯了这里的错误, 


     List1 = list1.sort(key = lambda x:x[1]), print(List1)

     结果报错:

TypeError: 'NoneType' object is not subscriptable

     所以需要对一个原列表进行多次修改,最好用sorted(),这样不会改变它

而.sort()直接改变原列表,且返回值为None,即没有返回值

补充:.sort()可以有key参数,也可以有reverse参数,也可以没有参数

但只要带参数,前面的key和reverse不能少
sorted()必须要有序列,即sorted(List),剩下两参数同.sorted

示例2 lambda x:(abs(x),x):

lambda简单运用

看代码:

a = lambda x:x+1
b = lambda x:(abs(x))
c = lambda x:x%2
d = lambda x,y:x*y
print(a(6),b(-9),c(65),d(2,6),end=' ')
print()

list1 = [-5,26,3,7,5,12,9,-3.3,666,3.3]
list1.sort(key = lambda x:(abs(x),x),reverse = False)
#上面先按绝对值(第一关键词)从小到大排列,绝对值相同则先输出负数(第二关键词,即本身更小的)
print(list1)

输出:

7 9 1 12 
[3, -3.3, 3.3, -5, 5, 7, 9, 12, 26, 666]

示例3 filter(lambda x:(x%2 == 1),L) map(lambda x:x**2,L):

lambda结合map(),filter()

代码1:map()结合lambda的简单例子

list2 = [38,129,9,2,6,0,34,17,68,18,22,96,69]
list3 = list(map((lambda x:x%2),list2))#map(函数,序列), 可使用list()转换为列表
list4 = list(map((lambda x:x**2),list2))
print(list3)
print(list4)

输出:

[0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]
[1444, 16641, 81, 4, 36, 0, 1156, 289, 4624, 324, 484, 9216, 4761]

代码2:map(),filter()关于lambda对比

#lambda与map(),filter()结合的区别分析
#filter()是过滤器,map()是映射
#情况1:没有逻辑判断
#filter(函数,序列),可使用list()转列表
L = [5,10,100,1001,27,31,42,39,66,3,6,7]
L1 = list(filter(lambda x:x**2,L))#filter()返还列表元素
L2 = list(map(lambda x:x**2,L))#map()返还列表元素计算结果
print(L1)
print(L2)

#情况2:有逻辑判断
L3 = filter(lambda x:(x%2 == 1),L)#filter()筛选符合lambda表达式的列表元素
L4 = map(lambda x:(x%2 == 1),L)#map()对列表元素是否满足lambda进行判断,输出False,True
print(list(L3))
print(list(L4))

输出:

[5, 10, 100, 1001, 27, 31, 42, 39, 66, 3, 6, 7]
[25, 100, 10000, 1002001, 729, 961, 1764, 1521, 4356, 9, 36, 49]
[5, 1001, 27, 31, 39, 3, 7]
[True, False, False, True, True, True, False, True, False, True, False, True]

总结:map(lambda())返回计算结果,filter(lambda())

示例4 def与lambda

lambda与函数定义的区别

代码:

def a(x):
    return x+1
print(a(1))

b = lambda x:x+1
print(b(1))

输出:

2
2

lambda函数与定义函数等价,但是lambda更简洁,而函数定义更直观,便于理解

三,回顾

起因:

10天后当我复习这篇博客时,想用map实现示例1的结果,“按列表中第几个元素的值排列”,结果不行

看代码:

list1 = [('dungeon',7),('winterfell',4),('bran',9),('meelo',6)]
list2 = [[ 'Angle', '0121701100106',99], [ 'Jack', '0121701100107',86], [ 'Tom', '0121701100109',65], [ 'Smith', '0121701100111', 100], ['Bob', '0121701100115',77], ['Lily', '0121701100117', 59]]

List1 = list(map(lambda x:x[1], list1))
List2 = list(map(lambda x:x[0], list2))
List3 = list(map(lambda x:x[2], list2))

print(List1)
print(List2)
print(List3)

输出:

[7, 4, 9, 6]
['Angle', 'Jack', 'Tom', 'Smith', 'Bob', 'Lily']
[99, 86, 65, 100, 77, 59]

解释:

按照对map的理解,map(函数,序列),返回结算结果,map(lambda x:x[1], list1)的意思是,将x[1] * 1作为结果返回,结果就是按原来顺序返回第二个元素。

易错点:lambda x:表达式,map(函数,list),filter(函数,list),sorted(list, key = , reverse = ),list.sort(key = , reverse = ),注意list前后位置的区别