概述
函数式编程并非函数编程那么简单,而是将计算机的运算视为数学上的运算,比起面向过程,函数式编程更注重的是执行结果而非执行的过程。python并非一门函数式编程语言,但仍有很多函数式编程的特性,如lambda、map、reduce、filter
lambda
语法格式:
# 有名的函数 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)
sorted
排序
salaries = { 'wx': 1000, 'bob': 2000, 'marry': 3000 } res = sorted(salaries, key=lambda k: salaries[k])
'''
通过lambda,将salaries传过来的k的值取出来,然后给sorted排序,然后输入排序后的结果
''' print(res)
map
映射
通过列表生成式
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)
filter
过滤
# 过滤以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__())
reduce
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.