(一)铺垫
------------------------------原始做法-------------------------------
# 求两个数的中的最大的值
def func(x, y):
if x < y:
return y
else:
return x
ret = func(30, 20)
print(ret) # 30
-----------------------------匿名函数做法--------------------------------
func = lambda x, y: y if x < y else x
# # 注意if和else 没有 : 不能换行,if判断体写在判断条件前面
ret = func(11, 2)
print(ret) # 11
(二) 使用 max函数求字典的最大值
1.先看一个简单的,我起初认为,打印的值应该是100,121,144中最大的144,然而是根据这几个数,比较大小后,输出了原数据12。
num = [10, 11, 12]
print(max(num, key=lambda i: i * i)) # 12
2.开始看题了
原理:默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values()。
max函数要求第一个参数是可迭代内容,这里我们的dic默认迭代key,第二个参数是一个函数,对迭代的每一项进行处理,将处理
后的结果统一起来进行比较大小,返回大的一项的原数据,看下图:
下面这个就是经x处理,也就是没处理罢了,依次迭代k1, k2, k3得k3最大,返回k3
dic = {'k1': 10, 'k2': 200, 'k3': 20}
ret = max(dic, key=lambda x: x)
print(ret) # k3
再看复杂一点的,代码下面是分析:
lst = [
{'name': 'egon', 'price': 100},
{'name': 'rdw', 'price': 666},
{'name': 'zat', 'price': 1}
]
ret = max(lst, key=lambda dic: dic['price']) # 指定比较内容
print(ret) # {'price': 666, 'name': 'rdw'}
分析:
(1)先取{'name': 'egon', 'price': 100},以{'name': 'egon', 'price': 100}为参传入匿名函数作为dic,
经dic['price']处理得100,
(2)再取{'name': 'rdw', 'price': 666},以{'name': 'rdw', 'price': 666}为参传入匿名函数作为dic,
经dic['price']处理得666,
(3)最后取{'name': 'zat', 'price': 1},以{'name': 'zat', 'price': 1}为参传入匿名函数作为dic,
经dic['price']处理得1
(4)集中比较100,666,1得666最大,返回666对应的参数dic,即{'name': 'rdw', 'price': 666}。
(5)因为返回是字典,所以可能乱序,即上面结果{'price': 666, 'name': 'rdw'}
总结与发现:
不论匿名函数怎么处理参数,返回的不是处理后的结果,而是结果对应的参数本身。下面这些图的红圈圈才是返回的东西。