函数式编程并非函数编程那么简单,而是将计算机的运算视为数学上的运算,比起面向过程,函数式编程更注重的是执行结果而非执行的过程。python并非一门函数式编程语言,但仍有很多函数式编程的特性,如lambda、map、reduce、filter
语法格式:
# 有名的函数 def func(x,y): return x+y # 返回两数之和 # 匿名函数,参数不需要加括号,返回不需要return,默认带了return # 第一种写法 res = lambda x,y:x+y # res即指向该匿名函数的内存地址 print(res(1,2)) # 加括号调用,并传入参数 # 第二种写法 res = (lambda x,y:x+y)(1,2) # 直接传入参数 print(res)
取薪资最高的名字
传统方式
def func(k): return salaries[k] salaries = { 'wx': 1000, 'bob': 2000, 'marry': 3000 } res = max(salaries, key=func) print(res) # max的工作流程 ''' max迭代传入的salaries,得到一个个的k,也就是名字,然后将名字传给key,即key=func(k),拿到value key=func不需要收到传参,会自动从前面的迭代的salaries传入 首先迭代wx,将名字传给func,得到薪资,再迭代bob,将k传给func,得到薪资。。。 然后进行比较,得到最大值 min也是类似的 '''
使用lambda
salaries = { 'wx': 1000, 'bob': 2000, 'marry': 3000 }
res = max(salaries, key=lambda k: salaries[k])
# res = max(salaries, key=func) # 对比着看,lambda那部分就是key=func,不过传统方式,函数单独写了
print(res)
排序
salaries = { 'wx': 1000, 'bob': 2000, 'marry': 3000 } res = sorted(salaries, key=lambda k: salaries[k]) ''' 通过lambda,将salaries传过来的k的值取出来,然后给sorted排序,然后输入排序后的结果 ''' print(res)
映射
通过列表生成式
lst = ['hushow', 'bob', 'marry'] res = [name + '_dsb' for name in lst] # 得到的结果是一个列表生成式对象 for i in res: # 循环取值 print(i)
通过map+lambda
# map+lambda实现 lst = ['hushow', 'bob', 'marry'] res = map(lambda name: name + '_dsb', lst) # 迭代列表l(相当于 for name in l),将迭代的值给name,传给lambda,然后返回 print(res.__next__()) for i in res: print(i)
过滤
# 过滤以sb结尾的 # 以生成器生成式实现 l = ['hushow', 'bob_sb', 'marry_sb', 'lxx'] res = (name for name in l if name.endswith('sb')) print(res.__next__()) print(res.__next__())
使用filter+lambda
# 以filter实现 l = ['hushow', 'bob_sb', 'marry_sb', 'lxx'] res = filter(lambda name: name.endswith('sb'), l) # 相当于 res = filter(lambda name:(return) name.endswith('sb'),l),加了省略了return print(res.__next__()) print(res.__next__()) # 迭代列表l(相当于for name in l),每次将迭代的值传给name,判断是否以sb结尾,不需要if # 判断的结果两种,True和False,filter默认留下True的结果print(res.__next__())
from functools import reduce res = reduce(lambda x, y: x + y, [1, 2, 3], 10) # 指定初始值10 print(res) # 16,累加 res = reduce(lambda x, y: x + y, ['a', 'v', 'b'], 'hello') print(res) # helloavb
END.