Python--lambda表达式

lambda表达式就是一种函数,可以说是匿名函数。

格式:

lambda 参数1,参数2..参数n:表达式

例子:

fun1 = lambda a, b: a * b
fun2 = lambda *args: args[0]
fun3 = lambda a: a + 1 if a % 2 == 0 else a - 1
fun4 = lambda x, y: print("这里:{}".format(x + y))
print(fun1(3, 4))
print(fun2(5, 4, 3))
print(fun3(5))
print(fun4(5, 9))
'''
输出:
12
5
4
这里:14
None
'''
  1. 观察以上几个表达式可以发现,如果把lambda表达式传给一个变量,那么这变量就变成了函数名,实际上就是变量得到了函数的地址,从而可以调用函数。
  2. 可以发现,表达式的值就是lambda表达式的返回值,如果表达式没有返回值,那么返回的就是None。
  3. lambda表达式也可以实现多参数传递和关键字参数传递,同时表达式还可以写三元运算

作用:

这么一个稀奇古怪的玩意,自然有它自己的作用,最大的一个作用就是当做参数来传递。
比如:

def fun(x: int, f):
    return f(x) * 4 + pow(f(x), 4)


print(fun(4, lambda x: x * x))

这样可以快速的把一个简单的函数当参数传递,不需要题意写一个很长的函数

可能你觉着这没啥鸟用,那么下面这几个可能就比较有用了

map:

map可以以一定规则对一些数据做映射,用法是
map(规则,可迭代的数据)
拿列表举例:

lst = ['146', '4258', '23333']
mp = map(int, lst)
print(list(mp))
'''
输出:
[146, 4258, 23333]
'''

可以发现,map把整个列表的元素按照左边的规则(即转int)全部做了一次。

此时就可以想到了,左边的这个规则,可以是一个函数,那么lambda表达式就可以排上用场了

lst = [1256, 555, 999]
mp = map(lambda x: x - 700, lst)
print(list(mp))
'''
输出:
[556, -145, 299]
'''

如果换以前的操作,则需要全遍历一次所有的元素,非常麻烦

reduce

首先reduce在functools里,所以需要导入
reduce函数的格式依然是:
reduce(规则, 可迭代的数据)规则的函数要有两个参数
看下面的例子

import functools as ftl
lst = [5, 6, 8, 7, 9]
result = ftl.reduce(lambda x, y: x + y, lst)
print(result)
'''
输出:
35
'''

这个例子可能有点匪夷所思。直观上来看就是把列表的元素直接进行了求和。

实际上快对了,reduce操作可以这么去看,第一次:
x = 5, y = 6
return 5 + 6
第二次:
x = 5 + 6, y = 8
return 5 + 6 + 8
第三次:
x = 5 + 6 + 8, y = 7
return 5 + 6 + 7 + 8

就是这么一个流程,就是上一次的返回结果当做下一次的第一个参数,第二个参数就往后取。

sorted

先看一下sorted本身的作用:

lst = [5, 6, 7, 5, 1]
lst2 = ['abc', 'cca', 'acd']
print(sorted(lst))
print(sorted(lst2))
'''
输出:
[1, 5, 5, 6, 7]
['abc', 'acd', 'cca']
'''

是的,sorted可以进行排序,数字默认是从小到大,字符默认是字典顺序

但是如果我们相对针对某些特殊的数据进行排序呢?
比如:我们希望以k为排序依据对下面的列表进行排序

lst = [{
    
    'k': 41, 'f': 11}, {
    
    'k': 14, 'f': 18}, {
    
    'k': 8, 'f': 77}]

此时就需要sorted的另一个参数了,即key参数,和前面一样,key参数接收的是排序规则,这里的规则可以是指定的某一类值,比如指定 ‘k’

lst = [{
    
    'k': 41, 'f': 11}, {
    
    'k': 14, 'f': 18}, {
    
    'k': 8, 'f': 77}]
print(sorted(lst, key=lambda a: a['k']))
'''
输出:
[{'k': 8, 'f': 77}, {'k': 14, 'f': 18}, {'k': 41, 'f': 11}]
'''

这里可能说的不清楚,这个kay里的函数可以接收一个参数,这个参数里会传列表里的每个元素(在这里就是字典)而你要做的就是对于每个参数你要指出要根据什么进行排序。这里指出的就是字典里的’k’对应的值为排序依据进行排序

这样的排序可能还是不能满足需求,比如假设我想根据某些数对3的余数的大小进行排序,那该怎么办?
那么此时就需要用到functools里的cmp_to_key了。
如果学过C++等其他排序一定会知道有一种自定义排序,Py同样也支持
通过使用上面的函数就可以编写规则,任意进行排序了
(这里就不在说Py的排序了,毕竟主要是讲lambda表达式)

import functools as ftl
lst = [5, 6, 3, 8]
print(sorted(lst, key=ftl.cmp_to_key(lambda x, y: -1 if x % 3 > y % 3 else 1)))

猜你喜欢

转载自blog.csdn.net/qq_36102055/article/details/107190513