lambda

很多语言都有匿名函数,python的匿名函数写作lambda,当需要实现一定功能而又不想定义一个函数时,lambda就是最好的选择

lambda x: x * 2

也可以将它赋值给一个变量,后续程序中就可以用该变量调用这个匿名函数

f = lambda x: x * 2
f(2)  # 4

当然,这里其实没必要应用lambda来实现,因为既然要显式调用,还不如干脆直接写个明确的函数罢了。lambda函数更广泛的应用场景在于该匿名函数作为另一个函数的参数传递时,应用就比较合适了,例如,将lambda作为sort()函数的key参数,就可以实现特定功能的排序

data = {"a": 2, "b": 1, "c": 3}
sorted(data.items(), key = lambda x: x[1])
# [("b", 1), ("a", 2), ("c", 3)]

data = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
sorted(data, key = lambda x: x["age"])  # 按年龄排序
# [{'age': 10, 'name': 'Bart'}, {'age': 39, 'name': 'Homer'}]

zip

zip函数人如其名,是打包或者解包的函数,接受2个以上可迭代变量,输出对应位置组成元组后的迭代类型

a = ["a", "b"]
b = [1, 2]
zip(a, b)  # <zip object at 0x106026048>
list(zip(a, b))  # [('a', 1), ('b', 2)]

如果各迭代变量长度不一致也不会报错,只是此时返回迭代变量取决于输入总长度最短的一个

a = ["a", "b", "c", "d"]
b = [1, 2, 3]
c = [4, 5]
list(zip(a, b))  # [('a', 1, 4), ('b', 2, 5)]

map

map函数也正如其取名一样,是一个将接受的迭代变量依次经过某种映射,并输出映射后的迭代变量

将列表中的每个元素转为字符串

a = [1, 2, 3]
map(str, a)  # <map object at 0x1021ac7f0>
list(map(str, a))  # ['1', '2', '3']

当第一个函数的参数是是一个多变量函数时,map也可以接受更多的参数

a = [1, 2, 3]
b = [1, 2, 3]
list(map(lambda x, y: x * y, a, b))  # [1, 4, 9]

zip函数中类似,当map里的函数参数长度不匹配时并不会报错,只是输出结果将由最短的决定

a = [1, 2, 3]
b = [1, 2]
list(map(lambda x, y: x * y, a, b))  # [1, 4]

filter

map函数类似,filter函数也接受一个函数及其变量作为参数,只是要求这个函数的返回结果是bool型,并用这个bool的结果决定输出的取舍问题

例如需要对一个输入列表过滤,要求保留2的倍数:

a = [1, 2, 3]
list(filter(lambda x: x % 2 == 0, a))  # [2]

reduce

mapfilter函数都是多入多出型,实质上是完成了特定的变换或筛选。reduce则是归约函数,将一系列输入变量经过特定的函数后转化为一个结果输出

from functools import reduce

a = [1, 2, 3]
reduce(lambda x, y: x + y, a)  # 6

reduce函数还可以接受一个可选的初始值作为参数

from functools import reduce

s = "abcdefg"
reduce(lambda x, y: y + x, s, "AB")  # gfedcbaAB

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://www.ltfred.com/article/python-function/